Seite 1 von 1

Referenz auf Sprite direkt nach der Erstellung verloren

Verfasst: 07.06.2015 11:56
von Gamma
Folgender Code produziert den Laufzeitfehler
Das angegebene #Sprite ist nicht initialisiert. Es wird aber doch in der Zeile direkt davor erzeugt, wie kann das also sein

Der Fehler taucht in der Zeile

Code: Alles auswählen

StartDrawing(SpriteOutput(*Particle\Sprite))
Die Initialisierung erfolgt in der Zeile davor

Code: Alles auswählen

*Particle\Sprite = CreateSprite(#PB_Any,*Particle\Width,*Particle\Height,#PB_Sprite_AlphaBlending)
Da ich noch neu in PureBasic bin, bin ich mir nicht so sicher, ob das womöglich was mit den Pointern zu tun hat

Code: Alles auswählen

Procedure paintSingleParticle(*Particle.ParticleStruct)
  If *Particle\Sprite = 0
    ; Erstellt einen leeren Sprite in der passenden Größe
    *Particle\Sprite = CreateSprite(#PB_Any,*Particle\Width,*Particle\Height,#PB_Sprite_AlphaBlending)
    StartDrawing(SpriteOutput(*Particle\Sprite))
    ; Allgemeine Einstellungen setzen
    BackColor(RGBA(0,0,0,0))
    FrontColor(RGB(*Particle\Red,*Particle\Green,*Particle\Blue))
    DrawingMode(#PB_2DDrawing_Default)
    Select *Particle\ParticleType
      Case #PRIMITIVE_CIRCLE
        ; Kreis zeichnen
        Circle(*Particle\Width / 2,*Particle\Height / 2,*Particle\Width / 2)
      Case #PRIMITIVE_RECTANGLE
        ; Rechteck zeichnen
        Box(0,0,*Particle\Width,*Particle\Height)
      Case #PRIMITIVE_TRIANGLE
        ; Dreieck zeichnen
        Line(*Particle\Width / 2, 0, *Particle\Width / 2, *Particle\Height)
        Line(0,*Particle\Height,*Particle\Width / 2, -*Particle\Height)
        Line(9,*Particle\Height,*Particle\Width,*Particle\Height)
        FillArea(*Particle\Width / 2, *Particle\Height / 2,RGB(*Particle\Red,*Particle\Green,*Particle\Blue))
      Case #COMPLEX_SPRITE
        ; Sprite zeichnen
        ; Erzeugt eine Kopie für die Resize Aktion
        *Particle\Sprite = CopySprite(Images(*Particle\ParticleTexture),#PB_Any,#PB_Sprite_AlphaBlending)
        ; Skaliert die Größe der Kopie auf die Größe des Partikels
        ZoomSprite(*Particle\Sprite,*Particle\Width,*Particle\Height)        
    EndSelect
    StopDrawing()
  EndIf
  ; Rotiert das Sprite Element auf den aktuellen Winkel
  RotateSprite(*Particle\Sprite,*Particle\CurrentRotation,#PB_Absolute)
  ; Zeichnet das Sprite Element
  DisplayTransparentSprite(*Particle\Sprite,*Particle\PositionX,*Particle\PositionY,*Particle\Alpha)
EndProcedure

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Verfasst: 07.06.2015 12:19
von Derren

Code: Alles auswählen

Procedure paintSingleParticle(*Particle.ParticleStruct)
  If *Particle\Sprite = 0
    ; Erstellt einen leeren Sprite in der passenden Größe
  	*Particle\Sprite = CreateSprite(#PB_Any,*Particle\Width,*Particle\Height,#PB_Sprite_AlphaBlending)
  	
  	If *Particle\Sprite = 0
  		Debug "Sprite konnte nicht erstellt werden"
  		End
  	EndIf 
  	
    StartDrawing(SpriteOutput(*Particle\Sprite))
;... und so weiter
Und dann kanst du gucken warum. Es muss ja irgendwo Speicher reserviert werden für das Sprite. Aber den Code hast du nicht angegeben (genauso wenig wie benötigte Konstante und die Struktur)

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Verfasst: 07.06.2015 12:22
von STARGÅTE
Schon mal überprüft ob die Breite oder Höhe (*Particle\Width,*Particle\Height) null sind?
Denn dann schlägt das erstellen des Sprites fehlt und gibt 0 zurück.

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Verfasst: 07.06.2015 12:31
von Gamma
Danke für den Tipp mit Breite und Höhe, das war es.

Hatte vorher in einer Schleife die Partikel durch die Generatoren erzeugen lassen und einer war nicht initialisiert und hat daher versucht Partikel mit 0er Größe zu erstellen