Draw3D ParticleManager [GELÖST]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

faeX

Betreff: Draw3D ParticleManager [GELÖST]

BeitragDi, Dez 30, 2008 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich programmiere noch nicht lange in Blitz, habe mich trotzdem aber mal an eine ParticleEngine, genannt ParticleManager für Draw3D drangemacht. Noch ist sie nicht fertig, ich wollte aber schonmal eine Demo schreiben um zu testen ob sie läuft. Und Bumm, ein Fehler drin. Immer bei Code: [AUSKLAPPEN]
Particles.Particle\X = Emitters\X + Rnd(Emitters\XOffMin, Emitters\XOffMax)
kommt eine Fehlermeldung: Zitat:
Object does not exist.


Und hier der Code:
ParticleManager.bb: Code: [AUSKLAPPEN]
; Draw3D ParticleManager

Include "Draw3D.bb"
Local i

Type Emitter
   Field X#, Y#                              ; Emitterposition
   Field Angle#                              ; Emitterausrichtung

; Die Ausrichtung hat Auswirkung auf den Auswurf der Partikel!
; Angle=0; XVel=1; YVel=1; Ist nicht gleich Angle=90; XVel=1; YVel=1!

   Field XOffMin#, XOffMax#, YOffMin#, YOffMax#      ; Offset
   Field XVelMin#, XVelMax#, YVelMin#, YVelMax#      ; Velocity
   Field XFactor#, YFactor#                     ; Faktoren
   Field XGravity#, YGravity#                     ; Gravitation
   Field StartScaleMin#, StartScaleMax#            ; StartSkalierungen
   Field ScaleFactor#, ScaleAdd#                  ; Skalierungsverlauf
   Field StartAngleMin#, StartAngleMax#            ; Startausrichtung
   Field StartRotMin#, StartRotMax#               ; StartRotation
   Field PointInDirection                        ; In die bewegte Richtung zeigen?
   Field RotFactor#, RotAdd#                     ; Rotationsverlauf
   Field ParticleAddMin%, ParticleAddMax%            ; Partikelausschuss
   Field MaxParticles%                           ; Maximale Anzahl der Partikel
   Field ParticleLifeTimeMin%, ParticleLifeTimeMax%   ; Lebensdauer
   Field AlphaTime%                           ; X Frames vor Schluss anfangen auszublenden
   Field StartR%, StartG%, StartB%                  ; Start RGB Werte
   Field EndR%, EndG%, EndB%                     ; End RGB Werte
   Field Image                                 ; Image
   Field Particles.Particle                     ; Partikel
End Type

Type Particle
   Field X#, Y#                              ; Position
   Field XVel#, YVel#                           ; Velocity
   Field Angle#                              ; Ausrichtung
   Field Rot#                                 ; Rotation
   Field Scale#                              ; Skalierung
   Field LifeTime%                              ; Restliche Lebenszeit
End Type

Global Emitters.Emitter

Function UpdateParticles()
   For Emitters.Emitter = Each Emitter
      For Emitters\Particles.Particle = Each Particle

         ; Lebenszeit
         Particles.Particle\LifeTime = Particles\LifeTime - 1
         If Particles\LifeTime <= 0 Then Delete Particles

         ; Bewegung
         Particles\XVel = Particles\XVel - Emitters\XGravity
         Particles\XVel = Particles\XVel * Emitters\XFactor
         Particles\X = Particles\X + Particles\XVel
         Particles\YVel = Particles\YVel - Emitters\YGravity
         Particles\YVel = Particles\YVel * Emitters\YFactor
         Particles\Y = Particles\Y + Particles\YVel

         ; Ausrichtung
         If Emitters\PointInDirection Then ; In die Flugrichtung zeigen
            Particles\Angle = ATan(Particles\YVel / Particles\XVel) ; Steigungsdreieck
         Else ; Normal rotieren
            Particles\Rot = Particles\Rot * Emitters\RotFactor
            Particles\Angle = Particles\Angle + Particles\Rot
         EndIf

         ; Skalierung
         Particles\Scale = (Particles\Scale + Emitters\ScaleAdd) * Emitters\ScaleFactor

      Next

      ; Neue Partikel generieren
      For i = 1 To Rnd(Emitters\ParticleAddMin, Emitters\ParticleAddMax)

         ; Neuer Partikel
         Emitters\Particles.Particle = New Particle

         ; StartPosition
         Particles.Particle\X = Emitters\X + Rnd(Emitters\XOffMin, Emitters\XOffMax)
         Particles\Y = Emitters\Y + Rnd(Emitters\YOffMin, Emitters\YOffMax)
         
         ; Startausrichtung
         Particles\Angle = Rnd(Emitters\StartAngleMin, Emitters\StartAngleMax)
         
         ; Startskalierung
         Particles\Scale = Rnd(Emitters\StartScaleMin, Emitters\StartScaleMax)
         
         ; Lebenszeit
         Particles\LifeTime = Rnd(Emitters\ParticleLifeTimeMin, Emitters\ParticleLifeTimeMax)
         
         ; Velocity
         X = Rnd(Emitters\XVelMin, Emitters\XVelMax) ; Ohne Winkel
         Y = Rnd(Emitters\YVelMin, Emitters\YVelMax)
         Particles\XVel = X * Cos(Particles\Angle - 90) + Y * Sin(Particles\Angle) ; Mit Winkel
         Particles\YVel = X * Cos(Particles\Angle) + Y * Sin(Particles\Angle - 90)

         ; Rotierung
         Particles\Rot = Rnd(Emitters\StartRotMin, Emitters\StartRotMax)
         
      Next

   Next
