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