Назад

   В этом уроке мы объясним, как сделать хвост из огня и дыма с использованием простого эффекта шлейфа. Шлейф определяется как совокупность объемных частиц, движущихся в соответствии с неким набором правил. Правила могут определять положение, скорость, направление движения, цвет, вращение, форму, размер, прозрачность и многие другие атрибуты, используемые для создания таких эффектов, как дым, огонь, водопад или рост листьев на дереве. Применение шлейфа помогает создавать многочисленные реалистичные эффекты. Для наших объемных частиц мы будем использовать плоский объект с текстурой огня и дыма. Настраиваемые свойства - это положение, размер, прозрачность и угол поворота.

 rem Загружаем частицы (шлейф)
Load Image "fire.bmp",2
For x  = 0 to 10
 Make object plain x+10,5,5
 Texture object x+10,2
 Set object x+10,1,0,0
 Ghost object on x+10
Next x
rem Включаем счетчик частиц
Pn=10

Эту часть кода следует поместить в начале программы, где мы загружаем все наши объекты и звуки. Прежде всего, загружаем текстуру для частиц и создаем десять плоских объектов. Команда "Set Object" используется для установки особых свойств объекта. Семь настраиваемых свойств объекта - это каркас, прозрачность, выбраковка, фильтр, источник света, туман и окружение. Нам потребуются только три из них: каркас, прозрачность и выбраковка. Первый параметр после команды - номер используемого объекта. Второй параметр - атрибут каркаса. Устанавливаем его равным 1, чтобы объект отображался заполненным полигонами, а не в виде каркаса. Это установки по умолчанию для большинства 3D-объектов. Третий параметр - атрибут прозрачности. Мы устанавливаем его равным 0. В данном контексте прозрачность означает, что черный цвет на растровых изображениях не будет показан при текстурировании объекта. Четвертый параметр - атрибут выбраковки. Этот параметр устанавливается равным 0, если в 3D-сцене требуется рендеринг обеих, видимой и обратной, сторон полигона. Обычно требуется рендеринг только одной стороны полигона. В большинстве случаев нет необходимости прорисовывать обе стороны, но поскольку мы используем плоский объект, не имеющий объема, то должны все-таки сделать это, чтобы наблюдатель мог видеть полигон отовсюду. Еще одна новая команда "Ghost Object" применяется для того, чтобы сделать объект прозрачным. При этом он появится подобно привидению. С помощью этой команды можно включать и выключать режим прозрачности. Команда использует один параметр - номер объекта, который надо сделать прозрачным. Мы также инициализируем переменную "Pn", и она становится равной номеру первой созданной нами частицы. Переменная "Pn" будет использоваться для хранения номера следующей обрабатываемой частицы.

  If BulletLife > 0
  Dec BulletLife
  Move object 2,10

  bX#=Object position X(2)
  bY#=Object position Y(2)
  bZ#=Object position Z(2)

  Rem Шлейф частиц
  inc Pn
  if Pn=20 then Pn=10
  Scale object Pn,100,100,100
  Position object Pn,bX#,bY#,bZ#
  point object Pn,X#,Y#,Z#
  Zrotate object Pn,rnd(180)
  for x = 1 to 10
   scale object int((Wrapvalue((Pn-9+x)*36))/36)+10,100+x*25,100+x*25,100+x*25
  set cursor 10,10
  print int((Wrapvalue((Pn+x)*36))/36)+10
  next x

  Position sound 2,bX#,bY#,bZ#
  set cursor 10,10
  if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20
   print "Цель поражена"
   BulletLife = 0
  endif
  if BulletLife = 0
   Hide object 2
   stop sound 2
  endif
 Endif

Здесь мы добавили простой шлейф в часть игрового кода, вычисляющую время "жизни" снаряда.

 inc Pn
  if Pn=210 then Pn=10
  Scale object Pn,100,100,100
  Position object Pn,bX#,bY#,bZ#
  point object Pn,X#,Y#,Z#
  Zrotate object Pn,rnd(180)
  for x = 1 to 10
   scale object int((Wrapvalue((Pn-9+x)*36))/36)+10,100+x*25,100+x*25,100+x*25
  next x

Когда снаряд начинает свою "жизнь", мы увеличиваем значение переменной "Pn", чтобы задействовать следующий объект системы частиц в множестве. Затем проверяем, не превысило ли значение переменной "Pn" числа созданных нами частиц, и если превысило, устанавливаем "Pn" равным 10. Возвращаем масштаб частицы в первоначальное значение и помещаем ее туда, где находится снаряд. Затем направляем частицу на камеру и поворачиваем ее на угол со случайным значением. Затем в цикле For … Next с помощью математической формулы масштабируем каждую частицу, чтобы казалось, что дым рассеивается. Попутно решаем задачу, какая частица находится в начале хвоста дыма, а какая - в его конце. Для этого воспользуемся уже знакомой командой "WrapValue". Обычно она применяется для того, чтобы значения углов не превышали 360 градусов. Так как мы используем 10 объектов, то вычитаем 9 из значения "Pn". Величина "Pn" всегда будет меняться от 10 до 19, что соответствует 10 объектам. Затем мы добавляем значение переменной "х" и умножаем все на 36. Если значение "Pn" равно 5, и мы находимся на шестой итерации цикла, тогда значение параметра "WrapValue" будет равно 11, помноженному на 36, или 396. Эта величина явно превышает 360, поэтому функция "WrapValue" делает значение переменной равным 36. Затем мы делим 36 на 36 и получаем значение 1. Оно является номером следующей после десятого объекта частицы, которая будет первой. 

По существу, этот алгоритм последовательно, циклически перебирает все значения от 1 до 10, причем неважно, с какого значения мы начали. Поиск необычных решений трудных задач - неотъемлемая часть программирования. Можно по-разному решить задачу, и наиболее простой способ часто оказывается наилучшим. Этот пример также показывает вам, что вы не обязаны использовать команды DarkBASIC каким-то одним определенным способом. Нетрадиционное мышление приводит ко многим необычным решениям. Каждый объект масштабируется в соответствии с его позицией в хвосте дыма, представленной значением переменной цикла. Это дает эффект рассеивающегося дыма.

 

Hosted by uCoz