Я пишу игру на OpenGL + C ++.
Единственный способ создать анимацию - определить бесконечный цикл внутри glutDisplayFunc
. И я сделал. Но представьте, что у меня разные gameObjects, и у каждого из них есть функция draw()
.
Но я хочу, чтобы функция добавила другой объект. Поскольку я держу их в массиве указателей, эта функция выглядит следующим образом:
void display() {
while (running) {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
glClear(GL_COLOR_BUFFER_BIT); // Clear the color buffer
if(objects_count != 0)
for(unsigned int i = 0; i< objects_count - 1; i++) {
(objects + i)->drawAsPoint();
}
glFlush();
usleep(f60FPS);// Render now
}
}
bool addRenderableObjectSync(GameEntity *object) {
running = false;
if(objects_count + 1>= objects_capacity) {
//reallocating memory
objects_capacity = round(objects_capacity * 1.5f);
GameEntity * _new_objects = new GameEntity[objects_capacity];
for(unsigned int i = 0; i < objects_count; i++) {
_new_objects[i] = objects[i];
}
//now objects are safe to delete free
delete[] objects;
//now we move new array to objects and free the temporary one
objects = _new_objects;
delete[] _new_objects;
}
objects[objects_count] = *object;
objects_count++;
//delete *object as it no longer needed;
delete object;
return true; }
running
- это логическое значение, которое отвечает за цикл внутри функции отображения.
НО, draw-loop бесконечен, я думаю, что мне нужна некоторая асинхронная функция, которая может взломать состояние running
, например это:
void Renderer::addRenderableObject(GameEntity *object) {
//the reason we do it cause a game is in infinite loop which never ends
//so we stop the game, add an object, and after fn finish we let it run again
std::future<bool> fut = std:: async(addRenderableObjectSync, object);
running = fut.get();
}
Это правильное решение? Или есть более подходящие подходы?