DiNGS – программирование игр в домашних условиях. Часть 6
АрхивПрограммазм (архив)Фон, коллизии. Программа управления битой и мячом.
Загрузка фона в игре.
LOADBMP "fon.bmp"
Фоном может служить любая картинка. Чтобы она покрывала весь экран размер должен соответствовать 640х480. Что на ней изобразить зависит только от девелопера данной игры.
Команду LOADBMP необходимо поставить до начала цикла While ... Wend
В итоге получится уровень игры с симпатичным фоном, но… Я как раз не рекомендовал бы использовать фон таким образом. На мой взгляд, его лучше сделать спрайтами, чтобы иметь возможность оживить, придать динамизм, движение.
Коллизия – столкновение спрайтов. В DiNGS за это отвечает оператор BOXCOLL.
В качестве аргументов BOXCOLL получает значение 1 если между двумя указанными объектами произошло столкновение и 0 – если столкновения не было.
BOXCOLL col, ballX, ballY, 16, 16, bitaX, bitaY, 20, 50
Col = переменная при столкновении объектов получающая значение 1.
ballX – координата Х первого объекта – мяча
ballY - координата Y первого объекта – мяча
16 - размер объекта по Х
16 - размер объекта по Y
То есть мяч имеет размер 16 на 16 пикселей. Это можно узнать, открыв картинку в графическом редакторе (Photoshop, GIMP) и посмотрев «размер изображения».
bitaX - координата Х второго объекта – биты
bitaY - координата Y второго объекта – биты>
20 - размер биты по Х
50 – размер биты по Y
Разместив BOXCOLL в цикле мы обеспечим постоянную проверку на столкновение 2-х объектов – биты и мяча. Но как этим воспользоваться?
Прочитать значение переменной col и в соответствии с ее значением произвести определенные действия – изменить направление полета мяча и тд.
Пример:
IF col=1 // если произошло столкновение PRINT "COLLISION YES", 320, 240 //Вывести надпись: Collision yes ENDIF
Давайте напишем программу, где мяч будет отлетать от стен, а мы его к тому же сможем отбивать битой. Если мы пропустим мяч, то потеряем одну из 3-х жизней. При потере последней жизни игра завершится, выведя известную всем игрокам надпись «GAME OVER». Это уже действительно игра, в которую можно играть и она имеет смысл. Итак, начало:
//Инициализируем переменные LIVES=3 //жизней 3 Minus_Lives=0 //обнуляем триггер //Загружаем спрайты в память LOADSPRITE "ball.bmp", 0 // загрузить картинку мяча в ячейку № 0 LOADSPRITE "bita.bmp", 1 // загрузить картинку биты в ячейку № 1 // задаем первоначальное направление полета – влево вверх UP=1 LEFT=1 // задаем первоначальные координаты мяча Ball_X=640/2 //середина экрана Ball_Y=480/2 //середина экрана // задаем первоначальные координаты биты Bita_X=600 // у правого края экрана Bita_Y=480/2 //середина экрана //Загрузим фоновую картинку в игру размером 640х480 LOADBMP "fon.bmp" // НАЧАЛО ИГРЫ WHILE KEY(1)=0 //начало цикла игры – ее сердце SPRITE 1, Bita_X,Bita_Y,0 // вывести спрайт биты SPRITE 0, Ball_Х,Ball_Y,0 // вывести спрайт мяча (шара) //Проверяем мяч и биту на столкновение BOXCOLL Сol, Ball_X, Ball_Y, 16, 16, Bita_X, Bita_Y, 20, 50 // Если столкновение произойдет, то переменная Col станет равна 1 //УПРАВЛЕНИЕ БИТОЙ В ИГРЕ IF KEY(200)=1 THEN Bita_Y=Bita_Y-1 //если нажата клавиша – уменьшить координату биты по Y IF KEY(205)=1 THEN Bita_Y=Bita_Y+1 // увеличить координату биты по Y ////////////////////////// //Описываем условия, по которым движется мяч // Если вверх, то уменьшать Y If UP=1 Ball_Y=Ball_Y-1 ENDIF // Если вниз, то увеличивать Y If UP=0 Ball_Y= Ball_Y+1 ENDIF // Если влево, то уменьшать Х If LEFT=1 Ball_X= Ball_X-2 ENDIF // Если вправо, то увеличивать Х If LEFT=0 Ball_X= Ball_X+2 ENDIF // Описываем условие, переключающее триггеры. IF Ball_X<=0 THEN LEFT=0 IF Ball_X>=640 //если мяч упустили Minus_Lives=1 // задействуется спец-триггер ENDIF IF Ball_Y>=480 THEN UP=1 IF Ball_Y<=0 THEN UP=0 //Действия при срабатывании спец-триггера IF Minus_Lives=1 // если сработал триггер LIVES=LIVES-1 // уменьшить количество жизней PRINT "Live destroy",640/2,480/2 //Вывести надпись – «Жизнь уничтожена» в середину экрана PRINT "Press any key for Continue", 640/2, 520 //Вывести надпись: «Нажми клавишу мыши для продолжения игры» MOUSEWAIT // Игра остановится до щелчка мышью //Щелчок произведен, сбросим мяч в середину экрана Ball_X=640/2 Ball_Y=480/2 LEFT=1 //пусть начнет двигаться удаляясь от биты Minus_Lives=0 //обнулим триггер ENDIF //Опишем ситуацию когда жизни кончились IF LIVES<=0 PRINT "GAME OVER", 320,240 // Надпись: «Игра окончена» PRINT "YOU LUSER", 320,300 // Надпись: «Ты проиграл» PRINT "PRESS MOUSE" // Надпись: «Нажми клавишу мыши» MOUSEWAIT //ожидание нажатия мыши – требуется для того, // чтобы игрок смог прочитать надписи на экране GOTO GAME_END //Прыгнуть на метку GAME_END для выхода из игры ENDIF // Описываем условие, переключающее триггеры при столкновении с битой if Col=1 //Если есть столкновение LEFT=1 // разрешить движение влево Col=0 // переменную Col обнулить ENDIF // конец IF SHOWSCREEN // Показать все на экране монитора WEND // переход в начало цикла к оператору WHILE metka GAME_END: END
С натяжкой вышеприведенный текст можно назвать игрой. Мне пришлось несколько искусственно решить некоторые проблемы, т.к. я еще не объяснял вам, что такое счетчики. Поэтому я применил оператор MOUSEWAIT. Метки были введены в текст в качестве иллюстрации их использования – как раз та самая золотая середина, когда мы ими не злоупотребляем. Хотя справедливости ради стоит отметить, что на самом деле проще задать выход из игры при потере последней жизни в условии оператора WHILE...WEND.
Может также вызвать недоумение, почему это мы вдруг стали увеличивать координату X сразу на 2: «Ball_X=Ball_X+2», в то время как Ball_Y лишь на единицу. Дело в том, что, меняя число приращения мы можем изменять угол полета мяча. Для любопытных и экспериментаторов упомяну, что если задать изменение этих величин в игре динамически, то мы можем получить очень интересные траектории движений. Впрочем, об этом можно будет прочесть ниже. Помимо простейших траекторий, вы сможете узнать какая замечательная вещь для полетов мяча – синусы. Они используются практически во всех играх и позволяют получать очень красивые эффекты и траектории.
Наконец мы подошли к одной из интереснейших глав в этом обучении – АНИМАЦИИ!!! Настало время заставить ожить мир нашей игры. Добавим анимированные объекты движущиеся по своим траекториям и делающим полет мяча непредсказуемым, т.к. сталкиваясь с ними мяч, изменяет направление полета.
(продолжение следует)