|
Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново... |
04.09.2005, 21:38
|
#1
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Вот пример простого взрыва на Блиц
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
Type Expl
Field x#
Field y#
Field z#
Field PHandle%[200]
Field PAlpha#[200]
Field Paspeed#[200]
Field PSpeed#[200]
Field SHandle%[2]
Field Ssspeed#[2]
Field Saspeed#[2]
Field SAlpha#[2]
Field SScale#[2]
End Type
camera=createcamera()
PositionEntity camera,0,0,-100
SeedRnd millisecs()
time=millisecs()
ex=1
Repeat
ex=ex-1
If ex=0 Then
CreateExplosion(rnd(-10,10),rnd(-10,10),rnd(-10,10),rnd(5,20))
ex=100
EndIf
UpdateExplosion()
RenderWorld
J=0
For Explosion.expl=each expl:J=J+1:Next
Text 0,0,"Существует взрывов "+str(j)
Flip
While MilliSecs()-time<1000/100.0:wend
Until KeyHit(1)
End
Function CreateExplosion(Xp#,Yp#,Zp#,Power%)
Explosion.Expl= New expl
Explosion\x=Xp
Explosion\y=Yp
Explosion\y=Yp
Explosion\SHandle[0]=createsphere()
PositionEntity Explosion\SHandle[0],Xp,Yp,Zp
Explosion\Ssspeed[0]=Power*0.1
Explosion\Saspeed[0]=rnd (0.05,0.08)
Explosion\SAlpha[0]=1
Explosion\SScale[0]=0.1
ScaleEntity Explosion\SHandle[0],Explosion\SScale[0],Explosion\SScale[0],Explosion\SScale[0]
EntityColor Explosion\SHandle[0],rnd(200,255),rnd(0,100),rnd(0,100)
Explosion\SHandle[1]=createsphere()
PositionEntity Explosion\SHandle[1],Xp,Yp,Zp
Explosion\Ssspeed[1]=Power*0.06
Explosion\Saspeed[1]=rnd (0.05,0.08)
Explosion\SAlpha[1]=1
Explosion\SScale[1]=0.1
ScaleEntity Explosion\SHandle[1],Explosion\SScale[0],Explosion\SScale[0],Explosion\SScale[0]
EntityColor Explosion\SHandle[1],rnd(200,255),rnd(200,255),rnd(0,100)
For i=0 To 200
Explosion\PHandle[i]=Createsphere()
PositionEntity Explosion\PHandle[i],Xp,Yp,Zp
RotateEntity Explosion\PHandle[i],rnd(-180,180),rnd(-180,180),rnd(-180,180)
Sc#=rnd(0,Power*0.15)
ScaleEntity Explosion\PHandle[i],Sc,Sc,Sc
EntityColor Explosion\PHandle[i],rnd(200,255),rnd(100,255),rnd(0,50)
Explosion\PAlpha[i]=rnd(0.9,1)
Explosion\Paspeed[i]=rnd(0.94,0.999)
Explosion\PSpeed[i]=rnd(Power*0.01,Power*0.2)
Next
End Function
Function UpdateExplosion()
For Explosion.expl = Each expl
ExplosionDeleteFlag#=0
For i=0 To 1
Explosion\SScale[i]=Explosion\SScale[i]+Explosion\Ssspeed[i]
Explosion\Ssspeed[i]=Explosion\Ssspeed[i]*0.956
If Explosion\Ssspeed[i]<0.00001 Then Explosion\Ssspeed[i]=0
Explosion\SAlpha[i]=Explosion\SAlpha[i]-Explosion\Saspeed[i]
Explosion\Saspeed[i]=Explosion\Saspeed[i]*0.956
If Explosion\SAlpha[i]<0.00001 Then Explosion\SAlpha[i]=0
ScaleEntity Explosion\SHandle[i],Explosion\SScale[i],Explosion\SScale[i],Explosion\SScale[i]
EntityAlpha Explosion\SHandle[i],Explosion\SAlpha[i]
ExplosionDeleteFlag=ExplosionDeleteFlag+Explosion\SAlpha[i]
Next
For i=0 To 200
MoveEntity Explosion\PHandle[i],0,0,Explosion\PSpeed[i]
Explosion\PSpeed[i]=Explosion\PSpeed[i]*0.956
If Explosion\PSpeed[i]<0.00001 Then Explosion\PSpeed[i]=0
Explosion\PAlpha[i]=Explosion\PAlpha[i]*Explosion\Paspeed[i]
EntityAlpha Explosion\PHandle[i],Explosion\PAlpha[i]
Explosion\PAlpha[i]=Explosion\PAlpha[i]*0.956
If Explosion\PAlpha[i]<0.00001 Then Explosion\PAlpha[i]=0
ExplosionDeleteFlag=ExplosionDeleteFlag+Explosion\PAlpha[i]
Next
If ExplosionDeleteFlag#=0
For i=0 To 200
FreeEntity Explosion\PHandle[i]
Next
For i=0 To 1
FreeEntity Explosion\SHandle[i]
Next
Delete Explosion
EndIf
Next
End function
функция CreateExplosion(Xp#,Yp#,Zp#,Power%) где первые три значения - координаты, последнее - размер взрыва...
Ессно вместо сфер можно какиенить объекты кусков намутить и вместо EntityColor какуюнить текстуру, но это уже дело фантазии...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
04.09.2005, 22:36
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
SeedRnd(MilliSecs())
Const count_sphere=24
Const count_trash=60
Const alpha_v#=0.003
Type boom
Field pivot
Field spheres[count_sphere]
Field size#[count_sphere]
Field alpha#[count_sphere]
Field time_update
Field trash[count_trash]
Field vx#[count_trash]
Field vy#[count_trash]
Field vz#[count_trash]
Field rvx#[count_trash]
Field rvy#[count_trash]
Field rvz#[count_trash]
Field alpha2#[count_trash]
Field count_sphereL
Field count_trashL
Field alpha_v#
End Type
Function create_Explosion(x#,y#,z#,power#)
Local max_rot#=50
Local max_v#=0.07*power#
Local tarsh_p#=1
b.boom=New boom
b\pivot=CreatePivot()
PositionEntity b\pivot,x,y,z,True
b\count_sphereL=power#*2
b\count_trashL=power#*10
b\alpha_v#=0.0029*(1/power#)
If b\count_sphereL>count_sphere b\count_sphereL= count_sphere
If b\count_trashL>count_trash b\count_trashL= count_trash
For is=1 To b\count_sphereL
b\spheres[is]=CreateSphere(8,b\pivot)
b\size[is]=0.0001
b\alpha[is]=1
Next
For is=1 To b\count_trashL
b\trash[is]=CreateCube()
x#=Rnd(0,tarsh_p*0.3)
y#=Rnd(0,trash_p-x#)
z#=Rnd(0,trash_p-x-z#)
ScaleEntity b\trash[is],x,y,z,True
b\rvx[is]=Rnd(0,max_rot#)
b\rvy[is]=Rnd(0,max_rot#)
b\rvz[is]=Rnd(0,max_rot#)
b\vx[is]=Rnd(-max_v,max_v)
b\vy[is]=Rnd(0,max_v)
b\vz[is]=Rnd(-max_v,max_v)
EntityColor b\trash[is],100,100,100
b\alpha2[is]=1
Next
b\time_update=MilliSecs()
Return Handle(b)
End Function
Function update_Explosions()
Local min_dist_sp#=10
Local grav#=0.0001
For b.boom=Each boom
new_time=MilliSecs()
delta_time=new_time-b\time_update
b\time_update=new_time
For is=1 To b\count_sphereL
If b\spheres[is]
b\size[is]=b\size[is]+delta_time*0.1
b\alpha[is]=b\alpha[is]-delta_time*b\alpha_v#
ScaleEntity b\spheres[is],b\size[is],b\size[is],b\size[is],True
If b\alpha[is]>0
EntityAlpha b\spheres[is],b\alpha[is]
EndIf
If b\size[is]<min_dist_sp# bExit=True
If b\alpha[is]<=0 FreeEntity b\spheres[is]:b\spheres[is]=0
If bExit Exit
EndIf
Next
For is=1 To b\count_trashL
If b\trash[is]
TurnEntity b\trash[is],b\rvx[is]*delta_time,b\rvy[is]*delta_time,b\rvz[is]*delta_time,True
TranslateEntity b\trash[is],b\vx[is]*delta_time,b\vy[is]*delta_time,b\vz[is]*delta_time,True
EntityAlpha b\trash[is],b\alpha2[is]
b\alpha2[is]=b\alpha2[is]-delta_time*b\alpha_v#*0.1
b\vy[is]=b\vy[is]-grav#*delta_time
If b\alpha2[is]<=0 FreeEntity b\trash[is]:b\trash[is]=0
EndIf
Next
Next
End Function
;_____________________________
;=MAIN LOOP
Graphics3D 800,600,32
Global camera=CreateCamera()
MoveEntity camera,0,3,-30
Global light=CreateLight()
Global plane=CreatePlane()
EntityColor plane,200,200,0
While Not KeyHit(1)
;@@@@@@@@@@@@@@@@@@@
If MouseHit(1) create_explosion(0,3,40,1.5)
;@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@
update_Explosions()
;@@@@@@@@@@@@@@@@@@@@@@@
RenderWorld
Flip
Wend
End
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.09.2005, 22:38
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
power от 1 и выше, дробное
если будешь задавать более 6, то увеличь константы
Const count_sphere=24
Const count_trash=60
можно и так оставить, но эффекта должного не будет
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Взрыв (Вооомм) |
Petrofan |
3D-программирование |
8 |
11.01.2010 15:11 |
Ядерный взрыв |
Mark Castle |
3D-программирование |
24 |
03.03.2009 01:05 |
Взрыв бомбочки |
Fant |
3D-программирование |
12 |
04.09.2007 15:40 |
Ядерный взрыв |
HolyDel |
3D-программирование |
18 |
25.06.2007 12:30 |
Часовой пояс GMT +4, время: 17:37.
|