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