diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn index 44dd8a3..7966f8c 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_E.tscn @@ -33,10 +33,8 @@ material = SubResource("ShaderMaterial_t4ayq") position = Vector2(0, -8) sprite_frames = ExtResource("3_07nn2") -animation = &"openDoor" +animation = &"closeDoor" autoplay = "default" -frame = 9 -frame_progress = 1.0 [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(0, 4) diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn index d31f6d6..829a10e 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_S.tscn @@ -33,7 +33,7 @@ material = SubResource("ShaderMaterial_t4ayq") position = Vector2(0, -8) sprite_frames = ExtResource("3_o0nxg") -animation = &"closeDoor" +autoplay = "default" [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(0, -3.5) diff --git a/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn b/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn index 514f9b6..d9dae3c 100644 --- a/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn +++ b/DungeonShooting_Godot/prefab/map/RoomDoor_W.tscn @@ -33,6 +33,7 @@ material = SubResource("ShaderMaterial_t4ayq") position = Vector2(0, -8) sprite_frames = ExtResource("3_ptoof") +autoplay = "default" [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(0, 4) diff --git a/DungeonShooting_Godot/resource/map/tileMaps/testGroup/inlet/Room1.tscn b/DungeonShooting_Godot/resource/map/tileMaps/testGroup/inlet/Room1.tscn index 5c2022c..cc9dc12 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/testGroup/inlet/Room1.tscn +++ b/DungeonShooting_Godot/resource/map/tileMaps/testGroup/inlet/Room1.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://dmeb88jotqro6"] +[gd_scene load_steps=5 format=3 uid="uid://dmeb88jotqro6"] [ext_resource type="TileSet" uid="uid://b00g22o1cqhe8" path="res://resource/map/tileset/TileSet1.tres" id="1_gh7sf"] [ext_resource type="Script" path="res://src/framework/map/mark/ActivityMark.cs" id="3_pf56w"] +[ext_resource type="Script" path="res://src/framework/map/mark/EnemyMark.cs" id="4_4nq12"] [ext_resource type="Script" path="res://src/framework/map/DungeonRoomTemplate.cs" id="dungeonRoomTemplate"] [node name="Room1" type="TileMap"] @@ -42,3 +43,11 @@ Type = 5 ItemExpression = "0004(ResidueAmmo:15,CurrAmmon:0)" WaveNumber = 4 + +[node name="EnemyMark" type="Node2D" parent="."] +position = Vector2(141, 18) +script = ExtResource("4_4nq12") +Type = 4 +ItemExpression = "0001" +Layer = 1 +Altitude = 0 diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index d658375..6bce8d2 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -85,7 +85,7 @@ /// /// 是否正在投抛过程中 /// - public bool IsThrowing => _fallData != null && !_isFallOver; + public bool IsThrowing => _throwForce != null && !_isFallOver; /// /// 当前物体的海拔高度, 如果大于0, 则会做自由落体运动, 也就是执行投抛代码 diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs index c67ac6a..081378c 100644 --- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs +++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs @@ -118,6 +118,23 @@ } return count; } + + /// + /// 查询所有符合条件的对象并返回 + /// + /// 操作函数, 返回是否满足要求 + public ActivityObject[] FindIncludeItems(Func handler) + { + var list = new List(); + foreach (var activityObject in _includeItems) + { + if (handler(activityObject)) + { + list.Add(activityObject); + } + } + return list.ToArray(); + } private void OnBodyEntered(Node2D body) { diff --git a/DungeonShooting_Godot/src/game/role/Player.cs b/DungeonShooting_Godot/src/game/role/Player.cs index da61f81..7b30aff 100644 --- a/DungeonShooting_Godot/src/game/role/Player.cs +++ b/DungeonShooting_Godot/src/game/role/Player.cs @@ -94,6 +94,22 @@ else if (Input.IsActionJustPressed("throw")) //扔掉武器 { ThrowWeapon(); + + //测试用的, 所有敌人也扔掉武器 + if (Affiliation != null) + { + var enemies = Affiliation.FindIncludeItems(o => + { + return o.CollisionWithMask(PhysicsLayer.Enemy); + }); + foreach (var activityObject in enemies) + { + if (activityObject is Enemy enemy) + { + enemy.ThrowWeapon(); + } + } + } } else if (Input.IsActionJustPressed("interactive")) //互动物体 { diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 04db30b..a2ded2a 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -241,28 +241,6 @@ { foreach (var doorInfo in roomInfo.Doors) { - // var door = ActivityObject.Create(ActivityIdPrefix.Other + "0001"); - // doorInfo.Door = door; - // Vector2 offset; - // switch (doorInfo.Direction) - // { - // case DoorDirection.E: - // offset = new Vector2(0.5f, 2); - // break; - // case DoorDirection.W: - // offset = new Vector2(-0.5f, 2); - // break; - // case DoorDirection.S: - // offset = new Vector2(2f, 1.5f); - // break; - // case DoorDirection.N: - // offset = new Vector2(2f, -0.5f); - // break; - // default: offset = new Vector2(); - // break; - // } - // door.Position = (doorInfo.OriginPosition + offset) * GameConfig.TileCellSize; - RoomDoor door; switch (doorInfo.Direction) { diff --git a/DungeonShooting_Godot/src/game/room/RoomDoor.cs b/DungeonShooting_Godot/src/game/room/RoomDoor.cs index 534d336..89c73b8 100644 --- a/DungeonShooting_Godot/src/game/room/RoomDoor.cs +++ b/DungeonShooting_Godot/src/game/room/RoomDoor.cs @@ -22,6 +22,12 @@ public bool IsClose { get; private set; } private RoomDoorInfo _door; + private bool waitDisabledCollision = false; + + public override void OnInit() + { + AnimatedSprite.AnimationFinished += OnAnimationFinished; + } /// /// 初始化调用 @@ -29,32 +35,8 @@ public void Init(RoomDoorInfo doorInfo) { _door = doorInfo; - OpenDoor(); - - // switch (doorInfo.Direction) - // { - // case DoorDirection.E: - // AnimatedSprite.Frame = 1; - // AnimatedSprite.Position = new Vector2(0, -8); - // Collision.Position = Vector2.Zero; - // var collisionShape = (RectangleShape2D)Collision.Shape; - // collisionShape.Size = new Vector2(14, 32); - // break; - // case DoorDirection.W: - // AnimatedSprite.Frame = 1; - // AnimatedSprite.Position = new Vector2(0, -8); - // Collision.Position = Vector2.Zero; - // var collisionShape2 = (RectangleShape2D)Collision.Shape; - // collisionShape2.Size = new Vector2(14, 32); - // break; - // case DoorDirection.S: - // AnimatedSprite.Position = new Vector2(0, -8); - // break; - // case DoorDirection.N: - // ZIndex = GameConfig.MiddleMapLayer; - // AnimatedSprite.Position = new Vector2(0, -8); - // break; - // } + IsClose = false; + OpenDoorHandler(); } /// @@ -64,21 +46,11 @@ { IsClose = false; //Visible = false; - Collision.Disabled = true; - if (_door.Navigation != null) - { - _door.Navigation.OpenNavigationNode.Enabled = true; - _door.Navigation.OpenNavigationNode.Visible = true; - _door.Navigation.CloseNavigationNode.Enabled = false; - _door.Navigation.CloseNavigationNode.Visible = false; - } - + waitDisabledCollision = true; if (AnimatedSprite.SpriteFrames.HasAnimation(AnimatorNames.OpenDoor)) { AnimatedSprite.Play(AnimatorNames.OpenDoor); } - //调整门的层级 - ZIndex = GameConfig.FloorMapLayer; } /// @@ -114,4 +86,27 @@ break; } } + + private void OnAnimationFinished() + { + if (!IsClose && waitDisabledCollision) //开门动画播放完成 + { + waitDisabledCollision = false; + OpenDoorHandler(); + } + } + + private void OpenDoorHandler() + { + Collision.Disabled = true; + if (_door.Navigation != null) + { + _door.Navigation.OpenNavigationNode.Enabled = true; + _door.Navigation.OpenNavigationNode.Visible = true; + _door.Navigation.CloseNavigationNode.Enabled = false; + _door.Navigation.CloseNavigationNode.Visible = false; + } + //调整门的层级 + ZIndex = GameConfig.FloorMapLayer; + } } \ No newline at end of file