forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Эфект от выстрела (http://forum.boolean.name/showthread.php?t=9680)

Ganociy 31.10.2009 22:00

Эфект от выстрела
 
Ну знач попала пуля в стену , декали я добился а эфект пыли разлетающийся не получается. А может быть у кого-то исходник есть? Поделитесь пожалуйста если не жалко.

moka 31.10.2009 22:03

Ответ: Эфект от выстрела
 
Партиклы.
По сути всё просто: направление пыли - перпендикуляр к поверхности попадания. Плюс гравитация воздействующая на них. Ничего сложного.

Colossus 01.11.2009 08:29

Ответ: Эфект от выстрела
 
Цитата:

декали я добился
а можешь дать твой код поглядеть ато я мучаюсь мучаюсь а декаль не могу сделать...??

Ganociy 01.11.2009 09:55

Ответ: Эфект от выстрела
 
Terminator , я пошёл хитрым путём. Хочу тебя спросить , а у тебя есть функция пули??? Так вот я спрайт пули просто заменил на спрайт декали.))
Добавил такие параметры EntityRadius( в даном случае он = 0.009), коллизию поставил так: Collisions typeshot,typelevel,2,1 . Ну вот как-то так.

А теперь долгожданный код:



Global vs#=45; скорость нашей пули
Global shot=LoadSprite ("data/Sprites/bullet_hole.bmp"); пуля как дырка
HideEntity shot

Type shot
Field entity
Field dist#
End Type

;Это код самой пули
Function create_Shot(x#,y#,z#,pitch#,yaw#,roll#)
s.shot=New shot
s\entity=CopyEntity(shot)
PositionEntity s\entity,x#,y#,z#,1
EntityType s\entity,typeshot
RotateEntity s\entity,pitch#,yaw#,roll#,1
ScaleSprite s\entity,0.04,0.04
EntityRadius s\entity,0.006
RotateSprite s\entity,Rnd(360)
SpriteViewMode s\entity,2
Return True
End Function

Function update_shot()

max_dist#=3000

For a.shot=Each shot

MoveEntity a\entity,Rnd(0.2,0.3),0,vs#

a\dist#=a\dist#+vs#

bot_h = EntityCollided(a\entity,typelevel)<>0

If a\dist#>max_dist#
FreeEntity a\entity
Delete a

Exit
EndIf
Next
End Function

;ну и после репит
if mousedown(1)
create_shot(EntityX(player)-0.5,EntityY(player)+0.7,EntityZ(player),EntityPitc h(player)-2,EntityYaw(player),0)
endif

;До рендерворлд
update_shot()

Вот и всё . А сколько я времени убил что бы этого добиться!!! Ну всё же и это меня не устраивает! Буду думать , работать.

Hurrit 01.11.2009 14:15

Ответ: Эфект от выстрела
 
А на си плюс плюсе, или на чем ты там работаешь, это наверное делается гораздо красивее, проще и круче?

Colossus 01.11.2009 14:48

Ответ: Эфект от выстрела
 
гы гы деколь вместо пули... интересно)))
а если делать буллет тайм))

NitE 01.11.2009 15:10

Ответ: Эфект от выстрела
 
Код:


Graphics3D 800,600,0,0

CentreX=GraphicsWidth()/2
CentreY=GraphicsHeight()/2

; bullet hole & spark sprites
hole=CreateSprite()
ScaleSprite hole,0.25,0.25
SpriteViewMode hole,2
EntityBlend hole,2
EntityTexture hole,Cirtex(32)
HideEntity hole

spark=CreateSprite()
ScaleSprite spark,0.1,0.1
EntityBlend spark,3
HideEntity spark

; make environment

AmbientLight 0,0,0

camera=CreateCamera()
PositionEntity camera, 0,-15,0

room=CreatePivot()

Cube=CreateSegCube(12,room)
EntityPickMode cube,2
EntityColor cube,250,100,50
ScaleMesh cube,40,40,40
FlipMesh cube

