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