diff --git a/DungeonShooting_Godot/prefab/role/Role0001.tscn b/DungeonShooting_Godot/prefab/role/Role0001.tscn
index 44a10c1..a088659 100644
--- a/DungeonShooting_Godot/prefab/role/Role0001.tscn
+++ b/DungeonShooting_Godot/prefab/role/Role0001.tscn
@@ -45,6 +45,7 @@
texture = ExtResource("3_vx7tr")
[node name="AnimatedSprite" parent="." index="2"]
+visible = false
material = SubResource("ShaderMaterial_8hgu2")
sprite_frames = ExtResource("4_galcc")
animation = &"roll"
diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn
index 9f257dd..f43ac80 100644
--- a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn
+++ b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn
@@ -37,7 +37,7 @@
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
-tracks/0/path = NodePath(".:rotation")
+tracks/0/path = NodePath("AnimatedSprite:material:shader_parameter/schedule")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
@@ -49,12 +49,36 @@
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
-tracks/1/path = NodePath("AnimatedSprite:material:shader_parameter/schedule")
+tracks/1/path = NodePath("AnimatedSprite:animation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [&"default"]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("AnimatedSprite:frame")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [0]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("AnimatedSprite:rotation")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
@@ -65,10 +89,34 @@
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
-tracks/0/path = NodePath(".:rotation")
+tracks/0/path = NodePath("AnimatedSprite:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
+"times": PackedFloat32Array(0, 1.3),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [&"reloading_frame", &"default"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 1.3),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [0, 18]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("AnimatedSprite:rotation")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
"times": PackedFloat32Array(0, 0.2, 1.1, 1.3),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
@@ -101,7 +149,6 @@
modulate = Color(1.9, 1.9, 1.9, 1)
material = SubResource("ShaderMaterial_6odx4")
sprite_frames = ExtResource("2_s0xbw")
-animation = &"reloading"
[node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"]
position = Vector2(-2, -3)
diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn
index 75c740e..d4495c1 100644
--- a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn
+++ b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn
@@ -37,43 +37,43 @@
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
-tracks/0/path = NodePath(".:rotation")
+tracks/0/path = NodePath("AnimatedSprite:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [0.0]
+"update": 1,
+"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
-tracks/1/path = NodePath("AnimatedSprite:animation")
+tracks/1/path = NodePath("AnimatedSprite:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
-"values": [&"reloading_frame"]
+"values": [0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
-tracks/2/path = NodePath("AnimatedSprite:frame")
+tracks/2/path = NodePath("AnimatedSprite:material:shader_parameter/schedule")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [0]
+"update": 0,
+"values": [0.0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
-tracks/3/path = NodePath("AnimatedSprite:material:shader_parameter/schedule")
+tracks/3/path = NodePath("AnimatedSprite:rotation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
@@ -90,39 +90,39 @@
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
-tracks/0/path = NodePath(".:rotation")
+tracks/0/path = NodePath("AnimatedSprite:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
-"times": PackedFloat32Array(0, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5),
-"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
-"update": 0,
-"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0]
+"times": PackedFloat32Array(0, 1.5),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [&"reloading_frame", &"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
-tracks/1/path = NodePath("AnimatedSprite:animation")
+tracks/1/path = NodePath("AnimatedSprite:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [&"reloading_frame"]
-}
-tracks/2/type = "value"
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/path = NodePath("AnimatedSprite:frame")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/keys = {
"times": PackedFloat32Array(0, 0.22, 0.24, 1.22, 1.24),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4]
}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("AnimatedSprite:rotation")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(-0.02, 0.14, 0.2, 1.14, 1.2, 1.36, 1.5),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
+"update": 0,
+"values": [0.0, -0.523599, 0.0, 0.0, -0.349066, -0.349066, 0.0]
+}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_trkjd"]
_data = {
@@ -149,7 +149,6 @@
[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."]
material = SubResource("ShaderMaterial_o36tv")
sprite_frames = ExtResource("2_4kxpd")
-animation = &"reloading_frame"
[node name="ShellPoint" type="Marker2D" parent="AnimatedSprite"]
position = Vector2(-2, -2)
diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json
index 1579f73..7674f49 100644
--- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json
+++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/inlet/Start3/Preinstall.json
@@ -1 +1 @@
-[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-84,"Y":-46},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-85,"Y":-71},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0007","Weight":100,"Attr":{"CurrAmmon":"60","ResidueAmmo":"300"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":-56,"Y":-72},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":30,"Y":75},"Size":{"X":29,"Y":28},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-88,"Y":70},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.8,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":65,"Y":-66},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}]
\ No newline at end of file
+[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-84,"Y":-46},"Size":{"X":0,"Y":0},"SpecialMarkType":1,"DelayTime":0,"MarkList":[]},{"Position":{"X":-56,"Y":-72},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"weapon0002","Weight":100,"Attr":{"CurrAmmon":"7","ResidueAmmo":"70"},"Altitude":8,"VerticalSpeed":0}]}],[{"Position":{"X":30,"Y":75},"Size":{"X":29,"Y":28},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"-1","Weapon":null},"Altitude":0,"VerticalSpeed":0}]},{"Position":{"X":-88,"Y":70},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0.8,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"30","ResidueAmmo":"210"},"Altitude":8,"VerticalSpeed":0}]},{"Position":{"X":65,"Y":-66},"Size":{"X":16,"Y":16},"SpecialMarkType":0,"DelayTime":0,"MarkList":[{"Id":"enemy0001","Weight":100,"Attr":{"Face":"0","Weapon":"weapon0002","CurrAmmon":"7","ResidueAmmo":"7"},"Altitude":0,"VerticalSpeed":0}]}]]}]
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres
index 1dfc8d7..f6d578c 100644
--- a/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres
+++ b/DungeonShooting_Godot/resource/spriteFrames/weapon/Weapon0008.tres
@@ -148,6 +148,6 @@
"texture": SubResource("AtlasTexture_ol1l8")
}],
"loop": false,
-"name": &"reloading",
+"name": &"reloading_frame",
"speed": 11.0
}]
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
index 8cd04b7..47aa18d 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs
@@ -284,6 +284,15 @@
LookTarget = target;
StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiTailAfter);
}
+ else if (state == AIStateEnum.AiFindAmmo)
+ {
+ if (LookTarget == null)
+ {
+ LookTarget = target;
+ var findAmmo = (AiFindAmmoState)StateController.CurrStateBase;
+ StateController.ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, findAmmo.TargetWeapon);
+ }
+ }
}
///
diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs
index 108652c..9e71f84 100644
--- a/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/enemy/state/AiFindAmmoState.cs
@@ -9,8 +9,10 @@
///
public class AiFindAmmoState : StateBase
{
-
- private Weapon _target;
+ ///
+ /// 目标武器
+ ///
+ public Weapon TargetWeapon;
//导航目标点刷新计时器
private float _navigationUpdateTimer = 0;
@@ -39,7 +41,7 @@
}
else
{
- _attackTarget = null;
+ _attackTarget = Master.LookTarget;
}
SetTargetWeapon((Weapon)args[0]);
@@ -47,7 +49,7 @@
_tailAfterTimer = 0;
//标记武器
- _target.SetSign(SignNames.AiFindWeaponSign, Master);
+ TargetWeapon.SetSign(SignNames.AiFindWeaponSign, Master);
_playAnimFlag = prev == AIStateEnum.AiLeaveFor;
if (_playAnimFlag)
@@ -82,7 +84,7 @@
//发现玩家
Master.LookTarget = player;
//进入惊讶状态, 然后再进入通知状态
- ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, _target);
+ ChangeState(AIStateEnum.AiAstonished, AIStateEnum.AiFindAmmo, TargetWeapon);
return;
}
}
@@ -92,7 +94,7 @@
{
//每隔一段时间秒更改目标位置
_navigationUpdateTimer = _navigationInterval;
- var position = _target.GlobalPosition;
+ var position = TargetWeapon.GlobalPosition;
Master.NavigationAgent2D.TargetPosition = position;
}
else
@@ -100,26 +102,26 @@
_navigationUpdateTimer -= delta;
}
- if (_target.IsDestroyed || _target.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走
+ if (TargetWeapon.IsDestroyed || TargetWeapon.IsTotalAmmoEmpty()) //已经被销毁, 或者弹药已经被其他角色捡走
{
//再去寻找其他武器
SetTargetWeapon(Master.FindTargetWeapon());
- if (_target == null) //也没有其他可用的武器了
+ if (TargetWeapon == null) //也没有其他可用的武器了
{
RunNextState();
}
}
- else if (_target.Master == Master) //已经被自己拾起
+ else if (TargetWeapon.Master == Master) //已经被自己拾起
{
RunNextState();
}
- else if (_target.Master != null) //武器已经被其他角色拾起!
+ else if (TargetWeapon.Master != null) //武器已经被其他角色拾起!
{
//再去寻找其他武器
SetTargetWeapon(Master.FindTargetWeapon());
- if (_target == null) //也没有其他可用的武器了
+ if (TargetWeapon == null) //也没有其他可用的武器了
{
RunNextState();
}
@@ -172,19 +174,19 @@
private void SetTargetWeapon(Weapon weapon)
{
- _target = weapon;
+ TargetWeapon = weapon;
if (weapon != null)
{
//设置目标点
- Master.NavigationAgent2D.TargetPosition = _target.GlobalPosition;
+ Master.NavigationAgent2D.TargetPosition = TargetWeapon.GlobalPosition;
}
}
public override void DebugDraw()
{
- if (_target != null)
+ if (TargetWeapon != null)
{
- Master.DrawLine(Vector2.Zero, Master.ToLocal(_target.GlobalPosition), Colors.Purple);
+ Master.DrawLine(Vector2.Zero, Master.ToLocal(TargetWeapon.GlobalPosition), Colors.Purple);
if (Master.LookTarget != null)
{
diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
index e624a3b..9a0e3ac 100644
--- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
+++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs
@@ -285,7 +285,8 @@
public override void OnInit()
{
InitWeapon(GetWeaponAttribute(ActivityBase.Id).Clone());
- AnimatedSprite.AnimationFinished += OnAnimationFinished;
+ AnimatedSprite.AnimationFinished += OnAnimatedSpriteFinished;
+ AnimationPlayer.AnimationFinished += OnAnimationPlayerFinished;
}
///
@@ -1610,12 +1611,21 @@
}
//帧动画播放结束
- private void OnAnimationFinished()
+ private void OnAnimatedSpriteFinished()
{
// Debug.Log("帧动画播放结束...");
AnimatedSprite.Play(AnimatorNames.Default);
}
+ //动画播放器播放结束
+ private void OnAnimationPlayerFinished(StringName name)
+ {
+ if (Master != null && !IsActive)
+ {
+ Master.OnPutBackMount(this, PackageIndex);
+ }
+ }
+
public override CheckInteractiveResult CheckInteractive(ActivityObject master)
{
var result = new CheckInteractiveResult(this);
@@ -1821,6 +1831,12 @@
///
private void Conceal()
{
+ //停止换弹动画
+ if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying())
+ {
+ AnimationPlayer.Play(AnimatorNames.Reset);
+ }
+
HideShadowSprite();
OnConceal();
}
@@ -1844,6 +1860,11 @@
{
StopReload();
}
+ //停止换弹动画
+ if (AnimationPlayer.CurrentAnimation == AnimatorNames.Reloading && AnimationPlayer.IsPlaying())
+ {
+ AnimationPlayer.Play(AnimatorNames.Reset);
+ }
OnRemove(Master);
}
diff --git a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs
index 8ee5992..6b24e90 100644
--- a/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs
+++ b/DungeonShooting_Godot/src/game/ui/roomMap/RoomMapPanel.cs
@@ -168,7 +168,7 @@
Input.IsMouseButtonPressed(MouseButton.Right))
{
//执行传送操作
- DoTransmission(_mouseHoverRoom.Waypoints * GameConfig.TileCellSize);
+ DoTransmission((_mouseHoverRoom.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize);
ResetMap();
_isMagnifyMap = false;
World.Current.Pause = false;
diff --git a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs
index 2b9b7db..fe8d33e 100644
--- a/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs
+++ b/DungeonShooting_Godot/src/game/ui/roomUI/RoomUIPanel.cs
@@ -1,5 +1,4 @@
-using Godot;
using UI.BottomTips;
namespace UI.RoomUI;