Сообщение от Randomize
Ужас! Вот честно! Не легче ли:
Type TState Abstract Global Current:TState Method Update() Abstract Method Draw() Abstract EndType TState.Current = New TGameState Repeat TState.Current.Update() TState.Current.Draw() Flip() Until Keyhit(Key_Escape) Type GameState Extends TState Field PlayerName$ = "LoL" Method Update() EndMethod Method Draw() DrawText("Player name: "+PlayerName,0,0) EndMethod EndType Type GameOverState Extends TState Method Update() EndMethod Method Draw() DrawText("Nice try, ass hole!",0,0) EndMethod EndType
Нужно ещё добавить Init() и Destroy() для стейтов и будет ещё лучше.
|
Хмм....весьма примитивно и снова не гибко.
На самом деле твой метод ужасен.
Зачем плодить отдельные классы на состояния?
Init() и Destroy() для игрового состояния - это вообще бред.
Во вторых при твоем подходе весьма затруднительно будет комбинировать стейты между собой, а тут все просто : CreateEvent(GAME_WORLD_DRAW_ONLY | GAME_PAUSE).Emit() - дали команду движку что приложение находится в паузе. А движок уже сам допиливает этот флаг ( рисовать но не обновлять мир + рисовать и обновлять меню паузы). флаг GAME_PAUSE - отвечает только за отрисовку потемневшего задника + обновление и отрисовку менюхи, а за застывший задний кадр отвечает впередиидущий флаг состояния. На то она и гибкость - что жестко ничего привязывать не надо.
Если тебя испугал тот громозкий код, то там происходит всего-то - инициализация при запуске программы, зато главный цикл - 3 строчки кода. И мне не надо запоминать и где то хранить переменные стэйтов, а вместо этого просто комбинировать 6-7 основных стэйт-флагов. =)
ЗЫ Во всех нормальных программах управление ядром осуществляется через события.