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("ParticlesNodes"); GD.Randomize(); _particleSimulation = new ParticleSimulation { ScreenSize = GetViewportRect().Size * 1.25f }; _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(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("res://ParticleNode.tscn"); var particleNode = particleScene.Instance(); particleNode.Name = id.ToString(); particleNode.SimulationId = id; _particleNodes.AddChild(particleNode); } }