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(); } }