РУКОВОДСТВО ПО СОЗДАНИЮ 3D-ИГР III. ИГРА 11. Как вести счет Цель урока: показать, как ведется счет игры.
В этом уроке мы покажем, как отслеживать счет игры для игрока и монстра, а также как перемещать игрока и монстра в новое положение, когда их поражает снаряд или ракета.
Gosub PlaceMonster Gosub PlacePlayer
Мы поместили две команды "Gosub" до основного цикла. Соответствующие подпрограммы помещают игрока и монстра на случайные позиции матрицы.
PlaceMonster: mX#=X# mZ#=Z# mY#=Y# While Sqrt((X# - MX#)^2 + (Y#+25 - MY#)^2 + (Z# - MZ#)^2)<1600 mX#=rnd(10000) mZ#=rnd(10000) mY#= get ground height(1,mX#,mZ#) EndWhile
Position object 3,mX#,mY#,mZ#
Return
Подпрограмма "PlaceMonster", предназначенная для установки случайных координат монстра на матрице, первоначально устанавливает для монстра те же координаты, что и координаты игрока и затем проверяет, чтобы монстр и игрок находились на достаточном расстоянии друг от друга. Первоначальная установка одинаковых координат является необходимым условием для генерации случайной позиции. В тексте этой подпрограммы мы используем цикл "While", чтобы обеспечить определенное условие: цикл повторяется до тех пор, пока расстояние между игроком и монстром не станет больше 1600. Для вычисления расстояния между игроком и монстром мы используем формулу вычисления расстояний из урока по математическому столкновению. Если расстояние меньше 1600, снова выполняется код поиска позиции. Новая случайная позиция рассчитывается и сохраняется в переменных положения монстра. Когда расстояние между игроком и монстром становится больше 1600, цикл завершается и монстр помещается в новом месте.
PlacePlayer:
While Sqrt((X# - mX#)^2 + (Y#+25 - mY#)^2 + (Z# - mZ#)^2)<1000 X#=rnd(10000) Z#=rnd(10000) Y#= get ground height(1,X#,Z#) EndWhile
Position camera X#,Y#,Z# Return
Подпрограмма "PlacePlayer" аналогична подпрограмме "PlaceMonster". Различие только в том, что мы помещаем на матрицу игрока, а не монстра. Мы также направляем камеру в сторону монстра, чтобы его было легче найти.
set cursor 550,20 print "MScore: ",MonsterScore set cursor 550,40 print "PScore: ",PlayerScore
Этот код помещается внутри основного цикла. Используя команду "Set cursor", помещаем текст в правой части экрана. В позиции курсора выводим слова "MScore" и "PScore", чтобы показать игровой счет монстра и игрока. Затем выводим значения переменных "MonsterScore" и "PlayerScore".
if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20 Gosub PlaceMonster inc PlayerScore MonsterBulletLife = 1 BulletLife=0 endif
Эта часть кода из подпрограммы "ShootBullet", которая проверяет, был ли монстр поражен снарядом игрока. Мы добавили в сравнение "If" две строки кода. Если монстр был поражен, вызывается подпрограмма "PlaceMonster", чтобы поместить его в новом месте. Затем мы увеличиваем счет игры в пользу игрока, изменяя переменную "PlayerScore" при помощи команды "Inc".
Pdist=Sqrt((X# - MbX#)^2 + (Y#+25 - MbY#)^2 + (Z# - MbZ#)^2) if Pdist<50 GoSub PlacePlayer MonsterBulletLife = 0 inc MonsterScore endif
Эта часть кода из подпрограммы "MonsterShootBullet", которая, как и предыдущая, проверяет, был ли поражен игрок ракетой монстра. В случае поражения, вызывается подпрограмма "PlacePlayer", помещающая игрока в новом месте. После этого мы увеличиваем счет игры в пользу монстра при помощи команды "Inc" и возвращаемся в подпрограмму "MonsterShootBullet".
|