
Ist in der Darstellung viel schneller als die 2D Drawingsachen...
Guckst du:
Code: Alles auswählen
Dim Sprite2D.i ( 49 ); 2D Sprites als Array ( wird benötigt, um daraus ein 3D Sprite erstellen zu können )
Global Dim Sprite3D.i ( 49 ); selbiges als 3D
; Gibt eine zufällige Fließkommazahl im Intervall [0.0, Maximum] zurück.
Procedure.f RandomFloat(Maximum.f=1.0)
ProcedureReturn Maximum * 4.6566128752457969241e-10 * Random(2147483647)
EndProcedure
; Gibt einen zufälligen Winkel im Bogenmaß im Intervall [0, 2*Pi[ zurück.
Procedure.f RandomAngle()
ProcedureReturn 2.9258361585343193621e-9 * Random(2147483647)
EndProcedure
; Partikelstruktur
Structure Particle
Sprite.i
X.f
Y.f
Zoom.f
DirectionX.f
DirectionY.f
EndStructure
Global NewList Particle.Particle()
; Erzeugt eine Explosion
Procedure CreateExplosion(X.f, Y.f, Particles.i=1000)
Protected Index.i, Speed.f, Angle.f
For Index = 1 To Particles
AddElement(Particle())
Particle()\Sprite = Sprite3D( Random( 49 ) )
Particle()\X = X
Particle()\Y = Y
Angle = RandomAngle()
Speed = RandomFloat(6)
Particle()\DirectionX = Cos(Angle)*Speed ; Hier speicher ich die Veränderung für X und Y direkt im Element,
Particle()\DirectionY = Sin(Angle)*Speed ; um nicht jedes mal später Cos() und Sin() (langsammer) aufzurufen.
Particle()\Zoom = RandomFloat(3)+2
Next
EndProcedure
Enumeration
#Window
EndEnumeration
InitSprite()
InitSprite3D()
InitMouse()
InitKeyboard()
OpenWindow(#Window, 0, 0, 800, 600, "ScreenTitle", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 0, 0, 0)
; 50 Particle als Sprite3D in verschiedenen Farben erstellen
For i = 0 To 49
ClearScreen( 0 )
If StartDrawing( ScreenOutput() )
Circle( 16, 16, 16, RGB(30+Random(255), 30+Random(255), 30+Random(255)))
StopDrawing()
EndIf
Sprite2D( i ) = GrabSprite( #PB_Any, 0, 0, 32, 32, #PB_Sprite_Texture )
Sprite3D( i ) = CreateSprite3D( #PB_Any, Sprite2D( i ) )
Next
Define MousePushed.i, MouseX.i, MouseY.i
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #Null
Break
EndSelect
ForEver
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
EndIf
If ExamineMouse()
MouseX = MouseX()
MouseY = MouseY()
If MouseButton(#PB_MouseButton_Left)
MousePushed = #True
ElseIf MousePushed
CreateExplosion(MouseX, MouseY)
MousePushed = #False
EndIf
EndIf
; Partikelberechungen
ForEach Particle()
Particle()\X + Particle()\DirectionX
Particle()\Y + Particle()\DirectionY
Particle()\Zoom - 0.05 ; Macht das Partikel kleiner und
If Particle()\Zoom <= 0.0 ; löscht es dann wenn es zu klein wird
DeleteElement(Particle())
EndIf
Next
ClearScreen(0)
If Start3D()
; Partikelanzeige
ForEach Particle()
ZoomSprite3D( Particle()\Sprite, Particle()\Zoom, Particle()\Zoom )
DisplaySprite3D( Particle()\Sprite, Particle()\X, Particle()\Y, 255 )
Next
Stop3D()
EndIf
If StartDrawing( ScreenOutput() )
DrawText( 0, 0, "Anzahl Particle : " + Str( ListSize( Particle() )), $FFFFFF )
Circle( MouseX, MouseY, 5, $FFFFFF )
StopDrawing()
EndIf
FlipBuffers()
ForEver