diff --git a/DungeonShooting_Godot/scene/test/TestCommpont.tscn b/DungeonShooting_Godot/scene/test/TestCommpont.tscn
deleted file mode 100644
index 8594977..0000000
--- a/DungeonShooting_Godot/scene/test/TestCommpont.tscn
+++ /dev/null
@@ -1,10 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://chgfadxc8pqr4"]
-
-[ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="1"]
-
-[node name="Node2D" type="Node2D"]
-
-[node name="Sprite2D" type="Sprite2D" parent="."]
-position = Vector2(200, 102)
-scale = Vector2(0.3, 0.3)
-texture = ExtResource("1")
diff --git a/DungeonShooting_Godot/scene/test/TestExpression.tscn b/DungeonShooting_Godot/scene/test/TestExpression.tscn
deleted file mode 100644
index 13731e2..0000000
--- a/DungeonShooting_Godot/scene/test/TestExpression.tscn
+++ /dev/null
@@ -1,9 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://blp7bo6tyoqlr"]
-
-[ext_resource type="Script" path="res://src/test/TestExpression.cs" id="1_qmchi"]
-
-[node name="TestExpression" type="Node2D"]
-script = ExtResource("1_qmchi")
-Str = "0003;
-0001(w:100,ca:15,ra:30);
-0002(w:120,ca:10,ra:20);"
diff --git a/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn b/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn
deleted file mode 100644
index 2b694f5..0000000
--- a/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn
+++ /dev/null
@@ -1,46 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://5bbx1u0od3jm"]
-
-[ext_resource type="Script" path="res://src/test/TestGenerateDungeon.cs" id="1"]
-[ext_resource type="Texture2D" uid="uid://dj8nrd5od4fcl" path="res://resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png" id="2"]
-
-
-
-[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_rvg0t"]
-texture = ExtResource("2")
-margins = Vector2i(0, 128)
-0:0/next_alternative_id = 8
-0:0/0 = 0
-0:0/1 = 1
-0:0/1/flip_h = true
-0:0/2 = 2
-0:0/2/flip_v = true
-0:0/3 = 3
-0:0/3/flip_h = true
-0:0/3/flip_v = true
-0:0/4 = 4
-0:0/4/transpose = true
-0:0/5 = 5
-0:0/5/flip_h = true
-0:0/5/transpose = true
-0:0/6 = 6
-0:0/6/flip_v = true
-0:0/6/transpose = true
-0:0/7 = 7
-0:0/7/flip_h = true
-0:0/7/flip_v = true
-0:0/7/transpose = true
-
-[sub_resource type="TileSet" id="1"]
-sources/0 = SubResource("TileSetAtlasSource_rvg0t")
-
-[node name="TestGenerateDungeon" type="Node2D"]
-script = ExtResource("1")
-TileMapPath = NodePath("TileMap")
-Camera3D = NodePath("Camera2D")
-
-[node name="Camera2D" type="Camera2D" parent="."]
-
-[node name="TileMap" type="TileMap" parent="."]
-z_index = -1
-tile_set = SubResource("1")
-format = 2
diff --git a/DungeonShooting_Godot/scene/test/TestGridData.tscn b/DungeonShooting_Godot/scene/test/TestGridData.tscn
new file mode 100644
index 0000000..9f00647
--- /dev/null
+++ b/DungeonShooting_Godot/scene/test/TestGridData.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://b4lwq3384y6c1"]
+
+[ext_resource type="Script" path="res://src/test/TestGridData.cs" id="1_jtgxu"]
+
+[node name="TestGridData" type="Node2D"]
+script = ExtResource("1_jtgxu")
diff --git a/DungeonShooting_Godot/scene/test/TestReadExcel.tscn b/DungeonShooting_Godot/scene/test/TestReadExcel.tscn
deleted file mode 100644
index 1ab48cd..0000000
--- a/DungeonShooting_Godot/scene/test/TestReadExcel.tscn
+++ /dev/null
@@ -1,6 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://deq562id5sngp"]
-
-[ext_resource type="Script" path="res://src/test/TestReadExcel.cs" id="1_y8vrr"]
-
-[node name="TestReadExcel" type="Node2D"]
-script = ExtResource("1_y8vrr")
diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs
index 84e66ad..d7c6b33 100644
--- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs
+++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs
@@ -53,7 +53,7 @@
_initSize = rect2.Size;
RoomInfo = roomInfo;
- SpriteRoot = new AffiliationSpriteRoot();
+ SpriteRoot = new AffiliationSpriteRoot(this);
SpriteRoot.Name = "SpriteRoot";
World.Current.StaticSpriteRoot.AddChild(SpriteRoot);
diff --git a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs b/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs
index 3bd407a..fe1ae47 100644
--- a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs
+++ b/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs
@@ -2,11 +2,26 @@
using System.Collections.Generic;
using Godot;
+///
+/// AffiliationArea 中用于存放静态Sprite的功能类
+///
public partial class AffiliationSpriteRoot : Node2D, IDestroy
{
+ private class SpriteData
+ {
+ public Vector2 Position;
+ public FreezeSprite FreezeSprite;
+ }
+
public bool IsDestroyed { get; private set; }
+
+ private readonly Grid> _grid = new Grid>();
+ private readonly AffiliationArea _affiliationArea;
- private HashSet _freezeSprites = new HashSet();
+ public AffiliationSpriteRoot(AffiliationArea affiliationArea)
+ {
+ _affiliationArea = affiliationArea;
+ }
public void Destroy()
{
@@ -17,21 +32,37 @@
IsDestroyed = true;
- foreach (var freezeSprite in _freezeSprites)
+ _grid.ForEach((x, y, data) =>
{
- freezeSprite.Destroy();
- }
- _freezeSprites.Clear();
+ foreach (var spriteData in data)
+ {
+ spriteData.FreezeSprite.Destroy();
+ }
+ data.Clear();
+ });
+ _grid.Clear();
QueueFree();
}
- public bool AddFreezeSprite(FreezeSprite freezeSprite)
+ ///
+ /// 添加静态精灵
+ ///
+ public void AddFreezeSprite(FreezeSprite freezeSprite)
{
- return _freezeSprites.Add(freezeSprite);
+
+ // var result = _freezeSprites.Add(freezeSprite);
+ // if (result)
+ // {
+ //
+ // }
+ // return result;
}
- public bool RemoveFreezeSprite(FreezeSprite freezeSprite)
+ ///
+ /// 移除静态精灵
+ ///
+ public void RemoveFreezeSprite(FreezeSprite freezeSprite)
{
- return _freezeSprites.Remove(freezeSprite);
+ //return _freezeSprites.Remove(freezeSprite);
}
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
index aa36b94..582f1c6 100644
--- a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
+++ b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
@@ -36,6 +36,9 @@
_shadowParent = ao.ShadowSprite.GetParent();
}
+ ///
+ /// 冻结精灵,这样 ActivityObject 多余的节点就会被移出场景树,逻辑也会被暂停,从而优化性能
+ ///
public void Freeze()
{
if (IsFrozen)
@@ -49,21 +52,22 @@
Debug.LogError("物体的 AffiliationArea 属性为空,不能调用 Freeze() 函数!");
return;
}
-
+
IsFrozen = true;
-
- if (affiliationArea.SpriteRoot.AddFreezeSprite(this))
- {
- _spriteIndex = ActivityObject.AnimatedSprite.GetIndex();
- _shadowIndex = ActivityObject.ShadowSprite.GetIndex();
- ActivityObject.ShadowSprite.Reparent(affiliationArea.SpriteRoot);
- ActivityObject.AnimatedSprite.Reparent(affiliationArea.SpriteRoot);
- _parent = ActivityObject.GetParent();
- _parent.RemoveChild(ActivityObject);
- }
+ Position = ActivityObject.Position;
+ affiliationArea.SpriteRoot.AddFreezeSprite(this);
+ _spriteIndex = ActivityObject.AnimatedSprite.GetIndex();
+ _shadowIndex = ActivityObject.ShadowSprite.GetIndex();
+ ActivityObject.ShadowSprite.Reparent(affiliationArea.SpriteRoot);
+ ActivityObject.AnimatedSprite.Reparent(affiliationArea.SpriteRoot);
+ _parent = ActivityObject.GetParent();
+ _parent.RemoveChild(ActivityObject);
}
+ ///
+ /// 解冻精灵,让 ActivityObject 恢复正常功能
+ ///
public void Unfreeze()
{
if (!IsFrozen)
@@ -72,26 +76,25 @@
}
IsFrozen = false;
-
- if (ActivityObject.AffiliationArea.SpriteRoot.AddFreezeSprite(this))
- {
- _parent.AddChild(ActivityObject);
- ActivityObject.ShadowSprite.Reparent(_shadowParent);
- ActivityObject.AnimatedSprite.Reparent(_spriteParent);
- if (_spriteIndex > _shadowIndex)
- {
- _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
- _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
- }
- else
- {
- _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
- _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
- }
+ ActivityObject.AffiliationArea.SpriteRoot.AddFreezeSprite(this);
+
+ _parent.AddChild(ActivityObject);
+ ActivityObject.ShadowSprite.Reparent(_shadowParent);
+ ActivityObject.AnimatedSprite.Reparent(_spriteParent);
+
+ if (_spriteIndex > _shadowIndex)
+ {
+ _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
+ _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
+ }
+ else
+ {
+ _spriteParent.MoveChild(ActivityObject.AnimatedSprite, _spriteIndex);
+ _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex);
}
}
-
+
public void Destroy()
{
diff --git a/DungeonShooting_Godot/src/test/TestGridData.cs b/DungeonShooting_Godot/src/test/TestGridData.cs
new file mode 100644
index 0000000..b7db7cb
--- /dev/null
+++ b/DungeonShooting_Godot/src/test/TestGridData.cs
@@ -0,0 +1,104 @@
+using Godot;
+using System;
+using System.Collections.Generic;
+
+public partial class TestGridData : Node2D
+{
+
+ public class TestGrid
+ {
+ public TestGrid(int width)
+ {
+ Width = width;
+ }
+
+ public int Width { get; }
+ private Dictionary _dictionary = new Dictionary();
+
+ public void Set(int x, int y, T data)
+ {
+ if (x <= Width)
+ {
+ _dictionary[y * Width + x] = data;
+ }
+ }
+
+ public T Get(int x, int y)
+ {
+ if (x <= Width && _dictionary.TryGetValue(y * Width + x, out var value))
+ {
+ return value;
+ }
+
+ return default;
+ }
+
+ public void ForEach(Action callback)
+ {
+ foreach (var keyValuePair in _dictionary)
+ {
+ var index = keyValuePair.Key;
+ callback(index % Width, index / Width, keyValuePair.Value);
+ }
+ }
+ }
+
+ public override void _Ready()
+ {
+ var time = DateTime.Now;
+ var testGrid = new TestGrid(100000);
+ for (int i = 0; i < 1000; i++)
+ {
+ for (int j = 0; j < 1000; j++)
+ {
+ testGrid.Set(i, j, i + j);
+ }
+ }
+ Debug.Log("TestGrid设置值用时: " + (DateTime.Now - time).Milliseconds);
+
+ time = DateTime.Now;
+ var testGrid2 = new Grid();
+ for (int i = 0; i < 1000; i++)
+ {
+ for (int j = 0; j < 1000; j++)
+ {
+ testGrid2.Set(i, j, i + j);
+ }
+ }
+ Debug.Log("Grid设置值用时: " + (DateTime.Now - time).Milliseconds);
+
+ time = DateTime.Now;
+ for (int i = 0; i < 1000; i++)
+ {
+ for (int j = 0; j < 1000; j++)
+ {
+ testGrid.Get(i, j);
+ }
+ }
+ Debug.Log("TestGrid取值用时: " + (DateTime.Now - time).Milliseconds);
+
+ time = DateTime.Now;
+ for (int i = 0; i < 1000; i++)
+ {
+ for (int j = 0; j < 1000; j++)
+ {
+ testGrid2.Get(i, j);
+ }
+ }
+ Debug.Log("Grid取值用时: " + (DateTime.Now - time).Milliseconds);
+
+ time = DateTime.Now;
+ testGrid.ForEach((i, i1, arg3) =>
+ {
+
+ });
+ Debug.Log("TestGrid遍历用时: " + (DateTime.Now - time).Milliseconds);
+
+ time = DateTime.Now;
+ testGrid2.ForEach((i, i1, arg3) =>
+ {
+
+ });
+ Debug.Log("Grid遍历用时: " + (DateTime.Now - time).Milliseconds);
+ }
+}