Показать сообщение отдельно
Старый 24.08.2006, 23:53   #4
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: ракета в полёте + пламя из сопла

Type snar
	Field entity%
	Field fire_entity%
	Field time%
     Field smok
End Type

Function create_snar()
	s.snar=New snar
	
	s\entity=CreateCylinder()
	s\fire_entity=CreateSphere()
	RotateEntity s\entity,0,0,90
	
	ScaleEntity s\fire_entity,.4,.4,.4
	PositionEntity s\fire_entity,1.5,0,0
	RotateEntity s\fire_entity,0,-90,0
	EntityParent s\fire_entity,s\entity
	
	
	NameEntity s\entity,Handle(s)
	
	
	Return Handle(s)
End Function

Function update_snr()
	For s.snar=Each snar
 If MilliSecs()-s\time>=5
 	create_fire_sprite(s\fire_entity)
     
    s\smok=s\smok+1
	If s\smok>Rand(2,5)
	    s\smok=0
	   create_smok_sprite(s\fire_entity)
	EndIf  
 	s\time=MilliSecs()
 EndIf
	Next
End Function
;__________________________________________________
Type fire_sprite
	Field entity%
	Field time%
	Field alpha#
	Field size#
	Field stat
End Type

Function create_fire_sprite(parent)
	f.fire_sprite=New fire_sprite
	f\entity=CopyEntity(sprite)
	RotateEntity f\entity,EntityPitch(parent,True),EntityYaw(parent,True),EntityRoll(parent,True)
	PositionEntity f\entity,EntityX(parent,True),EntityY(parent,True),EntityZ(parent,True)
	omega#=Rnd(0,359)
	k#=0.2
	MoveEntity f\entity,Cos(omega)*k#,Sin(omega)*k#,0
	f\alpha#=1
	f\size#=2
	f\time=MilliSecs()
	Return Handle(f)
End Function

Function create_smok_sprite(parent)
	f.fire_sprite=New fire_sprite
	f\stat=1
	f\entity=CopyEntity(sprite_smok)
	EntityColor f\entity,140,140,140
	RotateEntity f\entity,EntityPitch(parent,True),EntityYaw(parent,True),EntityRoll(parent,True)
	PositionEntity f\entity,EntityX(parent,True)+Rnd(-1,1),EntityY(parent,True)+Rnd(-1,1),EntityZ(parent,True)+Rnd(-1,1)

	MoveEntity f\entity,0,0,5
	f\alpha#=.5
	f\size#=Rnd(3,4)
	f\time=MilliSecs()
	Return Handle(f)
End Function

Function update_fire_sprite()
	For f.fire_sprite=Each fire_sprite
 new_time=MilliSecs()
 delta=new_time-f\time
 f\time=new_time

If f\stat=0
 f\alpha#=f\alpha#-delta*0.01
 f\size#=f\size#-delta*0.005
 MoveEntity f\entity,0,0,0.03*delta
Else
  f\alpha#=f\alpha*.97
 f\size#=f\size*1.02
EndIf 
 EntityAlpha f\entity,f\alpha#
 ScaleSprite f\entity,f\size,f\size
 If f\alpha<.1
 	FreeEntity f\entity
 	Delete f
 EndIf
	Next
End Function
;_____________________________
;=MAIN LOOP
Graphics3D 800,600,32
Global camera=CreateCamera()
CameraClsColor camera,0,100,155
MoveEntity camera,0,0,-30
Global light=CreateLight()
Global sprite=LoadSprite("sprite.bmp"):HideEntity sprite
Global sprite_smok=LoadSprite("sprite.bmp",3)

HideEntity sprite_smok
;__create 1
snar_ptr=create_snar()
s.snar=Object.snar(snar_ptr)
s_ent=s\entity%
PositionEntity s_ent,0,2,0
;__create 2
snar_ptr=create_snar()
s.snar=Object.snar(snar_ptr)
s_ent2=s\entity%
;__create 3
snar_ptr=create_snar()
s.snar=Object.snar(snar_ptr)
s_ent3=s\entity%
RotateEntity s_ent3,0,90,90
;;;==

time=MilliSecs()
While Not KeyHit(1)

	new_time=MilliSecs()
	delta=new_time-time
	time=new_time
	
	MoveEntity s_ent2,0,0.07*delta,0
	TurnEntity s_ent2,0.07*delta,0,0
	
	MoveEntity s_ent3,0,0.07*delta,0
	TurnEntity s_ent3,0.07*delta,0,0
	
	update_snr()
	
	update_fire_sprite()
	RenderWorld
Flip
Wend
End
Побаловался 10 мин.
Теперь с дымом
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
YaLAS (09.11.2010)