Column=CreateCylinder(16,True,room)
EntityPickMode column,2
EntityFX column,4
EntityColor column,150,120,120
PositionMesh column,0,1,0
ScaleMesh Column,6,24,6

sphere=CreateSphere(12,column)
EntityShininess sphere,0.25
EntityColor sphere,200,200,50
EntityPickMode sphere,2
ScaleMesh sphere,-6,-6,-6 ; flip normals
PositionMesh sphere,0,54,0

PositionEntity Column,-30,-40,-30
PositionEntity CopyEntity(column,room),30,-40,-30
PositionEntity CopyEntity(column,room),30,-40,30
PositionEntity CopyEntity(column,room),-30,-40,30

; add a few lights

lpiv=CreatePivot(room)
light=CreateLight(2,lpiv) : PositionEntity light,-30,14,-30
light=CreateLight(2,lpiv) : PositionEntity light,30,14,-30
light=CreateLight(2,lpiv) : PositionEntity light,30,14,30
light=CreateLight(2,lpiv) : PositionEntity light,-30,14,30

; load gunshot sound - your path to this may be different.
shot = LoadSound("C:\Program Files\Blitz3D\Samples\Blitz 3D Samples\si\fps\gunshot.wav")

holes  = CreatePivot(room) ; bullet hole list
sparks = CreatePivot(room) ; sparks list

; main ---------------------------------------------------------

MoveMouse CentreX,CentreY

Repeat
        mxs#=MouseXSpeed()
        mys#=MouseYSpeed()

        If MouseDown(2) Then
                MoveEntity camera,0,0,-mys*0.25
        Else
                TurnEntity camera,mys*0.5,0,0 : TurnEntity camera,0,-mxs*0.5,0,True
        EndIf
       
        MoveMouse centrex,centrey
       
        If MouseDown(1) Or KeyHit(57) Then
                If MilliSecs()>delaytime Then
                        delaytime=MilliSecs()+100
                        If shot Then PlaySound shot                               
                        picked=CameraPick(camera, CentreX+Rnd(-10,10),CentreY+Rnd(-10,10))
                        If picked<>0 Then
                                makehole(hole,holes)
                                makespark(spark,sparks)                               
                        EndIf
                EndIf
        EndIf
       
        updatesparks(sparks)
       
        For i=1 To CountChildren(lpiv)
                light=GetChild(lpiv,i)
                LightRange light,15+Sin((MilliSecs() And $FFFFF)/24+i*90 )*8
        Next
       
        If KeyHit(17) Then wire=Not wire : WireFrame wire
       
        RenderWorld
        Color 255,255,255
        Line centrex-4,centrey,centrex+4,centrey : Line centrex,centrey-4,centrex,centrey+4
        Flip
Until KeyHit(1)

;----------------------------------------------------------------------------------------

Function makehole(hole,holes)
        hole=CopyEntity(hole,holes)
        PositionEntity hole,PickedX(),PickedY(),PickedZ(),True
        AlignToVector hole,-PickedNX(),-PickedNY(),-PickedNZ(),3
        MoveEntity hole,0,0,-0.05
        If CountChildren(holes)>200 Then FreeEntity GetChild(holes,1)
End Function

Function makespark(spark,sparks)
        Local rv#=Rnd(-0.8,0.8)
        spark=CopyEntity(spark,sparks)
        PositionEntity spark,PickedX(),PickedY(),PickedZ(),True
        AlignToVector spark,-PickedNX()+Rv,-PickedNY()+Rv,-PickedNZ()+Rv,3
End Function

Function updatesparks(sparks)
        Local i,life
        For i=1 To CountChildren(sparks)
                spark=GetChild(sparks,i)
                life=EntityName(spark) : life=life+1 : NameEntity spark,life
                MoveEntity spark,0,0,-1 : TranslateEntity spark,0,-life/5.0,0,True
                EntityColor spark,512/life,512/life,512/life
                If life>20 Then FreeEntity spark : i=i-1
        Next
