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); + } +}