Работа с игровыми состояниями с различными ресурсами в C - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь написать простую игру, чтобы увидеть, как это делается. В моей текущей реализации я использую массив указателей на функции, и мой основной игровой цикл (раздетый) выглядит так:

while (stateid != STATE_EXIT) {
    handle_events[stateid] ();
    logic[stateid] ();
    render[stateid]();
    change_state(); // change state id, and load new state
}

Таким образом, я могу вызывать различные функции в зависимости от состояния игры. Состояние игры может быть чем-то вроде заголовка, меню или уровня1 и т. Д. Поскольку каждое состояние имеет разные ресурсы, у меня также есть функции загрузки и выгрузки для каждого состояния, вот как change_state выглядит (вырезано)

if (nextstate != STATE_NULL) {
    unload_level[stateid] ();
    load_level[nextstate]();
    stateid = nextstate;
    nextstate = STATE_NULL;
}

Для обработки разных ресурсов в разных игровых состояниях я создал глобальный указатель на пустоту. Этот глобал может указывать на struct game или struct title в зависимости от состояния игры. Например, когда вызывается load_level [STATE_TITLE], создается struct title, и глобальному указателю void присваивается его адрес. Итак, функции состояния игры могут использовать это так:

void logic_game()
{
    struct game *resources = (struct game *) globalvoidpointer;
    // do stuff with resources...
}

Но все это не кажется правильным. Мне кажется, что он слишком силен и собран для меня. Как бы вы предложили мне управлять ресурсами и состояниями игры? (или, скажем так, если это не слишком сложно, и я должен придерживаться этого.)

1 Ответ

0 голосов
/ 15 марта 2012

Я подозреваю, что дизайн слишком продуман.

Отложите этот аспект архитектуры на некоторое время. Затем приложите некоторые усилия к тому, чтобы сделать набросок того, что две разные реализации stateid будут делать для handle_events(), logic() и render(). Вы, вероятно, обнаружите, что абстракции для ресурсов не нужны. Самого stateid, вероятно, более чем достаточно, чтобы различать, что нужно сделать.

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