Как запустить игровой цикл и изменить его объекты? - PullRequest
0 голосов
/ 17 ноября 2018

Я пишу игру на 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();
}

Это правильное решение? Или есть более подходящие подходы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...