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