From 7ad3d437f84c95d6a81e82835d10b4892eeef36c Mon Sep 17 00:00:00 2001 From: Diogo Diniz Date: Fri, 17 Apr 2026 14:06:09 +0100 Subject: [PATCH] fix: World adds and removes now detached from tick loop --- src/sim/af_spawner.cpp | 4 +++- src/sim/af_spawner.hpp | 2 +- src/sim/aircraft.cpp | 2 ++ src/sim/airfield.cpp | 4 +++- src/sim/world.cpp | 18 ++++++++++++++++++ src/sim/world.hpp | 18 ++++++------------ 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/sim/af_spawner.cpp b/src/sim/af_spawner.cpp index 033fe65..6ec9179 100644 --- a/src/sim/af_spawner.cpp +++ b/src/sim/af_spawner.cpp @@ -2,7 +2,9 @@ void dxd::sim::AFSpawner::tick(float timestep, World *world) { - if (_next_spawn-- == 0) + (void)timestep; + + if (_next_spawn-- != 0) return; _next_spawn = 60 + SDL_rand(120); diff --git a/src/sim/af_spawner.hpp b/src/sim/af_spawner.hpp index 6acb109..f49f6aa 100644 --- a/src/sim/af_spawner.hpp +++ b/src/sim/af_spawner.hpp @@ -23,7 +23,7 @@ public: } void tick(float timestep, World *world) override; - void draw(Renderer *rend) override {} + void draw(Renderer *rend) override { (void)rend; } }; } // namespace dxd::sim diff --git a/src/sim/aircraft.cpp b/src/sim/aircraft.cpp index a372e26..3b383db 100644 --- a/src/sim/aircraft.cpp +++ b/src/sim/aircraft.cpp @@ -2,6 +2,8 @@ void dxd::sim::Aircraft::tick(float timestep, World *world) { + (void)world; + _position = _position + polar_to_vec2(_direction, _speed) * timestep; } diff --git a/src/sim/airfield.cpp b/src/sim/airfield.cpp index 5ef2c4b..9292c5a 100644 --- a/src/sim/airfield.cpp +++ b/src/sim/airfield.cpp @@ -3,9 +3,11 @@ void dxd::sim::Airfield::tick(float timestep, World *world) { + (void)timestep; + if (--_ttl == 0) { - //world->remove_obj(this); + world->remove_obj(this); return; } diff --git a/src/sim/world.cpp b/src/sim/world.cpp index f2c48c5..3e3eeae 100644 --- a/src/sim/world.cpp +++ b/src/sim/world.cpp @@ -6,6 +6,24 @@ void dxd::sim::World::tick(float timestep) { obj->tick(timestep, this); } + + for (auto remove : _pending_removes) + { + for (auto it = _objs.begin(); it != _objs.end(); ++it) + { + if (*it == remove) + { + _objs.erase(it); + break; + } + } + } + + for (auto add : _pending_adds) + _objs.push_back(add); + + _pending_adds.clear(); + _pending_removes.clear(); } void dxd::sim::World::draw(Renderer *rend) diff --git a/src/sim/world.hpp b/src/sim/world.hpp index cf88080..fa9e229 100644 --- a/src/sim/world.hpp +++ b/src/sim/world.hpp @@ -15,25 +15,19 @@ class World private: vec2 _size; std::vector _objs; + std::vector _pending_removes; + std::vector _pending_adds; public: World(vec2 size) : _size(size) { _objs = std::vector(); + _pending_adds = std::vector(); + _pending_removes = std::vector(); } - void add_obj(WorldObject *obj) { _objs.push_back(obj); } - void remove_obj(WorldObject *obj) - { - for (auto it = _objs.begin(); it != _objs.end(); ++it) - { - if (*it == obj) - { - _objs.erase(it); - break; - } - } - } + void add_obj(WorldObject *obj) { _pending_adds.push_back(obj); } + void remove_obj(WorldObject *obj) { _pending_removes.push_back(obj); } void tick(float timestep); void draw(Renderer *rend);