End Function

Function Cirtex(rad)
        texture=CreateTexture(rad,rad)
        SetBuffer TextureBuffer(texture)
        Color 255,255,255 : Rect 0,0,rad,rad,True
        Color 200,200,200 : Oval 0,0,rad,rad,True
        Color 100,100,100 : Oval 12,12,rad-24,rad-24,True
        SetBuffer BackBuffer()
        Return texture
End Function

; Birdies CreateSegCube Function from the archives (slightly modified)
Function CreateSegCube(segs=1,parent=0)
        Local a,b,scnt,stp#=2.0/segs,stx#,sty#,x#,y#,u#,v#,v0,v1,v2
        Local mesh=CreateMesh( parent )
        For scnt=0 To 5
                surf= CreateSurface( mesh )
                stx = -1 : sty = stx : y = sty
                For a=0 To segs
                        x = stx : v = a / Float(segs)
                        For b=0 To segs
                                u = b / Float(segs)
                                VertexNormal(surf,AddVertex(surf,x,y,1,u,v),0,0,1)
                                x = x + stp
                        Next
                        y = y + stp
                Next
                For a=0 To segs-1
                        For b=0 To segs-1
                                v0 = a*(segs+1)+b      : v1 = v0+1
                                v2 = (a+1)*(segs+1)+b+1 : v3 = v2-1
                                AddTriangle( surf,v0,v1,v2 )
                                AddTriangle( surf,v0,v2,v3 )
                        Next
                Next
                If scnt<4 Then RotateMesh mesh,0,90,0  ; rotate to side
                If scnt=3 Then RotateMesh mesh,90,0,0  ; rotate to top
                If scnt>3 Then RotateMesh mesh,180,0,0 ; rotate to bottom
        Next
        Return mesh
End Function


Ganociy 02.11.2009 09:00

Ответ: Эфект от выстрела
 
Цитата:

Сообщение от NitE (Сообщение 123080)
Код:


Graphics3D 800,600,0,0

CentreX=GraphicsWidth()/2
CentreY=GraphicsHeight()/2

; bullet hole & spark sprites
hole=CreateSprite()
ScaleSprite hole,0.25,0.25
SpriteViewMode hole,2
EntityBlend hole,2
EntityTexture hole,Cirtex(32)
HideEntity hole

spark=CreateSprite()
ScaleSprite spark,0.1,0.1
EntityBlend spark,3
HideEntity spark

; make environment

AmbientLight 0,0,0

camera=CreateCamera()
PositionEntity camera, 0,-15,0

room=CreatePivot()

Cube=CreateSegCube(12,room)
EntityPickMode cube,2
EntityColor cube,250,100,50
ScaleMesh cube,40,40,40
FlipMesh cube

Column=CreateCylinder(16,True,room)
EntityPickMode column,2
EntityFX column,4
EntityColor column,150,120,120
PositionMesh column,0,1,0
ScaleMesh Column,6,24,6

sphere=CreateSphere(12,column)
EntityShininess sphere,0.25
EntityColor sphere,200,200,50
EntityPickMode sphere,2
ScaleMesh sphere,-6,-6,-6 ; flip normals
PositionMesh sphere,0,54,0

PositionEntity Column,-30,-40,-30
PositionEntity CopyEntity(column,room),30,-40,-30
PositionEntity CopyEntity(column,room),30,-40,30
PositionEntity CopyEntity(column,room),-30,-40,30

; add a few lights

lpiv=CreatePivot(room)
light=CreateLight(2,lpiv) : PositionEntity light,-30,14,-30
light=CreateLight(2,lpiv) : PositionEntity light,30,14,-30
light=CreateLight(2,lpiv) : PositionEntity light,30,14,30
light=CreateLight(2,lpiv) : PositionEntity light,-30,14,30

; load gunshot sound - your path to this may be different.
shot = LoadSound("C:\Program Files\Blitz3D\Samples\Blitz 3D Samples\si\fps\gunshot.wav")

