Тема: Взрыв
Показать сообщение отдельно
Старый 04.09.2005, 21:38   #1
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 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)
 
Ответить с цитированием