forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Взрыв (http://forum.boolean.name/showthread.php?t=21)

SubZer0 04.09.2005 21:38

Вот пример простого взрыва на Блиц

Код:

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 какуюнить текстуру, но это уже дело фантазии... :rolleyes: :)

impersonalis 04.09.2005 22:36

Код:

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


impersonalis 04.09.2005 22:38

power от 1 и выше, дробное
если будешь задавать более 6, то увеличь константы
Код:

Const count_sphere=24
Const count_trash=60

можно и так оставить, но эффекта должного не будет


Часовой пояс GMT +4, время: 15:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot