Я пытаюсь написать простую игру, чтобы увидеть, как это делается. В моей текущей реализации я использую массив указателей на функции, и мой основной игровой цикл (раздетый) выглядит так:
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...
}
Но все это не кажется правильным. Мне кажется, что он слишком силен и собран для меня. Как бы вы предложили мне управлять ресурсами и состояниями игры? (или, скажем так, если это не слишком сложно, и я должен придерживаться этого.)