diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 3c999b4..432d6a1 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -1,5 +1,6 @@ using System; +using System.Collections; using System.Collections.Generic; using Godot; using Plugin; @@ -93,7 +94,10 @@ //标记字典 private Dictionary _signMap; - + + private List> _coroutineList; + + private static long _coroutineId = 0; private static long _index = 0; public ActivityObject(string scenePath) @@ -140,6 +144,7 @@ } MoveController = AddComponent(); + tempNode.QueueFree(); } /// @@ -611,6 +616,20 @@ } } + //协程更新 + if (_coroutineList != null) + { + var pairs = _coroutineList.ToArray(); + for (var i = 0; i < pairs.Length; i++) + { + var item = pairs[i]; + if (!item.Value.MoveNext()) + { + StopCoroutine(item.Key); + } + } + } + ProcessOver(newDelta); //调试绘制 @@ -930,6 +949,41 @@ _playHitSchedule = 0; } + public long StartCoroutine(IEnumerable able) + { + var id = _coroutineId++; + if (_coroutineList == null) + { + _coroutineList = new List>(); + } + _coroutineList.Add(new KeyValuePair(id, able.GetEnumerator())); + return id; + } + + public void StopCoroutine(long coroutineId) + { + if (_coroutineList != null) + { + for (var i = 0; i < _coroutineList.Count; i++) + { + var item = _coroutineList[i]; + if (item.Key == coroutineId) + { + _coroutineList.RemoveAt(i); + return; + } + } + } + } + + public void StopAllCoroutine() + { + if (_coroutineList != null) + { + _coroutineList.Clear(); + } + } + /// /// 通过 ItemId 实例化 ActivityObject 对象 /// diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs index 21b6d28..9708b91 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObjectTemplate.cs @@ -1,134 +1,131 @@ using Godot; -namespace Plugin +/// +/// ActivityObject 节点模板对象 +/// +[Tool] +public partial class ActivityObjectTemplate : Node { + // /// + // /// 默认放入的层级 + // /// + // [Export] public RoomLayerEnum DefaultLayer = RoomLayerEnum.NormalLayer; + /// - /// ActivityObject 节点模板对象 + /// 物体初始缩放 /// - [Tool] - public partial class ActivityObjectTemplate : Node + [Export] public Vector2 scale = Vector2.One; + + /// + /// 当前物体所属物理层 + /// + [Export(PropertyHint.Layers2DPhysics)] public uint collision_layer; + + /// + /// 当前物体扫描的物理层 + /// + [Export(PropertyHint.Layers2DPhysics)] public uint collision_mask; + + /// + /// 显示状态 + /// + [Export] public bool visible = true; + + /// + /// 当前物体渲染层级 + /// + [Export] public int z_index; + + public override void _Ready() { - // /// - // /// 默认放入的层级 - // /// - // [Export] public RoomLayerEnum DefaultLayer = RoomLayerEnum.NormalLayer; - - /// - /// 物体初始缩放 - /// - [Export] public Vector2 scale = Vector2.One; - - /// - /// 当前物体所属物理层 - /// - [Export(PropertyHint.Layers2DPhysics)] public uint collision_layer; - - /// - /// 当前物体扫描的物理层 - /// - [Export(PropertyHint.Layers2DPhysics)] public uint collision_mask; - - /// - /// 显示状态 - /// - [Export] public bool visible = true; - - /// - /// 当前物体渲染层级 - /// - [Export] public int z_index; - - public override void _Ready() - { #if TOOLS - // 在工具模式下创建的 template 节点自动创建对应的必要子节点 - if (Engine.IsEditorHint()) + // 在工具模式下创建的 template 节点自动创建对应的必要子节点 + if (Engine.IsEditorHint()) + { + var parent = GetParent(); + if (parent != null) { - var parent = GetParent(); - if (parent != null) + //寻找 owner + Node owner; + if (parent.Owner != null) { - //寻找 owner - Node owner; - if (parent.Owner != null) - { - owner = parent.Owner; - } - else if (Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) - { - owner = this; - } - else - { - owner = parent; - } + owner = parent.Owner; + } + else if (Plugin.Plugin.Instance.GetEditorInterface().GetEditedSceneRoot() == this) + { + owner = this; + } + else + { + owner = parent; + } - var sprite = GetNodeOrNull("ShadowSprite"); - //创建Shadow - if (sprite == null) - { - sprite = new Sprite2D(); - sprite.Name = "ShadowSprite"; - sprite.ZIndex = -1; - var material = - ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); - material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); - material.SetShaderParameter("schedule", 1); - sprite.Material = material; - AddChild(sprite); - sprite.Owner = owner; - } - else if (sprite.Material == null) - { - var material = - ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); - material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); - material.SetShaderParameter("schedule", 1); - sprite.Material = material; - } + var sprite = GetNodeOrNull("ShadowSprite"); + //创建Shadow + if (sprite == null) + { + sprite = new Sprite2D(); + sprite.Name = "ShadowSprite"; + sprite.ZIndex = -1; + var material = + ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); + material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); + material.SetShaderParameter("schedule", 1); + sprite.Material = material; + AddChild(sprite); + sprite.Owner = owner; + } + else if (sprite.Material == null) + { + var material = + ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); + material.SetShaderParameter("blend", new Color(0, 0, 0, 0.47058824F)); + material.SetShaderParameter("schedule", 1); + sprite.Material = material; + } - var animatedSprite = GetNodeOrNull("AnimatedSprite"); - //创建 Sprite2D - if (animatedSprite == null) - { - animatedSprite = new AnimatedSprite2D(); - animatedSprite.Name = "AnimatedSprite"; - var material = - ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); - material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); - material.SetShaderParameter("schedule", 0); - animatedSprite.Material = material; - AddChild(animatedSprite); - animatedSprite.Owner = owner; - } - else if (animatedSprite.Material == null) - { - var material = - ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); - material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); - material.SetShaderParameter("schedule", 0); - animatedSprite.Material = material; - } + var animatedSprite = GetNodeOrNull("AnimatedSprite"); + //创建 Sprite2D + if (animatedSprite == null) + { + animatedSprite = new AnimatedSprite2D(); + animatedSprite.Name = "AnimatedSprite"; + var material = + ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); + material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); + material.SetShaderParameter("schedule", 0); + animatedSprite.Material = material; + AddChild(animatedSprite); + animatedSprite.Owner = owner; + } + else if (animatedSprite.Material == null) + { + var material = + ResourceManager.Load(ResourcePath.resource_materlal_Blend_tres, false); + material.SetShaderParameter("blend", new Color(1, 1, 1, 1)); + material.SetShaderParameter("schedule", 0); + animatedSprite.Material = material; + } - //创建Collision - if (GetNodeOrNull("Collision") == null) - { - var co = new CollisionShape2D(); - co.Name = "Collision"; - AddChild(co); - co.Owner = owner; - } + //创建Collision + if (GetNodeOrNull("Collision") == null) + { + var co = new CollisionShape2D(); + co.Name = "Collision"; + AddChild(co); + co.Owner = owner; + } - //创建AnimationPlayer - if (GetNodeOrNull("AnimationPlayer") == null) - { - var ap = new AnimationPlayer(); - ap.Name = "AnimationPlayer"; - AddChild(ap); - ap.Owner = owner; - } + //创建AnimationPlayer + if (GetNodeOrNull("AnimationPlayer") == null) + { + var ap = new AnimationPlayer(); + ap.Name = "AnimationPlayer"; + AddChild(ap); + ap.Owner = owner; } } -#endif } +#endif } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/activity/Component.cs b/DungeonShooting_Godot/src/framework/activity/Component.cs index cf871a2..f96b8dd 100644 --- a/DungeonShooting_Godot/src/framework/activity/Component.cs +++ b/DungeonShooting_Godot/src/framework/activity/Component.cs @@ -192,7 +192,7 @@ } /// - /// 如果开启 debug, 则每帧调用该函数, 可用于绘制文字线段等, 需要调用 ActivityObject 身上的绘制函数 + /// 如果开启 debug, 则每帧调用该函数, 可用于绘制文字线段等, 需要调用 ActivityInstance 身上的绘制函数 /// public virtual void DebugDraw() {