holes  = CreatePivot(room) ; bullet hole list
sparks = CreatePivot(room) ; sparks list

; main ---------------------------------------------------------

MoveMouse CentreX,CentreY

Repeat
        mxs#=MouseXSpeed()
        mys#=MouseYSpeed()

        If MouseDown(2) Then
                MoveEntity camera,0,0,-mys*0.25
        Else
                TurnEntity camera,mys*0.5,0,0 : TurnEntity camera,0,-mxs*0.5,0,True
        EndIf
       
        MoveMouse centrex,centrey
       
        If MouseDown(1) Or KeyHit(57) Then
                If MilliSecs()>delaytime Then
                        delaytime=MilliSecs()+100
                        If shot Then PlaySound shot                               
                        picked=CameraPick(camera, CentreX+Rnd(-10,10),CentreY+Rnd(-10,10))
                        If picked<>0 Then
                                makehole(hole,holes)
                                makespark(spark,sparks)                               
                        EndIf
                EndIf
        EndIf
       
        updatesparks(sparks)
       
        For i=1 To CountChildren(lpiv)
                light=GetChild(lpiv,i)
                LightRange light,15+Sin((MilliSecs() And $FFFFF)/24+i*90 )*8
        Next
       
        If KeyHit(17) Then wire=Not wire : WireFrame wire
       
        RenderWorld
        Color 255,255,255
        Line centrex-4,centrey,centrex+4,centrey : Line centrex,centrey-4,centrex,centrey+4
        Flip
Until KeyHit(1)

;----------------------------------------------------------------------------------------

Function makehole(hole,holes)
        hole=CopyEntity(hole,holes)
        PositionEntity hole,PickedX(),PickedY(),PickedZ(),True
        AlignToVector hole,-PickedNX(),-PickedNY(),-PickedNZ(),3
        MoveEntity hole,0,0,-0.05
        If CountChildren(holes)>200 Then FreeEntity GetChild(holes,1)
End Function

Function makespark(spark,sparks)
        Local rv#=Rnd(-0.8,0.8)
        spark=CopyEntity(spark,sparks)
        PositionEntity spark,PickedX(),PickedY(),PickedZ(),True
        AlignToVector spark,-PickedNX()+Rv,-PickedNY()+Rv,-PickedNZ()+Rv,3
End Function

Function updatesparks(sparks)
        Local i,life
        For i=1 To CountChildren(sparks)
                spark=GetChild(sparks,i)
                life=EntityName(spark) : life=life+1 : NameEntity spark,life
                MoveEntity spark,0,0,-1 : TranslateEntity spark,0,-life/5.0,0,True
                EntityColor spark,512/life,512/life,512/life
                If life>20 Then FreeEntity spark : i=i-1
        Next
End Function

Function Cirtex(rad)
        texture=CreateTexture(rad,rad)
        SetBuffer TextureBuffer(texture)
        Color 255,255,255 : Rect 0,0,rad,rad,True
        Color 200,200,200 : Oval 0,0,rad,rad,True
        Color 100,100,100 : Oval 12,12,rad-24,rad-24,True
        SetBuffer BackBuffer()
        Return texture
End Function

; Birdies CreateSegCube Function from the archives (slightly modified)
Function CreateSegCube(segs=1,parent=0)
        Local a,b,scnt,stp#=2.0/segs,stx#,sty#,x#,y#,u#,v#,v0,v1,v2
        Local mesh=CreateMesh( parent )
        For scnt=0 To 5
                surf= CreateSurface( mesh )
                stx = -1 : sty = stx : y = sty
                For a=0 To segs
                        x = stx : v = a / Float(segs)
                        For b=0 To segs
                                u = b / Float(segs)
                                VertexNormal(surf,AddVertex(surf,x,y,1,u,v),0,0,1)
                                x = x + stp
                        Next
                        y = y + stp
                Next
                For a=0 To segs-1
                        For b=0 To segs-1
                                v0 = a*(segs+1)+b      : v1 = v0+1
                                v2 = (a+1)*(segs+1)+b+1 : v3 = v2-1
                                AddTriangle( surf,v0,v1,v2 )
                                AddTriangle( surf,v0,v2,v3 )
                        Next
                Next
                If scnt<4 Then RotateMesh mesh,0,90,0  ; rotate to side
                If scnt=3 Then RotateMesh mesh,90,0,0  ; rotate to top
                If scnt>3 Then RotateMesh mesh,180,0,0 ; rotate to bottom
        Next
        Return mesh
