09 мая 2010

C + Lua == "Часть 3: Игровой цикл"

Привет. В статье С + Lua == "Часть 1: Вводная" я объяснил как вызвать C функцию из Lua и как вызвать Lua функцию из C. В статье С + Lua == "Часть 2: Гоблин мы ввели свой тип данных в Lua. Теперь давайте используем Lua как встраиваемый скриптовой язык.

Давайте я расскажу о игровом цикле. Сразу понятно что это цикл. В любой компьютерной игре в том или ином виде присутствует этот цикл. В общих чертах он должен делать следующее:

  1. Проверить что сделал игрок (например нажал кнопку вперед и выстрел).
  2. Проверить что сделал компьютер (например крыса увидела игрока и решила его съесть).
  3. Сделать все перемещения и действия (ударить, сдвинуться).
  4. Разрешить все коллизии (не дать пройти сквозь стену и т.д.).
  5. Нарисовать кадр.

Это общий, высосанный из пальца, план действий внутри игрового цикла. Что-то может отсутствовать, что-то добавиться, но суть останется та же.

Вернемся к Lua. Наш скрипт мы можем вызвать во 2 пункте, но лучше лишний раз не спрашивать компьютер о том что он хочет сделать, это значит, что, если не произошло ничего что могло бы изменить поведение гоблина в подземелье (компьютерного персонажа), не нужно вызывать скрипт (или функцию), заменяющий ему мозг. В 5 пункте тоже можно вызвать скрипт (хотя конечно скрипты можно вызывать где угодно), например что бы получить список объектов для вывода на экран, или например что бы нарисовать интерфейс пользователя (например полоску здоровья).

Для примера я написал совсем простую программку. Код на C не представляет особого интереса, ничего нового по сравнению с прошлыми частями там не появилось. Скрипт на Lua используется для рисования кадров. В функция main передается прошедшее время с прошлого кадра, состояние (нажата ли кнопка) клавиши вперед, назад, влево, вправо, огонь (он же выстрел).

В общем-то и все, это просто пример того как Lua может быть использован внутри другой программы.

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

Пока.