Как реализовать пошаговый игровой движок?

17

Давайте представим игру, подобную Heroes of Might and Magic, или Master of Orion, или вашу пошаговую игру по выбору. Какая логика игры стоит за следующим ходом? Есть ли какие-либо материалы или книги для чтения на эту тему? Чтобы быть конкретным, давайте представим игровой цикл:

void eventsHandler(); //something that responds to input
void gameLogic(); //something that decides whats going to be output on the screen
void render(); //this function outputs stuff on screen

Все они звонят, скажем, 60 раз в секунду. Но как пошагово входит сюда? Я мог бы представить, что в gameLogic () есть функция вроде endTurn (), которая происходит, когда игрок нажимает на эту кнопку, но как мне все это обработать? Нужны идеи.

Dvole
источник

Ответы:

21

Пошаговая игра будет управляться конечным автоматом . По сути, вы бы выложили ряд состояний, которые могут встречаться в логическом порядке.

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

Например

  • State - сменить игрока
    • теперь ход игрока 1
  • Действия разрешены
    • атака
      • выбрать врага для атаки
    • защищать
      • выберите юнит для защиты
    • переместить юнит
      • выберите юнит для перемещения
      • проверить, чтобы движение было разрешено
    • и т.д

Очевидно, это будет развиваться довольно быстро, так как я только набросал крайне ограниченный план. Хорошее понимание возможных состояний на раннем этапе будет означать, что вы должны быть в хорошем состоянии для реализации. Я бы хотел подчеркнуть, как именно вы хотите, чтобы игра работала ... хорошая пошаговая игра требует большого планирования IMO.

the_e
источник
Мой довольно старый школьный проект, который был 3-месячной попыткой разработки Final Fantasy Tactics :) Использует конечный автомат (на самом деле несколько из них), как описано выше. sourceforge.net/projects/bpfat
Джеймс
Эй, а как насчет Game Engine для пошаговой стратегии? Не могли бы вы что-нибудь посоветовать? Может быть Unreal Engine может подойти?
Рантьев
Каждому свое. Если вы знакомы с движком Unreal, в этом нет ничего плохого. Просто зависит, какой механикой вы хотите воспользоваться. Быстрый поиск показывает, что для движка Unreal существует актуальный инструментарий, помогающий создавать пошаговые стратегические игры, хотя он и не бесплатный.
the_e
3

Недавно я создал пошаговую стратегическую игру, похожую на Master of Orion (сейчас это только для одного игрока, многопользовательская игра была бы немного сложнее, но похожая идея), вот как выглядит моя логика функции endTurn (в моем основной класс игрового контроллера):

//for all computer players:
computerTakeTurn(player)

//for all players
moveShips(player)

//for all players
endTurn(player)//see this function below

//for all planets
planet.repairFleet()

//for all players
resolvePlanetaryConflicts(player)

//check to see if any players were destroyed or if the game is over
checkPlayerDestroyedAndGameOver()

Моя функция завершения хода игрока будет выполнять функции, специфичные для этого игрока, на которые не влияет порядок, в котором они находятся между игроками:

eatAndStarve()

generatePlayerResources()

buildPlayerPlanetImprovements()

growPlayerPlanetPopulation()

Где это уместно, эти функции возвращают сообщения о состоянии и / или запускают события, чтобы графический интерфейс мог показать, что произошло во время хода, или сообщить игроку, что компьютер был разрушен и т. Д.

Мэтт Палмерли
источник
Не могли бы вы предоставить исходный код только для проверки? Было бы здорово помочь. Просто для образовательных целей.
Дволе
@Dvole В настоящее время я работаю над преобразованием кода из Silverlight / C # в JavaScript с помощью тега HTML5 canvas. Как только я закончу, я планирую открыть исходный код, и в то время вы можете увидеть, как именно я реализовал эту функцию. Если это поможет понять контекст, вы можете сыграть в мою космическую стратегию здесь: Астриарх - Правитель звезд
Мэтт Палмерли,
2
@Dvole Это заняло у меня довольно много времени, но я только что открыл версию Astriarch в Silverlight. Если вы все еще заинтересованы, вы можете скачать исходный код с github здесь: github.com/mpalmerlee/Astriarch/tree/Silverlight
Matt Palmerlee