ПрограммированиеФорумОбщее

Организация состояний (меню <=> игра <=>)

#0
19:12, 19 апр 2012

Привет!

Вопрос для опытного девелопера является смешнам, но я  восновном работал с готовыми игровыми движками вроде unity, теперь вот возникла необходимость писать всё самому.
В связи с этим прошу подсказать, как наилучшим образом организовать игровые состояния, главное меню, геймлей1, геймплей2.

Допустим есть игра, в которой кроме главного меню, титров есть разные механизмы геймлея - полёт на самолёте, езда на танке, паззл.

switch и case как-то не очень,
Указатели на ф-ию, или указатель на базовый класс, ну вроде:

class Game
{
    Game() {}
    virtual ~Game() {}    

    virtual void Load() = 0;
    virtual void Unload() = 0;

    virtual void Update(float deltaTime) = 0;
    virtual void Render() = 0;
};

class MainMenu : public Game {...};
class AirplaneFly : public Game {...};
class TankDrive : public Game {...};
class PazzleMode : public Game {...};
class Credits : public Game {...};

А в недрах главного цикла есть указатель на Game, который выставляется на нужного наследника, который имеет необходимую реализацию ф-ий.

Это нормальное решение?

#1
19:14, 19 апр 2012

Riddik
У нас похоже сделано, все работает.

#2
19:16, 19 апр 2012

Помеха
Для мобильных платформ тоже?
Таблица виртуальных ф-ий вроде не медленнее того же  старины switch работает, но мало ли?

#3
19:50, 19 апр 2012

Всё норм так работать будет.

#4
19:53, 19 апр 2012

Riddik
Хочешь сказать что switch убивает всю производительность в хлам?

#5
19:55, 19 апр 2012

Riddik
> Таблица виртуальных ф-ий вроде не медленнее того же  старины switch работает,
> но мало ли?
  Не о том думаете, если выбираете что будет меньше тормозить в меню :)

#6
20:00, 19 апр 2012
State

GameState : State (var GameScene, NetScene, PhysicScene, etc )


MenuState : State (var MenuScene)

StateManager : <State>
#7
20:06, 19 апр 2012

http://lspiroengine.com/?p=351
http://lspiroengine.com/?p=361

можешь ещё глянуть в исходниках 3-ей небулы.

а вообще,
https://www.google.com/search?&q=managing+game+states

#8
20:37, 19 апр 2012

Геймплей одно, UI другое. UI стартует геймплей, например AirplaneFly.Start(). Геймплей вызывает какие-то базовые(публичные) функции UI, например покажи PauseMenu. Они чуть-чуть знают друг о друге, но живут параллельно.

#9
22:13, 19 апр 2012

Всем спасибо!

nes
> Хочешь сказать что switch убивает всю производительность в хлам?
Нет. Хочу сказать, что на первый взгляд этот вариант не очень удобен.

Zefick
> Не о том думаете, если выбираете что будет меньше тормозить в меню :)
Только не в меню, а в более тяжелых сценах)

#10
22:26, 19 апр 2012

Работа с состояниями организуется через обычную state machine-у (машину состояний).
Это же классический алгоритм.

#11
23:06, 19 апр 2012

Хм. Если так делать, как написано в ссылках - то память всё растёт и растёт, ведь очистка памяти идёт только при выходе из программы.
Допустим:
Главное меню, потом запихивается геймплей1, а когда будет геймплей2 в памяти будет хранится и меню и геймплей1.

#12
0:32, 20 апр 2012

Lazer
А что мешает добавить выгрузку предыдущего состояния перед загрузкой следующего?

#13
11:25, 20 апр 2012

Riddik
> Для мобильных платформ тоже?
да, именно для мобильных платформ.

ПрограммированиеФорумОбщее

Тема в архиве.