feat: aetherbind, first source generator
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using GodotHostTest.Helpers;
|
||||
using GodotHostTest.Interfaces;
|
||||
using R3;
|
||||
|
||||
namespace GodotHostTest.Game.Target;
|
||||
|
||||
public partial class TargetSpawner : Node2D, ITargetCollector, ITargetSpawner
|
||||
{
|
||||
private readonly List<ITarget> _availableTargets = [];
|
||||
|
||||
private readonly Subject<ITarget> _targetSpawned = new();
|
||||
[Export] public double TimeBetweenSpawns;
|
||||
|
||||
[Export] public required Timer Timer;
|
||||
|
||||
public void NewTarget(ITarget target)
|
||||
{
|
||||
_availableTargets.Add(target);
|
||||
target.Hit.Merge(target.TimedOut).Select(_ => target).Subscribe(MakeTargetAvailable).AddTo(this);
|
||||
}
|
||||
|
||||
public Observable<ITarget> TargetSpawned => _targetSpawned.AsObservable();
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
Spawn();
|
||||
Timer.Start(TimeBetweenSpawns);
|
||||
}
|
||||
|
||||
private void MakeTargetAvailable(ITarget target)
|
||||
{
|
||||
_availableTargets.Add(target);
|
||||
}
|
||||
|
||||
private void OnTimer()
|
||||
{
|
||||
Spawn();
|
||||
}
|
||||
|
||||
private void Spawn()
|
||||
{
|
||||
// pick a random target
|
||||
var randomIndex = GD.RandRange(0, _availableTargets.Count - 1);
|
||||
var target = _availableTargets[randomIndex];
|
||||
_availableTargets.RemoveAt(randomIndex);
|
||||
|
||||
// enable it
|
||||
target.Enable();
|
||||
|
||||
// notify that a target has been spawned
|
||||
_targetSpawned.OnNext(target);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
_targetSpawned.Dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user