diff --git a/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn b/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn
index be02a75..4461145 100644
--- a/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn
+++ b/DungeonShooting_Godot/prefab/effect/enemy/Effect0001.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=30 format=3 uid="uid://pr88a1phtxgb"]
+[gd_scene load_steps=31 format=3 uid="uid://pr88a1phtxgb"]
[ext_resource type="Script" path="res://src/game/effects/EnemyDebris.cs" id="1_ttosm"]
[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_h62s7"]
@@ -146,6 +146,9 @@
"speed": 5.0
}]
+[sub_resource type="CircleShape2D" id="CircleShape2D_0xl2q"]
+radius = 4.0
+
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_p3lv8"]
particles_animation = true
particles_anim_h_frames = 3
@@ -192,6 +195,7 @@
sprite_frames = SubResource("SpriteFrames_15g84")
[node name="Collision" type="CollisionShape2D" parent="."]
+shape = SubResource("CircleShape2D_0xl2q")
[node name="GPUParticles2D" type="GPUParticles2D" parent="."]
material = SubResource("CanvasItemMaterial_p3lv8")
diff --git a/DungeonShooting_Godot/prefab/shell/Shell0001.tscn b/DungeonShooting_Godot/prefab/shell/Shell0001.tscn
index 24a0fd2..eceaf5d 100644
--- a/DungeonShooting_Godot/prefab/shell/Shell0001.tscn
+++ b/DungeonShooting_Godot/prefab/shell/Shell0001.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=6 format=3 uid="uid://bj4yr6ru8nhwr"]
+[gd_scene load_steps=7 format=3 uid="uid://bj4yr6ru8nhwr"]
[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_2g70c"]
[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_tdny6"]
@@ -26,6 +26,9 @@
shader_parameter/outline_rainbow = false
shader_parameter/outline_use_blend = true
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_fidao"]
+size = Vector2(3.75, 1.25)
+
[node name="Shell0001" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")]
collision_layer = 128
script = ExtResource("1_2g70c")
@@ -42,3 +45,4 @@
sprite_frames = ExtResource("3_ujn5y")
[node name="Collision" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_fidao")
diff --git a/DungeonShooting_Godot/prefab/shell/Shell0002.tscn b/DungeonShooting_Godot/prefab/shell/Shell0002.tscn
index 1f8893e..7fc2e03 100644
--- a/DungeonShooting_Godot/prefab/shell/Shell0002.tscn
+++ b/DungeonShooting_Godot/prefab/shell/Shell0002.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=6 format=3 uid="uid://cdhinm8rnppxt"]
+[gd_scene load_steps=7 format=3 uid="uid://cdhinm8rnppxt"]
[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_qi64y"]
[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_s28nu"]
@@ -9,20 +9,25 @@
shader = ExtResource("2_s28nu")
shader_parameter/blend = Color(0, 0, 0, 0.470588)
shader_parameter/schedule = 1.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = false
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_7e6fo"]
resource_local_to_scene = true
shader = ExtResource("2_s28nu")
shader_parameter/blend = Color(1, 1, 1, 1)
shader_parameter/schedule = 0.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = false
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
+shader_parameter/outline_use_blend = true
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_3ib07"]
+size = Vector2(4, 2)
[node name="Shell0002" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")]
collision_layer = 128
@@ -40,3 +45,4 @@
sprite_frames = ExtResource("3_r560h")
[node name="Collision" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_3ib07")
diff --git a/DungeonShooting_Godot/prefab/shell/Shell0003.tscn b/DungeonShooting_Godot/prefab/shell/Shell0003.tscn
index 4d85f05..fecfbcb 100644
--- a/DungeonShooting_Godot/prefab/shell/Shell0003.tscn
+++ b/DungeonShooting_Godot/prefab/shell/Shell0003.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=6 format=3 uid="uid://ba5sxxjaappbj"]
+[gd_scene load_steps=7 format=3 uid="uid://ba5sxxjaappbj"]
[ext_resource type="Script" path="res://src/game/activity/shell/Shell.cs" id="1_5hfb2"]
[ext_resource type="Shader" path="res://resource/material/Blend.gdshader" id="2_586dn"]
@@ -9,20 +9,25 @@
shader = ExtResource("2_586dn")
shader_parameter/blend = Color(0, 0, 0, 0.470588)
shader_parameter/schedule = 1.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = false
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_7e6fo"]
resource_local_to_scene = true
shader = ExtResource("2_586dn")
shader_parameter/blend = Color(1, 1, 1, 1)
shader_parameter/schedule = 0.0
-shader_parameter/alpha = 1.0
+shader_parameter/modulate = Color(1, 1, 1, 1)
shader_parameter/show_outline = false
shader_parameter/outline_color = Color(0, 0, 0, 1)
shader_parameter/outline_rainbow = false
+shader_parameter/outline_use_blend = true
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_r7wle"]
+size = Vector2(4, 2)
[node name="Shell0003" type="CharacterBody2D" node_paths=PackedStringArray("ShadowSprite", "AnimatedSprite", "Collision")]
collision_layer = 128
@@ -40,3 +45,4 @@
sprite_frames = ExtResource("3_j2kre")
[node name="Collision" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_r7wle")
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs
index 30613b4..9cd5669 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs
@@ -20,17 +20,17 @@
public bool Bounce { get; set; } = true;
///
- /// 物体下坠回弹的强度
+ /// 物体回弹的强度
///
public float BounceStrength { get; set; } = 0.5f;
///
/// 物体下坠回弹后的运动速度衰减量
///
- public float BounceSpeed { get; set; } = 0.75f;
+ public float FallBounceSpeed { get; set; } = 0.75f;
///
/// 物体下坠回弹后的旋转速度衰减量
///
- public float BounceRotationSpeed { get; set; } = 0.5f;
+ public float FallBounceRotation { get; set; } = 0.5f;
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
index 95b1816..9a4c19b 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
@@ -941,10 +941,10 @@
{
//缩放移动速度
//MoveController.ScaleAllForce(BounceSpeed);
- _throwForce.Velocity *= ActivityMaterial.BounceSpeed;
+ _throwForce.Velocity *= ActivityMaterial.FallBounceSpeed;
//缩放旋转速度
//MoveController.ScaleAllRotationSpeed(BounceStrength);
- _throwForce.RotationSpeed *= ActivityMaterial.BounceRotationSpeed;
+ _throwForce.RotationSpeed *= ActivityMaterial.FallBounceRotation;
}
//如果落地高度不够低, 再抛一次
if (ActivityMaterial.Bounce && (!_hasResilienceVerticalSpeed || _resilienceVerticalSpeed > 5))
diff --git a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
index a828305..1a4547d 100644
--- a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
+++ b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs
@@ -80,8 +80,10 @@
var affiliationArea = ActivityObject.AffiliationArea;
_spriteIndex = ActivityObject.AnimatedSprite.GetIndex();
_shadowIndex = ActivityObject.ShadowSprite.GetIndex();
- ActivityObject.ShadowSprite.Reparent(affiliationArea.RoomInfo.StaticSprite);
- ActivityObject.AnimatedSprite.Reparent(affiliationArea.RoomInfo.StaticSprite);
+ var staticSprite = affiliationArea.RoomInfo.StaticSprite;
+ ActivityObject.ShadowSprite.Reparent(staticSprite);
+ ActivityObject.AnimatedSprite.Reparent(staticSprite);
+ ActivityObject.ShadowSprite.Rotation = ActivityObject.AnimatedSprite.Rotation;
_parent = ActivityObject.GetParent();
_parent.RemoveChild(ActivityObject);
}
@@ -117,6 +119,8 @@
if (IsFrozen)
{
ActivityObject.Destroy();
+ ActivityObject.AnimatedSprite.QueueFree();
+ ActivityObject.ShadowSprite.QueueFree();
}
}
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs
index 67464bc..ae5b3c9 100644
--- a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs
+++ b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs
@@ -9,10 +9,19 @@
{
public bool IsDestroyed { get; private set; }
-
+
+ private readonly List> _list = new List>();
private readonly Grid> _grid = new Grid>();
private readonly RoomInfo _roomInfo;
+ //网格划分的格子大小
private readonly Vector2I _step;
+ //当前残骸数量
+ private int _count = 0;
+ //最大残骸数量
+ private int _maxCount = 1000;
+ //每个格子中最大残骸数量
+ private int _stepMaxCount = 25;
+ private int _num = 0;
public RoomStaticSprite(RoomInfo roomInfo)
{
@@ -52,8 +61,38 @@
{
list = new List();
_grid.Set(pos, list);
+ _list.Add(list);
}
list.Add(freezeSprite);
+ _count++;
+
+ if (list.Count > _stepMaxCount) //检测单个step中残骸是否超出最大数量
+ {
+ var sprite = list[0];
+ list.RemoveAt(0);
+ sprite.Destroy();
+ _count--;
+ }
+ else if (_count > _maxCount) //检测所有残骸是否超出最大数量
+ {
+ if (_num <= 0 || _list[0].Count == 0)
+ {
+ _num = 5;
+ _list.Sort((l1, l2) => l2.Count - l1.Count);
+ }
+ else
+ {
+ _num--;
+ }
+
+ var tempList = _list[0];
+ if (tempList.Count > 0)
+ {
+ var sprite = Utils.Random.RandomChooseAndRemove(tempList);
+ sprite.Destroy();
+ _count--;
+ }
+ }
}
///
@@ -65,7 +104,10 @@
var list = _grid.Get(pos);
if (list != null)
{
- list.Remove(freezeSprite);
+ if (list.Remove(freezeSprite))
+ {
+ _count--;
+ }
}
}
@@ -92,6 +134,7 @@
{
freezeSprite.HandlerUnfreezeSprite();
data.RemoveAt(i--);
+ _count--;
}
}
}
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
index f44a216..09c59c3 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
@@ -512,11 +512,4 @@
{
_lockTargetTime = time;
}
-
- protected override void DebugDraw()
- {
- base.DebugDraw();
-
- DrawString(ResourceManager.DefaultFont12Px, new Vector2(0, 7), Hp.ToString(), HorizontalAlignment.Center);
- }
}
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
index 7197d90..fa90623 100644
--- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
@@ -178,19 +178,19 @@
((Enemy)enemy).Hurt(1000, 0);
}
}
- //测试用
- if (InputManager.Roll) //鼠标处触发互动物体
- {
- var now = DateTime.Now;
- var mousePosition = GetGlobalMousePosition();
- var freezeSprites = AffiliationArea.RoomInfo.StaticSprite.CollisionCircle(mousePosition, 25, true);
- Debug.Log("检测数量: " + freezeSprites.Count + ", 用时: " + (DateTime.Now - now).TotalMilliseconds);
- foreach (var freezeSprite in freezeSprites)
- {
- var temp = freezeSprite.Position - mousePosition;
- freezeSprite.ActivityObject.MoveController.AddForce(temp.Normalized() * 300 * (25f - temp.Length()) / 25f);
- }
- }
+ // //测试用
+ // if (InputManager.Roll) //鼠标处触发互动物体
+ // {
+ // var now = DateTime.Now;
+ // var mousePosition = GetGlobalMousePosition();
+ // var freezeSprites = AffiliationArea.RoomInfo.StaticSprite.CollisionCircle(mousePosition, 25, true);
+ // Debug.Log("检测数量: " + freezeSprites.Count + ", 用时: " + (DateTime.Now - now).TotalMilliseconds);
+ // foreach (var freezeSprite in freezeSprites)
+ // {
+ // var temp = freezeSprite.Position - mousePosition;
+ // freezeSprite.ActivityObject.MoveController.AddForce(temp.Normalized() * 300 * (25f - temp.Length()) / 25f);
+ // }
+ // }
}
protected override void OnPickUpWeapon(Weapon weapon)
@@ -321,9 +321,9 @@
}
}
- protected override void DebugDraw()
- {
- base.DebugDraw();
- DrawArc(GetLocalMousePosition(), 25, 0, Mathf.Pi * 2f, 20, Colors.Red, 1);
- }
+ // protected override void DebugDraw()
+ // {
+ // base.DebugDraw();
+ // DrawArc(GetLocalMousePosition(), 25, 0, Mathf.Pi * 2f, 20, Colors.Red, 1);
+ // }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs b/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs
index 2043dd4..e0c08bb 100644
--- a/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs
+++ b/DungeonShooting_Godot/src/game/effects/EnemyDebris.cs
@@ -10,6 +10,7 @@
{
private GpuParticles2D _gpuParticles2D;
+ private bool _playOver = false;
public override void OnInit()
{
@@ -26,6 +27,15 @@
StartCoroutine(EmitParticles());
}
+ protected override void Process(float delta)
+ {
+ if (_playOver && !IsThrowing && MoveController.IsMotionless())
+ {
+ MoveController.SetAllVelocity(Vector2.Zero);
+ Freeze();
+ }
+ }
+
public IEnumerator EmitParticles()
{
var gpuParticles2D = GetNode("GPUParticles2D");
@@ -33,8 +43,6 @@
yield return new WaitForSeconds(Utils.Random.RandomRangeFloat(1f, 2.5f));
gpuParticles2D.Emitting = false;
yield return new WaitForSeconds(1);
- //BecomesStaticImage();
- MoveController.SetAllVelocity(Vector2.Zero);
- Freeze();
+ _playOver = true;
}
}
\ No newline at end of file