Seite 2 von 2

Verfasst: 03.11.2008 23:39
von Kaeru Gaman
> Kanns ja hier dann nochmal posten.
yo, das wär cool!

Verfasst: 04.11.2008 02:01
von KeyKon
Ich konnts nich lassen das ganze selber mal ein bisschen abzuändern, habs in ne LinkedList mit Struktur gepackt und ein bisschen verschönert, vll kanns ja der eine oder andere Neuling gebrauchen deswegen hab ich ein paar Kommentare reingebaut...

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()


W.l = 1280 ;Screen-Breite
H.l = 1024 ;Screen-Höhe

If OpenScreen(W,H,32,"Vulkan Partikelstrahlen") = 0
  End
EndIf

Structure dat ;Partikeldaten-Structur
  x.f
  y.f
  oldx.l
  oldy.l
  xm.f
  ym.f
  c.w
EndStructure

NewList p.dat() ;Partikelliste erstellen

Repeat
  
  
  
  ExamineKeyboard()
  ExamineMouse()
  
  ClearScreen(0)


  If MouseButton(1) 
  
   For x = 1 To 5 ;Gleich 5 auf einmal für mehr Volumen
    
    AddElement(p()) ;Neuen Partikel erstellen
     ;Startposition an Maus:
      p()\x = MouseX()
      p()\y = MouseY()
      p()\oldx = MouseX()
      p()\oldy = MouseY()
     ;Startgeschwindigkeit zufällig:
      p()\xm = (Random(200)-100)/100
      p()\ym = -(Random(300)/100)-4
     ;Zur Quradratbildungsvermeindung:
      p()\ym + Abs(p()\xm)-1
     ;Start-Farbe:
      p()\c = 511
     
   Next
   
  EndIf
  
  If MouseButton(2)
    ClearList(p()) ;Alle Partikel löschen
  EndIf



  StartDrawing(ScreenOutput())

    ForEach p()
      
     ;Alte Werte merken
      oldx = p()\x
      oldy = p()\y
      
     ;Partikelbewegung
      p()\ym + 0.05 ;Geschwindigkeit nach unten nimmt zu
      p()\x + p()\xm ;X-Position wird geändert
      p()\y + p()\ym ;Y-Position wird geändert
      p()\c - 2 ;Farbe wird dunkler
      

      
      If p()\c < 0 Or p()\y > H+10 Or p()\x < -10 Or p()\x > W+10 ;Wenn Schwarz oder außerhalb des Bildschirms
      
        DeleteElement(p()) ;Partikel kann weg
        
      Else
       
       ;Farbe bestimmen:
        If p()\c > 256 ;Gelb nach Rot
          color = RGB(255,p()\c-256,0)
        Else ;Rot nach Schwarz
          color = RGB(p()\c,0,0)
        EndIf
        
       ;Dunkler für den alten Teil:
        If p()\c-20 > 256 ;Gelb nach Rot
          darkcolor = RGB(255,p()\c-256-20,0) 
        ElseIf p()\c-20 > 0 ;Rot nach Schwarz
          darkcolor = RGB(p()\c-20,0,0)
        Else
          darkcolor = 0
        EndIf
        
       ;Beide Teile Zeichnen:
        LineXY(oldx,oldy,p()\oldx,p()\oldy,darkcolor) ;Alten Teil nochmal zeichnen
        
        LineXY(p()\x,p()\y,oldx,oldy,color) ;Neuen Teil zeichnen

       ;Alte Werte eintragen:
        p()\oldx = oldx
        p()\oldy = oldy
        
      EndIf
      
      
      
    Next
  
    Circle(MouseX(),MouseY(),4,RGB(255,255,128)) ;Maus Zeichnen
  
  StopDrawing()
  
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)

CloseScreen()

End 

Verfasst: 05.11.2008 14:49
von Häns
@Keykon: :o

Cool! :allright:

Häns

Verfasst: 22.11.2008 17:04
von mpz
Hi,

Ich habe jetzt auch eine Partikelengine in meine MP_3D Engine integriert. Genug Parameter hat es wie:

Wind, Gravitation, Richtung, Bewegung, Drehung, Anzahl der Partikel, Grösse, Stärke, Textur ändern etc... allerdings im 3D Raum. Ein kleines Beispiel liegt als EXE dabei und der Sourcecode auch...

Weiss jemand warum die Partikeldemo von Ogre (findet man PureBasic\Examples\Sources\Particle.pb) 50% der CPU Zeit kostet?

