forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   ракета в полёте + пламя из сопла (http://forum.boolean.name/showthread.php?t=32)

impersonalis 04.09.2005 22:47

ракета в полёте + пламя из сопла
 
Выкладываю по просьбе одного товарища. :)
Код:

Type snar
        Field entity%
        Field fire_entity%
        Field time%
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\time=MilliSecs()
 EndIf
        Next
End Function
;__________________________________________________
Type fire_sprite
        Field entity%
        Field time%
        Field alpha#
        Field size#
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 update_fire_sprite()
        For f.fire_sprite=Each fire_sprite
 new_time=MilliSecs()
 delta=new_time-f\time
 f\time=new_time
 f\alpha#=f\alpha#-delta*0.01
 f\size#=f\size#-delta*0.005
 MoveEntity f\entity,0,0,0.03*delta
 EntityAlpha f\entity,f\alpha#
 ScaleSprite f\entity,f\size,f\size
 If f\alpha<=0
        FreeEntity f\entity
        Delete f
 EndIf
        Next
End Function
;_____________________________
;=MAIN LOOP
Graphics3D 800,600,32
Global camera=CreateCamera()
MoveEntity camera,0,0,-30
Global light=CreateLight()
Global sprite=LoadSprite("sprite.bmp"):HideEntity sprite

;__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


impersonalis 04.09.2005 22:48



Вот это надо кинуть в папку с проектом


Ещё неплохо бы SeedRnd приписать :)

vadim2 24.08.2006 22:38

Re: ракета в полёте + пламя из сопла
 
Спасибо. Очень пригодилось.

tormoz 24.08.2006 23:53

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 мин.
Теперь с дымом :)

impersonalis 18.11.2006 17:52

Re: ракета в полёте + пламя из сопла
 
Тут у меня спрашивают, что делать: при увеличении сокрости полёта снаряда - нарушается целостность огня, да и вообще - портится визуальное восприятие. Ответ универсальный и единственный - подбирайте коэффициенты: масштаб,изменение масштаба, скорость спрайта и изменения коэффициентов, кол-во спрайтов...


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

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