fix: World adds and removes now detached from tick loop

This commit is contained in:
2026-04-17 14:06:09 +01:00
parent a1c0b5e97f
commit 7ad3d437f8
6 changed files with 33 additions and 15 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -2,6 +2,8 @@
void dxd::sim::Aircraft::tick(float timestep, World *world)
{
(void)world;
_position = _position + polar_to_vec2(_direction, _speed) * timestep;
}

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -15,25 +15,19 @@ class World
private:
vec2 _size;
std::vector<WorldObject*> _objs;
std::vector<WorldObject*> _pending_removes;
std::vector<WorldObject*> _pending_adds;
public:
World(vec2 size) : _size(size)
{
_objs = std::vector<WorldObject*>();
_pending_adds = std::vector<WorldObject*>();
_pending_removes = std::vector<WorldObject*>();
}
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);