End Function

Function DrawParticles()


   For Emitters.Emitter = Each Emitter
      For Emitters\Particles.Particle = Each Particle
         DrawImage3D(Emitters.Emitter\Image, Particles.Particle\X, Particles\Y, 0, Particles\Angle, Particles\Scale)
      Next
   Next
End Function

Demo1.bb: Code: [AUSKLAPPEN]
AppTitle "Draw3D ParticleManager Demo 1"

Include "ParticleManager.bb"

Graphics3D 800,600,32,1

Camera = CreateCamera()
DrawInit3D(Camera)
Origin3D(800,600)

Emitters.Emitter = New Emitter
Emitters.Emitter\Image = LoadImage3D("Media\Particle-065.png")
Emitters\Angle = 0
Emitters\StartRotMin = -2
Emitters\StartRotMax = 2
Emitters\XVelMin = -2
Emitters\XVelMax = 2
Emitters\YVelMin = -2
Emitters\YVelMax = 2
Emitters\XGravity = 0
Emitters\YGravity = .2
Emitters\StartAngleMin = 0
Emitters\StartAngleMax = 10
Emitters\ParticleAddMin = 2
Emitters\ParticleAddMax = 5
Emitters\ParticleLifeTimeMin = 50
Emitters\ParticleLifeTimeMax = 200

MFPS = 60
Period = 1000/MFPS
Time = MilliSecs()-Period
Repeat
   Repeat
      Elapsed = MilliSecs() - time
   Until Elapsed

   Ticks=Elapsed/Period
   Tween#=Float(Elapsed Mod Period) / Float(Period)

   For U = 0 To Ticks
      Time = Time + Period
      If U = Ticks Then CaptureWorld
      
      UpdateParticles()
      UpdateWorld
   Next
      
   DrawParticles()
   RenderWorld Tween
   Clear3D()
   
   FPS = GetFPS()
   Text 0,0,FPS

   Flip False

Until KeyHit(1)

Function GetFPS()
   Frames = Frames + 1
   
   If MilliSecs() > LastCheck+1000 Then
      LastCheck = MilliSecs()
      FPS = Frames
      Frames = 0
   EndIf
   Return FPS
End Function


Hectic's Draw3D muss natürlich im selben verzeichnis liegen Wink

EDIT: Der Link ist nachgetragen.
  • Zuletzt bearbeitet von faeX am Di, Dez 30, 2008 20:40, insgesamt einmal bearbeitet

Der Eisvogel

BeitragDi, Dez 30, 2008 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast ja, soweit ich das sehe, kein Handle darin abgespeichert. Überprüf mal ob die Variable zu dem Zeitpunkt NULL ist.
Für das hier vor der Zeile ein, in der der Fehler auftritt:
Code: [AUSKLAPPEN]
If Particles.Particle=Null then RuntimeError("In dieser Variable wurde kein Handle zu einem Type-Feld gespeichert!")


MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

faeX

BeitragDi, Dez 30, 2008 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Der fehler schlägt aus.
Aber wie beseitige ich das jetzt?

EDIT: Ich meine, ich habe ja direkt davor ein neues Particle erstellt, oder etwa nicht?
EDIT2: Problem gelöst: Vor jedes Particles musste noch ein Emitters\

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group