Referenz auf Sprite direkt nach der Erstellung verloren

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Gamma
Beiträge: 2
Registriert: 07.06.2015 11:52

Referenz auf Sprite direkt nach der Erstellung verloren

Beitrag 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
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Beitrag 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)
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Gamma
Beiträge: 2
Registriert: 07.06.2015 11:52

Re: Referenz auf Sprite direkt nach der Erstellung verloren

Beitrag 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
Antworten