[B3D] Partikelengine

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Matthias

Betreff: [B3D] Partikelengine

BeitragDo, Jan 31, 2008 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Vor einigen Tagen hab ich hier auf diesen Thread geantwortet. Es ging um Patikel. Naja um es kurz zu machen, hab ich mich hingesetzt und ein Beispiel gemacht. Es hat einige Stunden gedauert, und damit die Zeit nicht ganz so umsonst war habe ich mir gedacht vieliecht kann jemand diese Patikelengine gebrauchen.

Es kommt ganz ohne Types aus, da ich der Meinung bin das Types langsammer sind als Eindimensionale Dim Felder.

Natürlich hätte ich den Code noch weiter auf Speed optiemieren können,
aber dadurch wird der Code so komplieziert das gereade die Beginner ihn nicht mehr verstehen würden.

https://www.blitzforum.de/foru...p;start=20

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
Global MaxPatikel=16000
Global IstPatikel
Global MaxQuellPat
Global PatikelUpdateTakt
Global MaxPatikelStep=40
Global PatikelMesh


Dim Patikel#(MaxPatikel*8)
Dim QPatikel#(5000*16)
Dim PatFarbe(MaxPatikelStep*4+4)

SeedRnd(MilliSecs())
;Patikel Eigenschafften
;0=QuellID
;1=XPos
;2=YPos
;3=ZPos
;4=XMove
;5=YMove
;6=ZMove
;7=MaxZyklus






For I=MaxPatikelStep To 0 Step -1 
  R=255-J*2 R=R*(R>0) PatFarbe(I*4+0)=R ;Rot
  G=255-J*4 G=G*(G>0) PatFarbe(I*4+1)=G ;Grün
  B=0       B=B*(B>0) PatFarbe(I*4+2)=0 ;Blau
  J=J+1 
Next


InitPatikelMesh()
InitCamera()
CreateQuellPatikel()






SetBuffer BackBuffer()
Repeat

  MS=MilliSecs():FPSz=FPSz+1
  If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0
       
 
  If KeyDown(57) And MS>TastTimer Then
    TastTimer=MS+9:CreatePatikel(200)
  End If
  UpdatePatikel(20)
  ;UpdatePatikel(-1):CreatePatikel(300):TastTimer=MS ;VolleBelastung

     
 
 RenderWorld
 Text 10,10,"FPS:"+FPS+" Patikel:"+IstPatikel+"   Drücke Space"
 Flip 0
Until KeyDown(1)=1
End




Function UpdatePatikel(Takt)

If MilliSecs()<PatikelUpdateTakt Then Return
PatikelUpdateTakt=MilliSecs()+Takt


Surf=GetSurface(PatikelMesh,1)
V1=0:V2=1:V3=2:LastP=IstPatikel Shl 3

While I<IstPatikel Q=Patikel(P)
  Zyk=Patikel(P+7)-1:Patikel(P+7)=Zyk
 
  If Zyk<1 Then
    ;---ToterPatikel tauschen mit Letzten---
    For K=0 To 15 Patikel(P+K)=Patikel(LastP+K) Next
    Q=Patikel(P) V=IstPatikel*3
   ;----Den Letzten löschen----
    VertexCoords Surf,V,0,0,0:Zyk=0
    VertexCoords Surf,V+1,0,0,0
    VertexCoords Surf,V+2,0,0,0
    IstPatikel=IstPatikel-1:LastP=IstPatikel Shl 3
  End If


  FarbWert=Zyk Shl 2
  R=PatFarbe(FarbWert+0):G=PatFarbe(FarbWert+1):B=PatFarbe(FarbWert+2)

  X#=Patikel(P+1)+Patikel(P+4):Patikel(P+1)=X:VertexColor Surf,V1,R,G,B
  Y#=Patikel(P+2)+Patikel(P+5):Patikel(P+2)=Y:VertexColor Surf,V2,R,G,B
  Z#=Patikel(P+3)+Patikel(P+6):Patikel(P+3)=Z:VertexColor Surf,V3,R,G,B

  VertexCoords Surf,V1,X+QPatikel(Q+3),Y+QPatikel(Q+4),Z+QPatikel(Q+5)
  VertexCoords Surf,V2,X+QPatikel(Q+6),Y+QPatikel(Q+7),Z+QPatikel(Q+8)
  VertexCoords Surf,V3,X+QPatikel(Q+9),Y+QPatikel(Q+10),Z+QPatikel(Q+11)
  V1=V1+3:V2=V2+3:V3=V3+3:I=I+1:P=P+8
