Продолжаем оживлять наш код для Дингс 3д и продолжим развитие игры про пинболл. Для осуществления движения необходимо задать границы экрана. для нашего разрешения - это Y=480 - движение вверх, X=640 - для движения влево.
для DiNGS это будет реализовано следующим образом:

// действия при разных положениях триггера
If ON=1
Y=Y-1
ENDIF
If ON=0
Y=Y+1
ENDIF
If LEFT=1
X=X-1
ENDIF
If LEFT=0
X=X+1
ENDIF
// Условия для переключения триггера
IF X<=0 THEN LEFT=0
IF X>=640 THEN LEFT=1
IF Y>=480 THEN ON=1
IF Y<=0 THEN ON=0

Стоит отметить, что движение, посредством приращения постоянного числа не даст реальной картины. Желательно использование счётчиков и триггеров, о них речь пойдёт ниже, так как это более сложные алгоритмы для нашей первой игры.
Готовый исходник, где что-то движется по заранее заданной траектории

LOADSPRITE "ball.bmp", 0 // картинку мячика в ячейку № 0
LOADSPRITE "bita.bmp", 1 // загрузить биту в ячейку № 1
// задаем первоначальное направление полета – влево вверх
ON=1
LEFT=1
// задаем первоначальные координаты мяча
Ball_X=640/2
Ball_Y=240
// НАЧАЛО ИГРЫ
WHILE KEY(1)=0
//начало цикла игры – ее сердце
SPRITE 1, 600,240,0
// спрайт биты
SPRITE 0, Ball_Х,Ball_Y,0
// спрайт мяча (шара)
If ON=1
Ball_Y=Ball_Y-1
ENDIF
If ON=0
Ball_Y= Ball_Y+1
ENDIF
If LEFT=1
Ball_X= Ball_X-1
ENDIF
If LEFT=0
Ball_X= Ball_X+1
ENDIF
// Описываем условие переключающее триггеры.
IF Ball_X<=0 THEN LEFT=0
IF Ball_X>=640 THEN LEFT=1
IF Ball_Y>=480 THEN ON=1
IF Ball_Y<=0 THEN ON=0
SHOWSCREEN
// Показать все на экране монитора
WEND
// переход в начало цикла к оператору WHILE
END

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

LOADBMP "fon.bmp"

Фоном может быить изображение, соответствующее рабочему разрешению игры.
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 в пикселях (его можно узнать в любом графическом редакторе, открыв в нём изображения и посмотрев его свойства)
изображения».
bitaX, bitaY - координаты Х, Y биты

20Х50 – размер биты по Х и Y

Поставим оператор BOXCOLL в цикл, тем самым мы обеспечиваем постоянную проверку на факт столкновения. Осталось только определить, как этим воспользоваться.

Напрмер, можно прочитать прочитать переменную 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
// задаем первоначальное направление полета – влево вверх
ON=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 ON=1
Ball_Y=Ball_Y-1
ENDIF
// Если вниз, то увеличивать Y
If ON=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 ON=1
IF Ball_Y<=0 THEN ON=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

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

(Visited 104 times, 1 visits today)