Gruß Michael

http://rapidshare.de/files/40968593/MP_ ... o.exe.html

Code: Alles auswählen


;////////////////////////////////////////////////////////////////
;//
;// Project Title: MP 3D Engine
;// File Title: MP_DX9_Partikel.pb
;// Created On: 22.11.2008
;// Updated On: 
;// Author: Michael Paulwitz
;// OS:Windows
;// 
;// Demofile für meine Partikelengine
;// 
;////////////////////////////////////////////////////////////////

;-
;- ProgrammStart


MP_Graphics3D (640,480,0,3) ; Erstelle ein WindowsFenster #Window = 0
SetWindowTitle(0, "3D Partikel Test") ; So soll es heissen

Particle.l = MP_CreateParticleEmitter() ; Fontaine mit Wind
MP_PositionEntity (Particle,3,0,0) ; Setzt ein Objekt an einen x,y,z Ort
MP_ParticleColorRange (Particle,RGB(255,255,255),RGB(255,255,255)) ; Farbe von RGB Wert zu RGB Wert
MP_ParticleEmissionRate (Particle,500,5,0.05); Maximale Partikel, Ausstoßmenge und Zeiteinheit in s dafür
MP_ParticleTimeToLive(Particle, 3, 6); Partikellebenszeit von s bis s
MP_ParticleSize (Particle,0.5); Partikelgrösse
MP_ParticleVelocity(Particle,0,5,0,1.5); Ausstossrichtung als x,y,z und Verteilungsstärke
MP_ParticleWind(Particle, 2, 0 ,0); Wind als x,y,z    

Particle2.l = MP_CreateParticleEmitter() ; Explosion
MP_ParticleColorRange (Particle2,RGB(0,0,0),RGB(255,0,0)) ; Farbe von RGB Wert zu RGB Wert
MP_ParticleEmissionRate (Particle2,100,100,0.05);  Maximale Partikel, Ausstoßmenge und Zeiteinheit in s dafür
MP_ParticleTimeToLive(Particle2, 0.4, 0.6); Partikellebenszeit von s bis s
MP_ParticleSize (Particle2,2); Partikelgrösse
MP_ParticleVelocity(Particle2,0,0,0,10); Ausstossrichtung als x,y,z und Verteilungsstärke
  
Particle3.l = MP_CreateParticleEmitter() ;Vulkan aus MPs
MP_PositionEntity (Particle3,-5,0,0) ; Setzt ein Objekt an einen x,y,z Ort
MP_ParticleColorRange (Particle3,RGB(0,0,0),RGB(255,255,255)) ; Farbe von RGB Wert zu RGB Wert
MP_ParticleEmissionRate (Particle3,100,10,0.05);  Maximale Partikel, Ausstoßmenge und Zeiteinheit in s dafür
MP_ParticleTimeToLive(Particle3, 3, 4); Partikellebenszeit von s bis s
MP_ParticleVelocity(Particle3,0,5,0,2.5); Ausstossrichtung als x,y,z und Verteilungsstärke
MP_ParticleGravity(Particle3,0,-5,0) ; Gravitatio als x,y,z    

Textur = MP_CreateTextureFromFileInMemory (?logostart,?logostart-?logostop)
MP_EntityTexture(Particle3,Textur)

camera=MP_CreateCamera() ; Kamera erstellen

x.f=0 : y.f=0 : z.f = -18 
MP_PositionCamera(camera,x.f,y.f,z.f) ; Kameraposition 

light=MP_CreateLight(1,90,0,0) ; Es werde Licht

cube=MP_CreateCube() ; Nen Würfel

MP_EntityColor (cube,100,100,255) ; Würfel färben als R,G,B Wert

While Not MP_KeyDown(#PB_Key_Escape) And Not MP_WindowEvent() = #PB_Event_CloseWindow; Esc abfrage oder schliessen
    
    MP_DrawText (10,10,RGB(255,255,255),"Läuft mit "+Str(MP_FPS ())+" FPS") ; Textanzeige an Position x,y, Farbe RGB und Text$
    MP_TurnEntity (cube,0.05,0.5,1) ; Würfel Drehen
    MP_RenderWorld () ; Hier gehts los
    MP_Flip () ; 

Wend

End

DataSection
  logostart:
  IncludeBinary "c:\programme\purebasic\media\mp_logo.png" ; Mein MP Bild included
  logostop:
EndDataSection