diff --git a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn
index 844689a..98bed69 100644
--- a/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn
+++ b/DungeonShooting_Godot/prefab/bullet/normal/Bullet0004.tscn
@@ -45,7 +45,7 @@
material = SubResource("ShaderMaterial_p0wfd")
sprite_frames = ExtResource("3_bttus")
animation = &"move"
-frame_progress = 0.57852
+frame_progress = 0.273277
[node name="CollisionArea" type="Area2D" parent="AnimatedSprite"]
collision_layer = 0
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
index 9faa5fe..0c5cb3e 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
@@ -616,7 +616,14 @@
}
///
- /// 撞到墙壁反弹时调用该函数, 参数为反弹的角度, 弧度制
+ /// 移动并碰撞到物体时调用该函数, 参数为碰撞数据, 该函数由 MoveController 调用
+ ///
+ public virtual void OnMoveCollision(KinematicCollision2D collision)
+ {
+ }
+
+ ///
+ /// 撞到墙壁反弹时调用该函数, 参数为反弹的角度, 弧度制, 该函数由 MoveController 调用
///
public virtual void OnBounce(float rotation)
{
diff --git a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs
index 54ae315..5575a61 100644
--- a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs
+++ b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs
@@ -367,6 +367,13 @@
_flag -= delta;
if (_flag <= 0 && (collision = Master.GetLastSlideCollision()) != null) //执行反弹操作
{
+ //调用移动碰撞函数
+ Master.OnMoveCollision(collision);
+ if (Master.IsDestroyed)
+ {
+ return;
+ }
+ //0.1秒内不能再触发第二次碰撞检测
_flag = 0.1f;
var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f);
newVelocity = finallyEf.Reflect(no);
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
index 0420c53..395cf7d 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs
@@ -25,8 +25,9 @@
Destroy();
}
- public override void OnCollisionWall(KinematicCollision2D lastSlideCollision)
+ public override void OnMoveCollision(KinematicCollision2D lastSlideCollision)
{
+ CurrentBounce++;
if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
{
PlayBoom();
diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
index 1e2dc5c..687e524 100644
--- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
+++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs
@@ -27,13 +27,10 @@
///
/// 当前反弹次数
///
- public int CurrentBounce { get; set; } = 0;
+ public int CurrentBounce { get; protected set; } = 0;
//当前子弹已经飞行的距离
private float CurrFlyDistance = 0;
- //上一次碰撞物体
- //private Rid _prevCollObject;
- private float _flag = 0;
public override void OnInit()
{
@@ -87,25 +84,23 @@
}
}
-
- ///
- /// 碰到墙壁
- ///
- public virtual void OnCollisionWall(KinematicCollision2D lastSlideCollision)
+
+ public override void OnMoveCollision(KinematicCollision2D collision)
{
+ CurrentBounce++;
if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制
{
//创建粒子特效
var packedScene = ResourceManager.Load(ResourcePath.prefab_effect_weapon_BulletSmoke_tscn);
var smoke = packedScene.Instantiate();
var rotated = AnimatedSprite.Position.Rotated(Rotation);
- smoke.GlobalPosition = lastSlideCollision.GetPosition() + new Vector2(0, rotated.Y);
- smoke.GlobalRotation = lastSlideCollision.GetNormal().Angle();
+ smoke.GlobalPosition = collision.GetPosition() + new Vector2(0, rotated.Y);
+ smoke.GlobalRotation = collision.GetNormal().Angle();
smoke.AddToActivityRoot(RoomLayerEnum.YSortLayer);
Destroy();
}
}
-
+
///
/// 碰到目标
///
@@ -188,27 +183,13 @@
node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
}
- protected override void PhysicsProcess(float delta)
+ protected override void Process(float delta)
{
- //移动
- KinematicCollision2D lastSlideCollision;
- //撞到墙
- _flag -= delta;
- if (_flag <= 0 && (lastSlideCollision = GetLastSlideCollision()) != null)
+ //距离太大, 自动销毁
+ CurrFlyDistance += BulletData.FlySpeed * delta;
+ if (CurrFlyDistance >= BulletData.MaxDistance)
{
- _flag = 0.1f;
- CurrentBounce++;
- //撞墙
- OnCollisionWall(lastSlideCollision);
- }
- else
- {
- //距离太大, 自动销毁
- CurrFlyDistance += BulletData.FlySpeed * delta;
- if (CurrFlyDistance >= BulletData.MaxDistance)
- {
- OnMaxDistance();
- }
+ OnMaxDistance();
}
}