Wend

If IstPatikel<1 Then HideEntity PatikelMesh
End Function


Function InitCamera()
CameraPivot=CreatePivot()
CamRollPiv=CreatePivot(CameraPivot)
Camera=CreateCamera(CamRollPiv)
MoveEntity Camera,0,0,-5
;CameraClsColor Camera,0,0,200
Licht=CreateLight():TurnEntity Licht,45,45,0
End Function


Function CreateQuellPatikel()
Spalt#=0:Gr#=.02

Sphere=CreateSphere(50):Surf=GetSurface(Sphere,1)
MaxV=CountVertices(Surf)-1:RotateMesh Sphere,0,0,45

For I=0 To MaxV:X#=VertexX(Surf,I)
  Y#=VertexY(Surf,I):Z#=VertexZ(Surf,I)
  If X<-Spalt Or X>Spalt Then
    If Y<-Spalt Or Y>Spalt Then
      If Z<-Spalt Or Z>Spalt Then
         ;-----Zum Mittlepunkt drehen
        TFormVector Gr#,-Gr#,0,Piv,0
        QPatikel(J+3) = TFormedX#()
        QPatikel(J+4) = TFormedY#()
        QPatikel(J+5) = TFormedZ#()
        TFormVector -Gr#,-Gr#,0,Piv,0
        QPatikel(J+6) = TFormedX#()
        QPatikel(J+7) = TFormedY#()
        QPatikel(J+8) = TFormedZ#()
        TFormVector 0,0,0,Piv,0
        QPatikel(J+9) = TFormedX#()
        QPatikel(J+10) = TFormedY#()
        QPatikel(J+11) = TFormedZ#()   
        MaxQuellPat=MaxQuellPat+1:QPatikel(J+0)=X
        QPatikel(J+1)=Y:QPatikel(J+2)=Z::J=J+16
     End If
    End If
  End If

Next
  FreeEntity Sphere
End Function


Function CreatePatikel(AddMaxPat)
If IstPatikel=>MaxPatikel Then Return 


  For I=0 To AddMaxPat
    Speed#=Rnd(.02,.1)
    J=Rand(MaxQuellPat)*16
    PID=IstPatikel Shl 3
    Patikel(PID)=J:Patikel(PID+1)=0
    Patikel(PID+2)=0:Patikel(PID+3)=0

    Patikel(PID+4)=QPatikel(J)*Speed
    Patikel(PID+5)=QPatikel(J+1)*Speed
    Patikel(PID+6)=QPatikel(J+2)*Speed
    Patikel(PID+7)=Rand(MaxPatikelStep*.75,MaxPatikelStep)
    IstPatikel=IstPatikel+1
    If IstPatikel=>MaxPatikel Then Exit
  Next
ShowEntity PatikelMesh
End Function






Function InitPatikelMesh()

 PatikelMesh=CreateMesh()
    Surf=CreateSurface(PatikelMesh):EntityFX PatikelMesh,19

    For Tri=0 To MaxPatikel-1
        v1 = AddVertex(surf,0,0,0,1,1)
        v2 = AddVertex(surf,0,0,0,0,1)
        v3 = AddVertex(surf,0,0,0,1,0)
        AddTriangle(surf,v1,v2,v3)
    Next
 
End Function

  • Zuletzt bearbeitet von Matthias am Do, Jan 31, 2008 15:08, insgesamt 4-mal bearbeitet
 

gigi

BeitragDo, Jan 31, 2008 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir kommt:"Array index out of bounds"
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185
 

Matthias

BeitragDo, Jan 31, 2008 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Upss hatte nicht mit Debugger getestet. Habe aber jetzt den kleinen Fehler behoben.

Hip Teen

BeitragDo, Jan 31, 2008 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur so: Es heißt Partikel Engine und nicht Patik Enagie. Außer du meinst was anderes Wink Wenn du das änderst, ist der Thread auch mit der Suche auffindbar!
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

Travis

BeitragFr, Feb 08, 2008 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
An dem Ausblenden der Partikel solltest du noch arbeiten. Das sieht etwas ruckelig aus. Ansonsten läuft's aber schön flott.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

mabox

BeitragSo, Feb 17, 2008 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht schlecht, bei mir läuft es auch wenn ich dauerhaft auf der Leertaste bleibe mit ca. 400 FPS
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group