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