diff --git a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx index b23fc4c..16e6778 100644 --- a/DungeonShooting_Godot/excel/ActivityMaterial.xlsx +++ b/DungeonShooting_Godot/excel/ActivityMaterial.xlsx Binary files differ diff --git a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs index f3fa9c6..fe76940 100644 --- a/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs +++ b/DungeonShooting_Godot/src/config/ExcelConfig_ActivityMaterial.cs @@ -77,7 +77,7 @@ public float FallBounceRotation; /// - /// 动态开关碰撞器,在物体高度大于16时是否关闭碰撞检测 + /// 动态开关碰撞器,在物体高度大于32时是否关闭碰撞检测 /// [JsonInclude] public bool DynamicCollision; diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 68320b6..f42c523 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -1116,8 +1116,8 @@ _altitude += VerticalSpeed * delta; _verticalSpeed -= GameConfig.G * ActivityMaterial.GravityScale * delta; - //当高度大于16时, 显示在所有物体上, 并且关闭碰撞 - if (Altitude >= 16) + //当高度大于32时, 显示在所有物体上, 并且关闭碰撞 + if (Altitude >= 32) { AnimatedSprite.ZIndex = 20; } @@ -1128,7 +1128,7 @@ //动态开关碰撞器 if (ActivityMaterial.DynamicCollision) { - Collision.Disabled = Altitude >= 16; + Collision.Disabled = Altitude >= 32; } //达到最高点 diff --git a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs index c6b0379..abd503c 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/laser/Laser.cs @@ -37,6 +37,7 @@ } public BulletData BulletData { get; private set; } + public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal; public bool IsDestroyed { get; private set; } @@ -52,7 +53,7 @@ { InitData(data, attackLayer, LaserDefaultWidth); } - + public void InitData(BulletData data, uint attackLayer, float width) { if (!_init) @@ -137,6 +138,7 @@ _tween.Chain(); _tween.TweenCallback(Callable.From(() => { + State = BulletStateEnum.MaxDistance; _tween = null; LogicalFinish(); })); @@ -252,6 +254,7 @@ public virtual void OnReclaim() { + State = BulletStateEnum.Normal; if (Particles2D != null) { foreach (var particles2D in Particles2D) diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs index 4174bad..7cf187e 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Arrow.cs @@ -37,21 +37,6 @@ return base.CheckInteractive(master); } - public override void OnPlayDisappearEffect() - { - } - - public override void OnMoveCollision(KinematicCollision2D collision) - { - CurrentBounce++; - if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 - { - //创建粒子特效 - OnPlayCollisionEffect(collision); - ObjectPool.Reclaim(this); - } - } - public override void OnCollisionTarget(IHurt hurt) { base.OnCollisionTarget(hurt); @@ -64,11 +49,23 @@ public override void LogicalFinish() { - SetEnableMovement(false); - var slideCollision = GetLastSlideCollision(); - if (slideCollision != null) + if (State == BulletStateEnum.CollisionTarget) //碰撞到目标, 直接冻结 { - Position -= slideCollision.GetTravel(); + SetEnableMovement(false); + var slideCollision = GetLastSlideCollision(); + if (slideCollision != null) + { + Position -= slideCollision.GetTravel(); + } + } + else if (State == BulletStateEnum.FallToGround) //落地, 啥也不干 + { + + } + else + { + //Debug.Log("碰撞速度: " + Velocity.Length()); + base.LogicalFinish(); } } diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs index 085c4c6..79174e7 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BoomBullet.cs @@ -21,6 +21,7 @@ public override void OnCollisionTarget(IHurt o) { + State = BulletStateEnum.CollisionTarget; PlayBoom(); LogicalFinish(); } @@ -30,6 +31,7 @@ CurrentBounce++; if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { + State = BulletStateEnum.MoveCollision; PlayBoom(); LogicalFinish(); } diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs index c926744..9acf91f 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/Bullet.cs @@ -62,6 +62,11 @@ /// public bool IsEnemyBullet { get; private set; } = false; + /// + /// 子弹状态 + /// + public BulletStateEnum State { get; protected set; } = BulletStateEnum.Normal; + //当前子弹已经飞行的距离 private float CurrFlyDistance = 0; @@ -136,7 +141,11 @@ //过期销毁 if (data.LifeTime > 0) { - this.CallDelay(data.LifeTime, OnLimeOver); + this.CallDelay(data.LifeTime, () => + { + State = BulletStateEnum.LimeOver; + OnLimeOver(); + }); } if (Particles2D != null) @@ -172,6 +181,7 @@ CurrentBounce++; if (CurrentBounce > BulletData.BounceCount) //反弹次数超过限制 { + State = BulletStateEnum.MoveCollision; //创建粒子特效 OnPlayCollisionEffect(collision); LogicalFinish(); @@ -200,6 +210,7 @@ CurrentPenetration++; if (CurrentPenetration > BulletData.Penetration) { + State = BulletStateEnum.CollisionTarget; CallDeferred(nameof(LogicalFinish)); } } @@ -224,6 +235,7 @@ protected override void OnFallToGround() { + State = BulletStateEnum.FallToGround; //落地销毁 OnPlayDisappearEffect(); LogicalFinish(); @@ -295,15 +307,16 @@ { if (ActivityMaterial.DynamicCollision) { - //子弹高度大于 16 关闭碰撞检测 - CollisionShape2D.Disabled = Altitude >= 16; + //子弹高度大于 32 关闭碰撞检测 + CollisionShape2D.Disabled = Altitude >= 32; } //距离太大, 自动销毁 if (MoveController.Enable) { - CurrFlyDistance += BulletData.FlySpeed * delta; + CurrFlyDistance += Velocity.Length() * delta; if (CurrFlyDistance >= BulletData.MaxDistance) { + State = BulletStateEnum.MaxDistance; OnMaxDistance(); } } @@ -342,6 +355,7 @@ public virtual void OnReclaim() { + State = BulletStateEnum.Normal; Visible = false; if (Particles2D != null) { diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs new file mode 100644 index 0000000..7b21719 --- /dev/null +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/BulletStateEnum.cs @@ -0,0 +1,31 @@ + +/// +/// 子弹逻辑完成条件 +/// +public enum BulletStateEnum +{ + /// + /// 正常飞行状态 + /// + Normal, + /// + /// 移动并撞到物体 + /// + MoveCollision, + /// + /// 飞行到最大距离 + /// + MaxDistance, + /// + /// 子弹生命周期结束 + /// + LimeOver, + /// + /// 落地 + /// + FallToGround, + /// + /// 碰撞到攻击目标物体 + /// + CollisionTarget, +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs index 56d4b88..a642541 100644 --- a/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs +++ b/DungeonShooting_Godot/src/game/activity/bullet/normal/IBullet.cs @@ -21,6 +21,12 @@ /// 子弹数据 /// BulletData BulletData { get; } + + /// + /// 子弹状态 + /// + BulletStateEnum State { get; } + /// /// 初始化子弹数据 ///