Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / activity / bullet / normal / Arrow.cs
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 弓箭
  6. /// </summary>
  7. [Tool]
  8. public partial class Arrow : Bullet, IMountItem
  9. {
  10. [Export, ExportFillNode]
  11. public AnimatedSprite2D HalfSprite { get; set; }
  12.  
  13. public override void InitData(BulletData data, uint attackLayer)
  14. {
  15. base.InitData(data, attackLayer);
  16. SetEnableMovement(true);
  17. EnableVerticalMotion = false;
  18. DefaultLayer = RoomLayerEnum.NormalLayer;
  19. }
  20.  
  21. public override CheckInteractiveResult CheckInteractive(ActivityObject master)
  22. {
  23. if (master is Role role) //如果角色有弓箭武器, 则可以拾起地上的箭
  24. {
  25. var index = role.WeaponPack.FindIndex((weapon, index) =>
  26. {
  27. return weapon.ActivityBase.Id == Ids.Id_weapon0016;
  28. });
  29. if (index >= 0)
  30. {
  31. var weapon = role.WeaponPack.GetItem(index);
  32. weapon.SetResidueAmmo(weapon.ResidueAmmo + 1);
  33. ObjectPool.Reclaim(this);
  34. }
  35. }
  36. return base.CheckInteractive(master);
  37. }
  38.  
  39. public override void OnPlayDisappearEffect()
  40. {
  41. }
  42.  
  43. protected override void OnArea2dEntered(Area2D other)
  44. {
  45. if (Velocity.Length() >= BulletData.FlySpeed / 2f)
  46. {
  47. base.OnArea2dEntered(other);
  48. }
  49. }
  50.  
  51. protected override void OnBodyEntered(Node2D body)
  52. {
  53. if (Velocity.Length() >= BulletData.FlySpeed / 2f)
  54. {
  55. base.OnBodyEntered(body);
  56. }
  57. }
  58.  
  59. public override void OnCollisionTarget(IHurt hurt)
  60. {
  61. base.OnCollisionTarget(hurt);
  62. if (CurrentPenetration > BulletData.Penetration)
  63. {
  64. var activityObject = hurt.GetActivityObject();
  65. if (activityObject != null)
  66. {
  67. CallDeferred(nameof(OnBindTarget), activityObject);
  68. }
  69. }
  70. }
  71.  
  72. public override void OnMoveCollision(KinematicCollision2D collision)
  73. {
  74. if (Velocity.Length() >= BulletData.FlySpeed / 2f)
  75. {
  76. base.OnMoveCollision(collision);
  77. }
  78. }
  79.  
  80. protected override void OnThrowOver()
  81. {
  82. SetOriginCollisionLayerValue(PhysicsLayer.Prop, true);
  83. if (!Utils.CollisionMaskWithLayer(CollisionLayer, PhysicsLayer.Prop))
  84. {
  85. CollisionLayer |= PhysicsLayer.Prop;
  86. }
  87. }
  88.  
  89. public override void LogicalFinish()
  90. {
  91. if (State == BulletStateEnum.CollisionTarget) //碰撞到目标, 直接冻结
  92. {
  93. SetEnableMovement(false);
  94. var slideCollision = GetLastSlideCollision();
  95. if (slideCollision != null)
  96. {
  97. Position -= slideCollision.GetTravel();
  98. }
  99. }
  100. else if (State == BulletStateEnum.MaxDistance) //到达最大动力距离, 则开始下坠
  101. {
  102. EnableVerticalMotion = true;
  103. }
  104. else if (State == BulletStateEnum.FallToGround) //落地, 啥也不干
  105. {
  106. }
  107. else
  108. {
  109. //Debug.Log("碰撞速度: " + Velocity.Length());
  110. base.LogicalFinish();
  111. }
  112. }
  113.  
  114. //将弓箭挂载到目标物体上
  115. private void OnBindTarget(ActivityObject activityObject)
  116. {
  117. if (activityObject.IsDestroyed) //目标已经销毁
  118. {
  119. OnUnmount(activityObject);
  120. }
  121. else
  122. {
  123. Altitude = Mathf.Max(1, -activityObject.ToLocal(GlobalPosition).Y);
  124. activityObject.AddMountObject(this);
  125. }
  126. }
  127.  
  128. public void OnMount(ActivityObject target)
  129. {
  130. Reparent(target);
  131. AnimatedSprite.Play(AnimatorNames.HalfEnd);
  132. HalfSprite.Visible = true;
  133. RefreshBulletColor(false);
  134. EnableVerticalMotion = false;
  135. }
  136.  
  137. public void OnUnmount(ActivityObject target)
  138. {
  139. AnimatedSprite.Play(AnimatorNames.Default);
  140. HalfSprite.Visible = false;
  141. SetEnableMovement(true);
  142. EnableVerticalMotion = true;
  143. MoveController.ClearForce();
  144. MoveController.BasisVelocity = Vector2.Zero;
  145. ShadowOffset = new Vector2(0, 1);
  146. Throw(Mathf.Max(3, Altitude), Utils.Random.RandomRangeInt(50, 80), Vector2.Zero, Utils.Random.RandomRangeInt(-30, 30));
  147. InheritVelocity(target);
  148. }
  149.  
  150. public override void OnLeavePool()
  151. {
  152. SetOriginCollisionLayerValue(PhysicsLayer.Prop, false);
  153. if (Utils.CollisionMaskWithLayer(CollisionLayer, PhysicsLayer.Prop))
  154. {
  155. CollisionLayer ^= PhysicsLayer.Prop;
  156. }
  157. base.OnLeavePool();
  158. }
  159. }