This commit is contained in:
2026-01-31 23:24:13 +02:00
parent be0c819c8b
commit 12c1360ae7
58 changed files with 1902 additions and 238 deletions
+52
View File
@@ -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);
}
}
+1
View File
@@ -0,0 +1 @@
uid://ln2lt16fi47q
+39
View File
@@ -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