diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn index 3da3053..fd8b964 100644 --- a/DungeonShooting_Godot/prefab/role/Role0001.tscn +++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn @@ -14,6 +14,7 @@ shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true [sub_resource type="ShaderMaterial" id="ShaderMaterial_8hgu2"] resource_local_to_scene = true @@ -24,6 +25,7 @@ shader_parameter/show_outline = true shader_parameter/outline_color = Color(0, 0, 0, 1) shader_parameter/outline_rainbow = false +shader_parameter/outline_use_blend = true [node name="Role0001" node_paths=PackedStringArray("HurtArea", "HurtCollision", "MountPoint", "BackMountPoint", "InteractiveArea", "InteractiveCollision", "MeleeAttackArea", "MeleeAttackCollision", "ShadowSprite", "AnimatedSprite", "Collision") instance=ExtResource("1_10c2n")] collision_layer = 8 diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index 9fe9c84..83159ea 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -21,8 +21,8 @@ [display] -window/size/viewport_width=1270 -window/size/viewport_height=720 +window/size/viewport_width=1920 +window/size/viewport_height=1080 window/stretch/aspect="keep_width" window/vsync/use_vsync=false diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs index 2bfe027..fde58e0 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs @@ -7,7 +7,7 @@ /// /// 摩擦力 /// - public float Friction { get; set; } = 120; + public float Friction { get; set; } = 140; /// /// 落地之后是否回弹 diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 74b925a..9d08aa8 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -314,6 +314,9 @@ //描边颜色 private bool _initOutlineColor = false; private Color _outlineColor = new Color(0, 0, 0, 1); + + //冻结显示的Sprite + private FreezeSprite _freezeSprite; //初始化节点 private void _InitNode(RegisterActivityData activityData, World world) @@ -1166,6 +1169,11 @@ QueueFree(); OnDestroy(); + if (_freezeSprite != null) + { + _freezeSprite.Destroy(); + } + var arr = _components.ToArray(); for (var i = 0; i < arr.Length; i++) { @@ -1460,21 +1468,21 @@ return _processingBecomesStaticImage; } - private ProxySprite _proxySprite; public void Freeze() { - if (_proxySprite == null) + if (_freezeSprite == null) { - _proxySprite = new ProxySprite(); + _freezeSprite = new FreezeSprite(this); } + _freezeSprite.Freeze(); } public void Unfreeze() { - if (_proxySprite == null) + if (_freezeSprite == null) { return; } - + _freezeSprite.Unfreeze(); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs b/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs index e13864c..3bd407a 100644 --- a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs +++ b/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs @@ -1,9 +1,13 @@ +using System.Collections.Generic; using Godot; public partial class AffiliationSpriteRoot : Node2D, IDestroy { public bool IsDestroyed { get; private set; } + + private HashSet _freezeSprites = new HashSet(); + public void Destroy() { if (IsDestroyed) @@ -12,6 +16,22 @@ } IsDestroyed = true; + + foreach (var freezeSprite in _freezeSprites) + { + freezeSprite.Destroy(); + } + _freezeSprites.Clear(); QueueFree(); } + + public bool AddFreezeSprite(FreezeSprite freezeSprite) + { + return _freezeSprites.Add(freezeSprite); + } + + public bool RemoveFreezeSprite(FreezeSprite 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 new file mode 100644 index 0000000..aa36b94 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs @@ -0,0 +1,109 @@ + +using Godot; + +/// +/// 用于绘制静止不动的 ActivityObject,从而优化性能 +/// +public class FreezeSprite : IDestroy +{ + public bool IsDestroyed { get; private set; } + + /// + /// 所在位置 + /// + public Vector2 Position { get; private set; } + + /// + /// 所属对象 + /// + public ActivityObject ActivityObject { get; } + + /// + /// 是否已经被冻结 + /// + public bool IsFrozen { get; private set; } + + private Node _spriteParent; + private int _spriteIndex; + private Node _shadowParent; + private int _shadowIndex; + private Node _parent; + + public FreezeSprite(ActivityObject ao) + { + ActivityObject = ao; + _spriteParent = ao.AnimatedSprite.GetParent(); + _shadowParent = ao.ShadowSprite.GetParent(); + } + + public void Freeze() + { + if (IsFrozen) + { + return; + } + + var affiliationArea = ActivityObject.AffiliationArea; + if (affiliationArea == null) + { + 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); + } + } + + public void Unfreeze() + { + if (!IsFrozen) + { + return; + } + + 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); + } + } + } + + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + if (IsFrozen) + { + ActivityObject.Destroy(); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/image/ProxySprite.cs b/DungeonShooting_Godot/src/framework/map/image/ProxySprite.cs deleted file mode 100644 index dc4449d..0000000 --- a/DungeonShooting_Godot/src/framework/map/image/ProxySprite.cs +++ /dev/null @@ -1,71 +0,0 @@ - -using Godot; - -public class ProxySprite : IDestroy -{ - public bool IsDestroyed { get; private set; } - public bool IsRecycled { get; set; } - public string Logotype => nameof(ProxySprite); - - public Vector2 Position { get; private set; } - public Sprite2D Sprite { get; } - public Sprite2D ShadowSprite { get; } - - private Node _root; - - public ProxySprite() - { - Sprite = new Sprite2D(); - ShadowSprite = new Sprite2D(); - ShadowSprite.Modulate = new Color(0, 0, 0, 0.471f); - } - - public void SetTexture(Node root, ActivityObject activityObject) - { - var animatedSprite = activityObject.AnimatedSprite; - SetTexture( - root, - activityObject.GetCurrentTexture(), - animatedSprite.GlobalPosition, - animatedSprite.GlobalRotation, - animatedSprite.GlobalScale, - activityObject.ShadowOffset - ); - } - - public void SetTexture(Node root, Texture2D texture, Vector2 position, float rotation, Vector2 scale, Vector2 shadowOffset) - { - Position = position; - Sprite.Position = position; - Sprite.Rotation = rotation; - Sprite.Scale = scale; - Sprite.Texture = texture; - - ShadowSprite.Position = position + shadowOffset; - ShadowSprite.Rotation = rotation; - ShadowSprite.Scale = scale; - ShadowSprite.Texture = texture; - - root.AddChild(ShadowSprite); - root.AddChild(Sprite); - } - - public void Destroy() - { - if (IsDestroyed) - { - return; - } - - IsDestroyed = true; - if (Sprite != null) - { - Sprite.QueueFree(); - } - - if (ShadowSprite != null) - { - ShadowSprite.QueueFree(); - } - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs index 71ded6a..f44c553 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs @@ -137,7 +137,7 @@ explode.Position = Position; explode.RotationDegrees = Utils.Random.RandomRangeInt(0, 360); explode.AddToActivityRoot(RoomLayerEnum.YSortLayer); - explode.Init(AttackLayer, 25, MinHarm, MaxHarm, 50, 250); + explode.Init(AttackLayer, 25, MinHarm, MaxHarm, 50, 150); explode.RunPlay(); } @@ -191,7 +191,7 @@ explode.Position = Position; explode.RotationDegrees = Utils.Random.RandomRangeInt(0, 360); explode.AddToActivityRootDeferred(RoomLayerEnum.YSortLayer); - explode.Init(AttackLayer, 25, MinHarm, MaxHarm, 50, 250); + explode.Init(AttackLayer, 25, MinHarm, MaxHarm, 50, 150); explode.RunPlay(); } diff --git a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs b/DungeonShooting_Godot/src/game/activity/shell/Shell.cs index 4c223d2..549fd3d 100644 --- a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs +++ b/DungeonShooting_Godot/src/game/activity/shell/Shell.cs @@ -18,9 +18,6 @@ if (AffiliationArea != null) { Freeze(); - // var proxySprite = ObjectManager.GetProxySprite(); - // proxySprite.SetTexture(AffiliationArea.SpriteRoot, this); - // this.CallDelay(0.1f, Destroy); } }