16. Первая 3Д игра. Часть 6 – завершение И
вот теперь только мы готовы к тому, чтобы создать остальные части игры – это
Стартовый экран и экран Гейм Овера (можно было бы и больше, конечно, но нам
хватит J). Для
начала введём переменную, в которой будет находится информация о том, какой
экран мы сейчас показываем. Ну, назовём её GameScr, а значения она будет принимать: 0 - стартовый экран,
6 - Экран Гейм Овера, и, например 9 – экран самой игры.
Т.е.
начинаться у нас будет со стартового экрана. Теперь
изменения пойдут в главном цикле. После которых он будет выглядеть вот так:
Вы
хотите узнать, что это за команды - Select и Case? Ну, это просто команды условия. Например, нам нужно
что-то делать, в зависимости от того, какое значение принимает переменная variable. Можно написать так: If variable=0 then … EndIf If variable=1 then … EndIf If variable=2 then … EndIf If variable=3 then … EndIf If variable=4 then … EndIf А
можно – так: Select variable Case 0 … Case 1 … Case 2 … Case 3 … Case 4 … End Select Достоинства
последнего метода перечислять не буду J… Дальше,
в зависимости от того, какое значение у переменной GameScr, выполняются определённые действия… т.е. если GameScr=9 (идёт сама игра),
то мы вызываем функции UpdateGame(), в которую мы поместили все наши команды игры. А если GameScr=0, мы должны
показывать стартовый экран. Мы вызываем функцию UpdateStartScreen(), которую сейчас
напишем. Так,
стартовый экран у нас будет выглядеть таким образом: сверху большими буквами
название – “First Game”, например, а снизу две опции – Start и Quit. Всё это будем делать текстом. Для этого нам нужно
загрузить шрифт (два шрифта точнее):
Эти
строчки поставьте после команд инициализации графики. Синтакс:
LoadFont (название,размер) – загружает шрифт. По-моему, всё ясно… J Теперь
создадим саму функцию UpdateStartScreen()
Так,
экран сделали, теперь нам нужен курсор. Как сделать курсор? Так как наша игра
никаких внешних ресурсов до сих пор не использовала, здесь тоже обойдёмся без
картинок… Более того, я вообще предлагаю вместо курсора текст использовать,
точнее символ «*»… Вот
как это сделать (вставить в функцию):
Получился
жёлтый курсор. Однако кликание на текст ничего не даёт... Нам нужна проверка
– не находится ли курсор над надписью Start или Quit.
Всё
очень просто (хотя это и 2Д J)… Здесь мы используем команды RectsOverlap – она
проверяет, не пересекаются ли заданные прямоугольники. Синтакс:
RectsOverlap (X коорд. прямоугольника 1, Y коорд.
прямоугольника 1, Ширина прямоугольника 1, Высота прямоугольника 1, X коорд.
прямоугольника 2, Y коорд. прямоугольника 2, Ширина прямоугольника 2,
Высота прямоугольника 2) X и Y координаты
– левого верхнего угла прямоугольника.
Эти
команды нужно вставить в начало функции. Теперь
мы у нас есть курсор и мы знаем, когда он находится над “Start” и ”Quit”. Теперь
надо сделать так, чтобы цвет текста менялся, когда курсор будет наведён на
него, так что немного перепишем строки:
Так,
интерактивность (хоть и примитивная, но хотя бы что-то J)
присутствует, осталось только заставить это работать. Для этого нужно поставить
в конец функции вот эти строчки:
Здесь
у нас идёт проверка на нажатие левой кнопки. Затем, если курсор находится над
Start`ом, происходит инициализация (мы её из начала кода
вырезали), и меняется переменная GameScr, так, что
со следующим кадром покажется уже не стартовый экран, а сама игра. Ну, а если
курсор над кнопкой Quit, то программа просто выходит… Дальше,
теперь нам надо сделать так, чтобы при проигрыше или нажатии кнопки Esc, игра выходила на стартовый экран. Но перед этим,
показывала экран ГеймОвера. Для этого внесём некоторые изменения в функцию UpdateGame(): Во
первых сменим строчку, где игра заканчивается при столкновении с кубиком
на эту:
Теперь
игра будет очищаться и выходить на экран геймовера. И теперь у нас будет
только один способ (без нажатия Ctrl+Alt+Del J)
выйти из игры – нажать Quit или Esc на стартовом экране. Поэтому немного поменяем условие в
главном цикле:
…на :
Quit – будет нашей
переменной, которая будет показывать, что на этом шаге игра выходит… Сначала
создадим её (в самом начале программы есь-сно, где мы задаём остальные
глобальные переменные):
False будет обозначать,
что, типа, игра не выходит ещё… И
сделаем некоторые изменения в функции UpdateStartScreen()
поменяем
на:
И
добавим ещё условие:
Так,
вот уже почти всё, осталось только сделать сам экран Геймовера, о котором мы
тут столько говорим J… В
главный цикл вставляем строчки Select`овского
условия:
Здесь
у нас описан экран Геймовера: Что здесь и как – объясняю по порядку: Сначала
очищаем первую поверхность, флипим, очищаем вторую, устанавливаем шрифт, цвет
и пишем Гейм Овер, опять флипим, ждём одну секунду (1000 миллисекунд)
командой FlushKeys очищаем
список всех нажатых клавиш (если была нажата Esc игра выйдет, дойдя
до условия в функции UpdateStartScreen()), и меняем переменную GameScr на 0… вот экран
Гейм Овера и готов… J. На
этом можно и закончить – мы сделали хоть и примитивную, но всё-таки
полноценную игру!!! Практически можно поздравить вас, что вы всё-таки
заставили себя дочитать это до конца, ну и себя самого, за то что этот кошмар
под названием «писать туториал» позади J. Я постарался показать (хотя бы мельком) все аспекты
программирования игры. Кстати, они не очень сильно отличаются от более
«серьёзных» проектов, в которых просто больше элементов. Так что вы теперь
готовы к писанию своих игрушек!!! Вот
весь код нашей получившейся в итоге игры:
|
Оглавление: 0. Введение 5. 2Д в 3Д 7. Родительская зависимость или Привязки 9. Коллизион Детекшн или как устроен мир… 10. Первая 3Д игра. Часть 0 – основы движка 11. Первая 3Д игра. Часть 1 – разработка движка 12. Первая 3Д игра. Часть 2 – устранение багов 13. Первая 3Д игра. Часть 3 – внешний вид 14. Первая 3Д игра. Часть 4 – от массива к спискам 15. Первая 3Д игра. Часть 5 – оптимизация кода 16. Первая 3Д игра. Часть 6 – завершение 17. Выведение |