Тема: Дым
Показать сообщение отдельно
Старый 04.09.2005, 21:28   #1
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Смех

Пример создания дыма:

для начала сохраните у себя на компьютере в какую-нибудь папку следующие текстуры:





они нам потребуются для работы кода, теперь копируем следующий код в блиц-редактор, оттуда сохраняем в папку, куда скопированы текстуры... запускаем...

;устанавливаем видеорежим и ставим текущий буфер видеопамяти на задний фон
Graphics3D 1024,768,16,1
SetBuffer BackBuffer()

; определяем тип для облачков дыма
Type SmogT

Field SHandle%
Field STime%
Field SSpeed#
Field ScaleIndex#
Field ScaleI#
Field SAlpha#
Field SAlphaSpeed#

End Type

; создаем камеру и помещаем ее так, чтоб нам было наш дымящийся объект
camera=CreateCamera()
PositionEntity camera,0,15,-25
RotateEntity camera,10,0,0

;создаем свет
RotateEntity CreateLight(),0,45,0

;загружаем наши текстуры как спрайты
sm2=LoadSprite("smog2.bmp",1)
sm1=LoadSprite("smog1.bmp",1)
; скрываем их, чтоб они не мешались на экране
HideEntity sm2
HideEntity sm1

; создаем шарик который будет дымиться
smogobject=CreateSphere()

; здесь запускаем счетчик, он нам нужен для того, чтоб регулировать насыщенность дыма
; иными словами сколько шарик будет пускать облачков дыма за один проход общего цикла
CreateStep=4+Rnd(-2,2)
; запускаем цикл до нажатия клавиши ESC
Repeat

; уменьшаем наш счетчик на единицу, если он достиг нуля, то пускаем облачко дыма
CreateStep=CreateStep-1
If CreateStep=0

; создаем новый тип для облачка
Smog.Smogt=New Smogt
; копируем наш спрайт
Smog\SHandle=CopyEntity(sm1)
; сбрасываем счетчик времени
Smog\STime=0
; задаем скорость поднятия облачка ввоздух
Smog\SSpeed=0.15
; задаем начальные размеры облачка
Smog\ScaleIndex=1.5
; задаем величину изменения размеров облачка с каждым подняитием его ввоздух
Smog\ScaleI=-0.02
; задаем начальную прозрачность облачка
Smog\SAlpha=0.8
; задаем величину изменения прозрачности облачка с каждым поднятием его ввоздух
Smog\SAlphaSpeed=-0.02
; помещаем наше облачко над объектом горения
PositionEntity Smog\SHandle,EntityX(SmogObject),EntityY(SmogObject)+1,EntityZ(SmogObject)

; если вы запускали пример, то заметили, что дым состоит из двух потоков, красного (пламени) и серого (дыма)
; сверху мы создали поток облачков пламени, сейчас все тоже только с немного другими параметрами для дыма

Smog.Smogt=New Smogt
Smog\SHandle=CopyEntity(sm2)
Smog\STime=0
Smog\SSpeed=0.15
Smog\ScaleIndex=2
Smog\ScaleI=0.01
Smog\SAlpha=0.5
Smog\SAlphaSpeed=-0.005
PositionEntity Smog\SHandle,EntityX(SmogObject),EntityY(SmogObject)+1,EntityZ(SmogObject)

; если счетчик равен нулю, то чтоб поновой отмерялось время запускаем его снова
CreateStep=4+Rnd(-2,2)

EndIf

; по нажатию кнопки передвигаем наш дымящийся шарик
If KeyDown(200) Then MoveEntity SmogObject,0,0,0.5
If KeyDown(208) Then MoveEntity SmogObject,0,0,-0.5
If KeyDown(203) Then MoveEntity SmogObject,-0.5,0,0
If KeyDown(205) Then MoveEntity SmogObject,0.5,0,0

; а тут самое интересное, здесь идет обработка дыма, чтоб он взлетал ввоздух и растворялся
; запускаем цикл на весь тип (в нем с каждым проходом мы будем работать с каждым облачком дыма)
For Smog.SmogT=Each SmogT
; таймер для дыма, т.е. сколько раз каждое облачко должно быть обработано пока оно не будет удалено
If Smog\STime< 100
; поднимаем облачко на заданную скорость SSpeed
MoveEntity Smog\SHandle,Rnd(-0.05,0.05),Smog\SSpeed,Rnd(-0.05,0.05)
; рассчитываем и изменяем размер облачка
Smog\ScaleIndex=Smog\ScaleIndex+Smog\ScaleI
ScaleSprite Smog\SHandle,Smog\ScaleIndex,Smog\ScaleIndex

; рассчитываем и изменяем прозрачность облачка
Smog\SAlpha=Smog\SAlpha+Smog\SAlphaSpeed
EntityAlpha Smog\SHandle,Smog\SAlpha

; увеличиваем счетчик времени облачка
Smog\STime=Smog\STime+1
; если время больше заданного (100) то его (облачко) нужно удалить
If Smog\STime=100
; удаляем спрайт облачка
FreeEntity Smog\SHandle
; удаляем тип
Delete Smog
EndIf
EndIf
Next

; прорисовываем (обновляем) наш мир
RenderWorld
; обмениваем буфера видеопамяти, чтоб увидеть что у нас получилось,
; теперь все следующее будет
рисоваться в скрытый буфер
Flip

Until KeyHit(1)

; конец программы
End
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием