-
- using Godot;
-
- /// <summary>
- /// 爆炸
- /// </summary>
- public partial class Explode : Area2D, IPoolItem
- {
- public bool IsRecycled { get; set; }
- public string Logotype { get; set; }
-
- public bool IsDestroyed { get; private set; }
-
- /// <summary>
- /// 动画播放器
- /// </summary>
- public AnimationPlayer AnimationPlayer { get; private set; }
- /// <summary>
- /// 碰撞器
- /// </summary>
- public CollisionShape2D CollisionShape { get; private set; }
- /// <summary>
- /// 碰撞器形状对象
- /// </summary>
- public CircleShape2D CircleShape { get; private set; }
-
- /// <summary>
- /// 爆炸攻击的层级
- /// </summary>
- public uint AttackLayer { get; private set; }
- /// <summary>
- /// 最小伤害
- /// </summary>
- public int MinHarm { get; private set; }
- /// <summary>
- /// 最大伤害
- /// </summary>
- public int MaxHarm { get; private set; }
-
- private bool _init = false;
-
- public void Destroy()
- {
- if (IsDestroyed)
- {
- return;
- }
-
- IsDestroyed = true;
- QueueFree();
- }
-
- public void Init(uint attackLayer, float radius, int minHarm, int maxHarm)
- {
- if (!_init)
- {
- _init = true;
- AnimationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
- CollisionShape = GetNode<CollisionShape2D>("CollisionShape2D");
- CircleShape = (CircleShape2D)CollisionShape.Shape;
- AnimationPlayer.AnimationFinished += OnAnimationFinish;
- BodyEntered += OnBodyEntered;
- }
-
- AttackLayer = attackLayer;
- MinHarm = minHarm;
- MaxHarm = maxHarm;
- CollisionMask = attackLayer;
- CircleShape.Radius = radius;
- }
-
- public void RunPlay()
- {
- GameCamera.Main.CreateShake(new Vector2(6, 6), 0.7f, true);
- AnimationPlayer.Play(AnimatorNames.Play);
- }
-
- public void OnReclaim()
- {
- GetParent().RemoveChild(this);
- }
-
- public void OnLeavePool()
- {
-
- }
-
- private void OnAnimationFinish(StringName name)
- {
- if (name == AnimatorNames.Play)
- {
- ObjectPool.Reclaim(this);
- }
- }
-
- private void OnBodyEntered(Node2D node)
- {
- var role = node.AsActivityObject<Role>();
- if (role != null)
- {
- var angle = (role.Position - Position).Angle();
- role.CallDeferred(nameof(role.Hurt), Utils.Random.RandomRangeInt(MinHarm, MaxHarm), angle);
- role.MoveController.AddForce(Vector2.FromAngle(angle) * 150, 300);
- }
- }
- }