Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / item / bullet / Bullet.cs
  1. using Godot;
  2.  
  3. /// <summary>
  4. /// 子弹类
  5. /// </summary>
  6. [RegisterActivity(ActivityIdPrefix.Bullet + "0001", ResourcePath.prefab_weapon_bullet_Bullet1_tscn)]
  7. [RegisterActivity(ActivityIdPrefix.Bullet + "0002", ResourcePath.prefab_weapon_bullet_Bullet2_tscn)]
  8. public partial class Bullet : ActivityObject
  9. {
  10. /// <summary>
  11. /// 碰撞区域
  12. /// </summary>
  13. public Area2D CollisionArea { get; private set; }
  14.  
  15. /// <summary>
  16. /// 发射该子弹的武器
  17. /// </summary>
  18. public Weapon Weapon { get; private set; }
  19.  
  20. // 最大飞行距离
  21. private float MaxDistance;
  22.  
  23. // 子弹飞行速度
  24. private float FlySpeed;
  25.  
  26. //当前子弹已经飞行的距离
  27. private float CurrFlyDistance = 0;
  28.  
  29. public void Init(Weapon weapon, float speed, float maxDistance, Vector2 position, float rotation, uint targetLayer)
  30. {
  31. Weapon = weapon;
  32. CollisionArea = GetNode<Area2D>("CollisionArea");
  33. CollisionArea.CollisionMask = targetLayer;
  34. CollisionArea.AreaEntered += OnArea2dEntered;
  35. //只有玩家使用该武器才能获得正常速度的子弹
  36. if (weapon.Master is Player)
  37. {
  38. FlySpeed = speed;
  39. }
  40. else
  41. {
  42. FlySpeed = speed * weapon.Attribute.AiBulletSpeedScale;
  43. }
  44. MaxDistance = maxDistance;
  45. Position = position;
  46. Rotation = rotation;
  47. ShadowOffset = new Vector2(0, 5);
  48.  
  49. BasisVelocity = new Vector2(FlySpeed, 0).Rotated(Rotation);
  50. }
  51.  
  52. protected override void PhysicsProcessOver(float delta)
  53. {
  54. //移动
  55. var lastSlideCollision = GetLastSlideCollision();
  56. //撞到墙
  57. if (lastSlideCollision != null)
  58. {
  59. //创建粒子特效
  60. var packedScene = ResourceManager.Load<PackedScene>(ResourcePath.prefab_effect_BulletSmoke_tscn);
  61. var smoke = packedScene.Instantiate<GpuParticles2D>();
  62. smoke.GlobalPosition = lastSlideCollision.GetPosition();
  63. smoke.GlobalRotation = lastSlideCollision.GetNormal().Angle();
  64. smoke.AddToActivityRoot(RoomLayerEnum.YSortLayer);
  65.  
  66. Destroy();
  67. return;
  68. }
  69. //距离太大, 自动销毁
  70. CurrFlyDistance += FlySpeed * delta;
  71. if (CurrFlyDistance >= MaxDistance)
  72. {
  73. var packedScene = ResourceManager.Load<PackedScene>(ResourcePath.prefab_effect_BulletDisappear_tscn);
  74. var node = packedScene.Instantiate<Node2D>();
  75. node.GlobalPosition = GlobalPosition;
  76. node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
  77. Destroy();
  78. }
  79. }
  80.  
  81. private void OnArea2dEntered(Area2D other)
  82. {
  83. var role = other.AsActivityObject<Role>();
  84. if (role != null)
  85. {
  86. var packedScene = ResourceManager.Load<PackedScene>(ResourcePath.prefab_effect_BulletDisappear_tscn);
  87. var node = packedScene.Instantiate<Node2D>();
  88. node.GlobalPosition = GlobalPosition;
  89. node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
  90. role.CallDeferred(nameof(Role.Hurt), 4, Rotation);
  91. Destroy();
  92. }
  93. }
  94. }