save
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
|
||||
public partial class Projectile : Node2D
|
||||
{
|
||||
[Export] private Array<EnemyType> _superEffective;
|
||||
[Export] private float _baseDamage;
|
||||
[Export] private float _speed;
|
||||
[Export] private Area2D _hurtBox;
|
||||
|
||||
private float _ttl = 10f;
|
||||
|
||||
public event Action<Projectile> OnDespawn;
|
||||
public Vector2 Direction;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
_hurtBox.AreaEntered += AreaEntered;
|
||||
_hurtBox.BodyEntered += BodyEntered;
|
||||
}
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
{
|
||||
GlobalPosition += Direction * _speed * (float)delta;
|
||||
|
||||
_ttl -= (float)delta;
|
||||
if (_ttl > 0f) return;
|
||||
CallDeferred(nameof(Despawn));
|
||||
}
|
||||
|
||||
private void AreaEntered(Area2D area)
|
||||
{
|
||||
if (area is EnemyArea earea)
|
||||
{
|
||||
float isSe = _superEffective.Contains(earea.Enemy.Type) ? 2f : 1f;
|
||||
earea.Enemy.Health.Substract(_baseDamage * isSe);
|
||||
}
|
||||
|
||||
CallDeferred(nameof(Despawn));
|
||||
}
|
||||
|
||||
private void BodyEntered(Node2D node)
|
||||
{
|
||||
CallDeferred(nameof(Despawn));
|
||||
}
|
||||
|
||||
private void Despawn()
|
||||
{
|
||||
OnDespawn?.Invoke(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://ln2lt16fi47q
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
|
||||
|
||||
public partial class ProjectilePool : Node
|
||||
{
|
||||
[Export] private PackedScene _scene;
|
||||
[Export] private int _poolSize;
|
||||
|
||||
private readonly Queue<Projectile> _pool = new();
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
for (int i = 0; i < _poolSize; i++)
|
||||
{
|
||||
_pool.Enqueue(CreateProjectile());
|
||||
}
|
||||
}
|
||||
|
||||
private Projectile CreateProjectile()
|
||||
{
|
||||
var p = _scene.Instantiate<Projectile>();
|
||||
p.OnDespawn += ReturnToPool;
|
||||
return p;
|
||||
}
|
||||
|
||||
public Projectile Get()
|
||||
{
|
||||
var p = _pool.Count > 0 ? _pool.Dequeue() : CreateProjectile();
|
||||
return p;
|
||||
}
|
||||
|
||||
private void ReturnToPool(Projectile p)
|
||||
{
|
||||
p.GetParent()?.RemoveChild(p);
|
||||
p.ProcessMode = ProcessModeEnum.Disabled;
|
||||
_pool.Enqueue(p);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://cy00plvsi6vkn
|
||||
Reference in New Issue
Block a user