Главная \
Уроки \
Урок -
2
\

Урок
по Blitz
3D . Система частиц на примере салюта.
Для
создания спецэффектов в 90% случаев используются системы
частиц. Система частиц – это набор точек или объектов,
поведение которых определяется определенным законам.
Например, салют можно представить как систему частиц.
Частички это светящиеся шарики, которые разлетаются в разные
стороны и гаснут. Вот именно этим примером мы и займемся.
Для работы с частицами требуется как минимум две
функции: первая создает частички; вторая задает поведение
частиц.
Function
Create_bah(x#,y#,z#,col)
Function Update_bah()
|
x#, y#, z# - координаты салюта в
пространстве
col – количество частиц (светящихся
шариков)
Самое главное в работе с частицами это Типы или Списки.
Для хранения данных о частицам необходимо использовать
именно Типы, т.к. массивы в Blitz работают довольно
медленно, а в файл записывать еще медленнее.
Создаем новый тип:
; Создаем тип с именем
sparcs
Type sparcs
; Скорость частицы
Field speed#
; Время жизни частицы (Вечно существовать салют
не может)
Field time_life#
; Сама частичка
Field entity
; Больше переменных в типе нет.
End Type
|
Тип создали. Теперь напишем функцию
создания частичек (салюта):
Function Create_bah(x#,y#,z#,col)
For i= 1 To col;
Цикл от 1 до количества частиц в салюте
e.sparcs = New sparcs;
Создаем переменную e
;типа sparcs (наш тип)
e\speed=Rnd(-.4,.4);
Скорость частицы выбирается
;случайно от -0.4 до +0.4
e\time_life=Rnd(40,70);
Время жизни тоже
;случайно – так красивее:)
; В
качестве шариков загружаем спрайт
e\entity=LoadSprite("sprite\spark.bmp",1)
PositionEntity e\entity,x,y,z;
Устанавливаем частицу на
;начальную позицию
;
Разворачиваем частицу в случайном направлении
TurnEntity
e\entity,Rnd(360),Rnd(360),Rnd(360)
Next
End Function
|
Эта функция создаст в
памяти список с параметрами каждой частицы. У списков
есть недостаток – нельзя просто обратиться к
определенной частицы, необходимо каждый раз перебирать
каждую. Но этот процесс не заметен в запущенной
программе.
Для перебора списка используют команду Each.
Записывается она в цикле:
For w.sparcs =Each
sparcs
|
Что означает:
Поочередно присвоить переменной w типа sparcs все
значения списка sparcs. Именно такой цикл нам и нужен
для просчеты поведения частиц. Пишем функию…
Function
Update_bah()
For w.sparcs =Each sparcs;
«перебрать» все частицы
MoveEntity w\entity,0,0,w\speed ;
двинуть частицу
; вперед на speed единиц
w\time_life=w\time_life-1 ;
уменьшить время жизни частицы
If w\time_life<=0 Then ;
если время жизни «истекло», то
FreeEntity w\entity ;
уничтожить частицу (шарик)
Delete w ; Стереть все
записи из памяти о частице.
EndIf
Next
End Function
|
ВНИМАНИЕ !!! Обязательно удаляйте
частицу и все записи о ней. Иначе память быстро
заполниться ненужными данными и программа начнет
работать очень медленно!!!
Все !!! Маленькая .bb библиотека готова.
Осталось внедрить ее в программу и запустить..
Полный текст библиотеки:
Type sparcs
Field x#,y#,z#
Field speed#
Field time_life#
Field entity
End Type
Function Create_bah(x#,y#,z#,col)
For i= 1 To col
e.sparcs = New sparcs
e\x=x
e\y=y
e\z=z
e\speed=Rnd(-.4,.4)
e\time_life=Rnd(40,70)
e\entity=LoadSprite("sprite\spark.bmp",1)
PositionEntity e\entity,x,y,z
TurnEntity e\entity,Rnd(360),Rnd(360),Rnd(360)
Next
End Function
Function Update_bah()
For w.sparcs =Each sparcs
MoveEntity w\entity,0,0,w\speed
w\time_life=w\time_life-1
If w\time_life<=0 Then
FreeEntity w\entity
Delete w
EndIf
Next
End Function
|
Сохраняем файл под именем Bah.bb и создаем новый
файл:
Graphics3D
800,600,0,2
SetBuffer BackBuffer()
Include "bah.bb" ; подключаем нашу
библиотеку
cam=CreateCamera()
MoveEntity cam,0,0,-20
lit=CreateLight()
While Not KeyHit(1)
If KeyHit(57) Then create_bah(0,0,0,300)
; При нажатии наа
;«Пробел» создать салют
update_bah() ; Просчитать
новое положение частиц
UpdateWorld
RenderWorld
Flip
Wend
End
|
Запускаем и радуемся. Это самый простой пример. Этот
принцип можно использовать для создания красивого огня,
фонтанов, дыма, грязи из-под колес, шлейфа от двигателя
и многого другого. Все на что способна фантазия.

<К оглавлению>
|