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)
|
void dxd::sim::AFSpawner::tick(float timestep, World *world)
|
||||||
{
|
{
|
||||||
if (_next_spawn-- == 0)
|
(void)timestep;
|
||||||
|
|
||||||
|
if (_next_spawn-- != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_next_spawn = 60 + SDL_rand(120);
|
_next_spawn = 60 + SDL_rand(120);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void tick(float timestep, World *world) override;
|
void tick(float timestep, World *world) override;
|
||||||
void draw(Renderer *rend) override {}
|
void draw(Renderer *rend) override { (void)rend; }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace dxd::sim
|
} // namespace dxd::sim
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
void dxd::sim::Aircraft::tick(float timestep, World *world)
|
void dxd::sim::Aircraft::tick(float timestep, World *world)
|
||||||
{
|
{
|
||||||
|
(void)world;
|
||||||
|
|
||||||
_position = _position + polar_to_vec2(_direction, _speed) * timestep;
|
_position = _position + polar_to_vec2(_direction, _speed) * timestep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
|
|
||||||
void dxd::sim::Airfield::tick(float timestep, World *world)
|
void dxd::sim::Airfield::tick(float timestep, World *world)
|
||||||
{
|
{
|
||||||
|
(void)timestep;
|
||||||
|
|
||||||
if (--_ttl == 0)
|
if (--_ttl == 0)
|
||||||
{
|
{
|
||||||
//world->remove_obj(this);
|
world->remove_obj(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,24 @@ void dxd::sim::World::tick(float timestep)
|
|||||||
{
|
{
|
||||||
obj->tick(timestep, this);
|
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)
|
void dxd::sim::World::draw(Renderer *rend)
|
||||||
|
|||||||
@@ -15,25 +15,19 @@ class World
|
|||||||
private:
|
private:
|
||||||
vec2 _size;
|
vec2 _size;
|
||||||
std::vector<WorldObject*> _objs;
|
std::vector<WorldObject*> _objs;
|
||||||
|
std::vector<WorldObject*> _pending_removes;
|
||||||
|
std::vector<WorldObject*> _pending_adds;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
World(vec2 size) : _size(size)
|
World(vec2 size) : _size(size)
|
||||||
{
|
{
|
||||||
_objs = std::vector<WorldObject*>();
|
_objs = std::vector<WorldObject*>();
|
||||||
|
_pending_adds = std::vector<WorldObject*>();
|
||||||
|
_pending_removes = std::vector<WorldObject*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_obj(WorldObject *obj) { _objs.push_back(obj); }
|
void add_obj(WorldObject *obj) { _pending_adds.push_back(obj); }
|
||||||
void remove_obj(WorldObject *obj)
|
void remove_obj(WorldObject *obj) { _pending_removes.push_back(obj); }
|
||||||
{
|
|
||||||
for (auto it = _objs.begin(); it != _objs.end(); ++it)
|
|
||||||
{
|
|
||||||
if (*it == obj)
|
|
||||||
{
|
|
||||||
_objs.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void tick(float timestep);
|
void tick(float timestep);
|
||||||
void draw(Renderer *rend);
|
void draw(Renderer *rend);
|
||||||
|
|||||||
Reference in New Issue
Block a user