В этом уроке мы покажем, как создать простой эффект взрыва, когда снаряд попадает в цель, в землю или просто заканчивается время его "жизни".
rem
Создаем эффект взрыва
Make
Object Sphere 30,20
texture
object 30,2
ghost
object on 30
Hide
Object 30
Make
Object Sphere 31,20
texture
object 31,2
ghost
object on 31
Hide
Object 31
Load
3Dsound "Explode.wav",3
Эти строки кода надо поместить в начало программы, где мы загружаем объекты, звуки и изображения. Здесь мы создаем объекты, используемые для эффекта взрыва. Заметьте, что мы применяем ту же текстуру, что и для создания огня в шлейфе. Мы также загрузили звуковой файл, который будем использовать в качестве источника звука взрыва.
if
Mouseclick()=1 and Explode =0
if BulletLife<50
Position object 2,X#,Y#-7,Z#
Set object to camera orientation 2
BulletLife =120
show object 2
Loop sound 2
Endif
Endif
Как видите, мы добавили в программу переменную "Explode". Проверяем, не произошел ли взрыв. Если взрыв происходит в данный момент, то не будем выстреливать еще один снаряд, потому что это может резко обрезать звук взрыва, уменьшая действие эффекта. Мы также установили интервал, через который снаряд может быть снова выпущен. Новый снаряд можно будет выстрелить, если при проверке окажется, что время "жизни" снаряда меньше 50. Это сделано для того, чтобы убедиться, что снаряд находится достаточно далеко, и отсутствие эффекта взрыва не будет замечено игроком.
if bY# < Get Ground height(1,bX#,bZ#) then BulletLife=0
Эта строка кода находится в подпрограмме "ShootBullet". Она проверяет, не попал ли снаряд в землю, и устанавливает значение переменную "BulletLife" равное 0 при положительном результате.
if BulletLife = 0
Hide object 2
stop sound 2
for x=10 to 20
hide object x
next x
Explode = 20
endif
Эта часть кода также находится в подпрограмме "ShootBullet". Код выполняется после того, как время "жизни" снаряда установлено равным 0, либо по причине столкновения с чем-либо, либо по причине окончания "жизни" снаряда. При этом убираются все объекты шлейфа, равно как и сам объект "снаряд". Переменной взрыва присвоено значение 20 для начала отсчета взрыва.
If Explode > 0 then Gosub ExplodeRocket
Эта строка кода располагается в нашем основном цикле. Если счетчик взрыва больше 0, то для выполнения кода взрыва вызывается подпрограмма "ExplodeRocket".
Rem
Взрыв снаряда
ExplodeRocket:
Position
object 30,bX#,bY#,bZ#
Show
object 30
Position
object 31,bX#,bY#,bZ#
Show
object 31
EScale=20*(30-Explode)
Scale
object 30,EScale,EScale,EScale
Yrotate
object 30,WrapValue(Explode*37)
Scale
object 31,EScale/1.5,EScale/1.5,EScale/1.5
Yrotate
object 31,WrapValue(359-Explode*37)
Dec
Explode
If
Explode = 0 then hide object 30: Hide object 31
If
Explode=18
position sound 3,bX#,bY#,bZ#
play sound 3
endif
If
Explode < 15 then position sound 3,X#,Y#,Z#
Return
Подпрограмма "ExplodeRocket" производит взрыв. В место попадания снаряда мы помещаем две сферы, созданные для эффекта взрыва. Затем мы рассчитываем коэффициент масштабирования взрыва и сохраняем его в переменной "EScale". Затем масштабируем первую сферу и вращаем ее со скоростью, уменьшающейся по мере того, как сфера становится больше. То же самое мы делаем со второй сферой, только ее мы масштабируем с меньшей скоростью, чем первую сферу, а вращаем с большей скоростью, основанной на значении "Explode". После этого мы применяем команду "Dec" для уменьшения значения "Explode" на единицу. Потом проверяем, равно ли значение этой переменной 0. Если оно равно 0, обе сферы взрыва убираются. Заметьте, что мы использовали двоеточие, чтобы выполнить две команды "HideObject" в одной строке. Мы могли бы применить сравнение "If … EndIf", но двоеточие в качестве разделителя делает наш код короче и легче читаемым. Следующие строки кода создают звуковой эффект, когда вы сначала видите, как что-то происходит вдали, а затем слышите взрыв. Далее код задает ожидание, пока значение счетчика не достигнет 18, и только после этого начинает воспроизводить звук. Программа помещает источник звука в конечной точке полета снаряда. Когда счетчик достигает 15, источник звука перемещается в координаты камеры, что создает эффект отдаленного взрыва. За счет того, что используется команда "Play Sound", а не "Loop Sound", звук воспроизводится только один раз.