fix: World adds and removes now detached from tick loop
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
void dxd::sim::Aircraft::tick(float timestep, World *world)
|
||||
{
|
||||
(void)world;
|
||||
|
||||
_position = _position + polar_to_vec2(_direction, _speed) * timestep;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user