Grover Blitz . Narod . Ru
Сайт Grover'а посвященный Blitz

На этом сайте размещены мои работы по Blitz 3D.
Примеры, Уроки, Статьи ...

Главная \ Уроки \ Урок - 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

 

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


Пример можно скачать : Salut.zip

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

 

Hosted by uCoz