Основы трехмерной графики в среде Blitz3D


Физическая модель прыжка (15 мин)


Это задание выходит за рамки временного интервала урока, поэтому его лучше провести отдельно.

Теперь добавим возможность прыжка. Для этого необходимо ввести еще одну переменную - ry#, а также приращение  dy#:

ry# = -8

dy# = 0

Затем, вводим условие: если нажата клавиша "пробел" и робот стоит на земле (т.е. координата ry# = -8), то задаем импульс -приращение, равное 2

IF KEYDOWN(57) THEN

 IF ry# = -8 THEN dy# = 2

END IF

Прибавляем к переменной ry# приращение:

ry# = ry# + dy#

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

dy# = dy# - 0.1

Причем, координата робота ry# не должна быть меньше -8 (робот не должен опускаться ниже плоскости), поэтому введем следующее условие:



IF ry# < -8 THEN ry# = -8: dy# = 0

Поменяем также фиксированную координату -8 в команде POSITIONENTITY на ry#. Измененный модуль выглядит теперь вот так:

robot = LOADANIMMESH( "C:\media\standing.3ds" )

LOADANIMSEQ robot, "C:\media\running.3ds"

SCALEENTITY robot, 0.4, 0.4, 0.4

rx# = 10

ry# = -8

rz# = 0

dy# = 0

ang = 90

REPEAT

 

 POSITIONENTITY robot, rx#, ry#, rz#

 ROTATEENTITY robot, 0, ang + 90, 0

 POINTENTITY cam, robot

 IF KEYDOWN(57) THEN

  IF ry# = -8 THEN dy# = 2

 END IF

 ry# = ry# + dy#

 dy# = dy# - 0.1

 IF ry# < -8 THEN ry# = -8: dy# = 0

 IF KEYDOWN(200)

  IF ANIMSEQ(robot) = 0 THEN ANIMATE robot, 1, 0.5, 1, 10

  rx# = rx# + COS(ang) * 0.5

  rz# = rz# + SIN(ang) * 0.5

 ELSE

  IF ANIMSEQ(robot)=1 THEN ANIMATE robot, 2, 1, 0, 10

 END IF

 IF KEYDOWN(203) THEN ang = ang + 5

 IF KEYDOWN (205) THEN ang = ang - 5

 IF KEYDOWN(1) THEN EXIT

 UPDATEWORLD

 RENDERWORLD

 FLIP

FOREVER

Урок 7 – спрайты, поверхности



Содержание раздела