Работа с состояниями игры с разными ресурсами в C

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

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;
}

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

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

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


person yasar    schedule 15.03.2012    source источник
comment
Возможно, вопрос к gamedev.stackexchange.com?   -  person Multimedia Mike    schedule 15.03.2012


Ответы (1)


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

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

person wallyk    schedule 15.03.2012