End Function


Слушай не сочти меня тупицей но как задать кол-во spark'ов в функции
Function updatesparks(sparks)
Local i,life
For i=1 To CountChildren(sparks)
spark=GetChild(sparks,i)
life=EntityName(spark) : life=life+1 : NameEntity spark,life
MoveEntity spark,0,0,-1 : TranslateEntity spark,0,-life/5.0,0,True
EntityColor spark,512/life,512/life,512/life
If life>20 Then FreeEntity spark : i=i-1
Next
End Function

Ведь я так понял что создаётся всего лишь одна частица от выстрела?

Hurrit 02.11.2009 11:59

Ответ: Эфект от выстрела
 
Понятия не имею, да мне и плевать. Игроку будет всё равно, как там эти координаты находятся, ему важен результат

Knightmare 02.11.2009 13:59

Ответ: Re: Ответ: Эфект от выстрела
 
Цитата:

Сообщение от pipns (Сообщение 123123)
Конечно, будет намного проще и эфективней. Я, просто, прочту один пиксель з-буфера и спомощью одной формулы узнаю расстояние и время столконвение пули со стенной. А теперь, не поленись и посмотри, по каким формулам находяться пересечение объектов в твоем блитце!:rolleyes:

Чуваг! Не говори о том в чем сам не разбираешься. Твой метод будет на 3 порядка медленнее чем "такой тупом метод блитза". Ибо чистая математика быстрее в разы чем любые операции по чтению пикселей из текстур, з-буферов, стенсиля. Только полные идиоты начитавшиеся недоуроков по OpenGL делают пик объектов через рендер объектов разным цветом и чтение цвета пиксела в заданной точке.

tormoz 02.11.2009 17:52

Ответ: Re: Ответ: Эфект от выстрела
 
Цитата:

Сообщение от pipns (Сообщение 123123)
Конечно, будет намного проще и эфективней. Я, просто, прочту один пиксель з-буфера и спомощью одной формулы узнаю расстояние и время столконвение пули со стенной. А теперь, не поленись и посмотри, по каким формулам находяться пересечение объектов в твоем блитце!:rolleyes:

Спасибо, я смеялся 10 минут.
Ты продлил мне жизнь :-D

Расскажи еще что-нить из серии "этот тупой блитц и умный йа"
в жизни так мало юмора...:super:

NitE 02.11.2009 17:59

Ответ: Эфект от выстрела
 
Код:

       
        If MouseDown(1) Or KeyHit(57) Then
                If MilliSecs()>delaytime Then
                        delaytime=MilliSecs()+100
                        If shot Then PlaySound shot                               
                        picked=CameraPick(camera, CentreX+Rnd(-10,10),CentreY+Rnd(-10,10))
                        If picked<>0 Then
                                makehole(hole,holes)
                                For i=1 To 10
                                makespark(spark,sparks)
                                Next                       
                        EndIf
                EndIf
        EndIf

или
Код:

Function makespark(spark,sparks,count)
For i=1 To count
        Local rv#=Rnd(-0.8,0.8)
        spark=CopyEntity(spark,sparks)
        PositionEntity spark,PickedX(),PickedY(),PickedZ(),True
        AlignToVector spark,-PickedNX()+Rv,-PickedNY()+Rv,-PickedNZ()+Rv,3
Next
End Function



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

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