particles/Main.cs

64 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Godot;
using Particles;
public class Main : Node2D
{
private ParticleSimulation _particleSimulation;
private Node2D _particleNodes;
public override void _Ready()
{
_particleNodes = GetNode<Node2D>("ParticlesNodes");
GD.Randomize();
_particleSimulation = new ParticleSimulation
{
ScreenSize = GetViewportRect().Size
};
_particleSimulation.Initialize();
foreach (var id in _particleSimulation.LastParticlesAdded)
{
CreateParticleNode(id);
}
}
public override void _Process(float delta)
{
if (Input.IsActionJustPressed("quit")) GetTree().Quit();
if (Input.IsActionJustPressed("reset")) GetTree().ReloadCurrentScene();
}
public override void _PhysicsProcess(float delta)
{
_particleSimulation.Update();
foreach (var id in _particleSimulation.LastParticlesRemoved)
{
var particleNode = _particleNodes.GetNode<ParticleNode>(id.ToString());
particleNode.Free();
}
foreach (var id in _particleSimulation.LastParticlesAdded)
{
CreateParticleNode(id);
}
var particleNodes = _particleNodes.GetChildren();
foreach (ParticleNode particleNode in particleNodes)
{
var simulationParticle = _particleSimulation.GetParticle(particleNode.SimulationId);
particleNode.Position = simulationParticle.Position;
particleNode.SetColor(simulationParticle.Type.Hue, simulationParticle.Health);
}
}
private void CreateParticleNode(int id)
{
var particleScene = GD.Load<PackedScene>("res://ParticleNode.tscn");
var particleNode = particleScene.Instance<ParticleNode>();
particleNode.Name = id.ToString();
particleNode.SimulationId = id;
_particleNodes.AddChild(particleNode);
}
}