Seite 1 von 3

Sprite laden funktioniert nicht

Verfasst: 10.04.2020 12:47
von Re57
Hallo, ich hatte vor Jahren schonmal mit PureBasic ein paar Programme geschrieben, aber jetzt muß ich doch einigermaßen wieder von vorne anfangen. Ich hatte damals auch mal ein kleines Spiel mit Sprites geschrieben, aber der Code dazu ist leider auf meiner kaputten externen Festplatte geblieben.

Nun wollte ich wiedermal LoadSprite() und DisplaySprite() auspropieren. Das Test- .png wird aber nicht geladen, obwohl der Pfad stimmt. Wie kommt das? Hier der Code-Anfang:

Code: Alles auswählen

#Window1 = 1
#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget

InitSprite() 
OpenWindow(#Window1,0,0,1366,700,"",#Flags)
OpenWindowedScreen(WindowID(1),0,0,1366,700)

LoadSprite(0, "C:\Users\Anderer\Desktop\Viertel.png")
DisplaySprite(0,50,450)

….
Ich weiß, daß normalerweise das Arbeiten mit If .. Endif empfohlen wird für OpenWindow(), InitSprite() usw., aber das hatte ich schon früher nicht gemacht zugunsten von besserer Übersicht. Danke für Info.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 13:29
von STARGÅTE
Da du dort ein PNG versuchst zu laden, benötigst du UsePNGImageDecoder()

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 14:01
von Re57
Danke.

Edit: Mein Windows-Problem von vorhin (ich konnte plötzlich selber nicht mehr auf Fotos zugreifen) ist jetzt gelöst und jetzt trage ich hier nochmal meinen Test-Code ein. Der Pfad zur .png-Datei stimmt, aber trotzdem wird dann immer angezeigt: "The specified #sprite is not initialized". Allerdings fällt mir da noch etwas ein: Ich hatte gestern, nachdem ich in PureBasic-Anleitung gelesen hatte, irgendetwas gelesen mit der Einstellung 16, 24 oder 32 und hatte dann 16 eingestellt, Ich weiß nicht mehr, was das war, aber vielleicht klingelt da bei dem einen oder anderen etwas, der hier mitliest. Wahrscheinlich habe ich da einen Fehler gemacht. Hier jetzt nochmal der Code:

Code: Alles auswählen

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget

InitSprite()

OpenWindow(1,0,0,1366,700,"",#Flags)
OpenWindowedScreen(WindowID(1),0,0,1366,700) 
    
   LoadSprite(1, "C:\Users\lenovo\Desktop\Viertel.png")
   UsePNGImageDecoder()
   DisplaySprite(1,50,450)      
         
   Repeat
   Event = WaitWindowEvent()
    
   FlipBuffers()
   Until Event = #PB_Event_CloseWindow  
   End
Wieso kommt da die Fehlanzeige von "not initialized"? Was FlipBuffers() angeht, wußte ich übrigens auch noch nie, wo man das am besten hin schreibt. Danke für Info.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 16:48
von GPI
WaitWindowEvent() würde ich nicht benutzen, sondern WindowEvent() - du musst ja im prinzip 60bilder pro sekunde Zeichnen und das geht nicht mit WaitWindowEvent()

und UsePNGImageDecoder() solltest du am besten ganz am Anfang reinschreiben, nicht nachdem du es benutzten wolltest.
Üblicherweise ist das bei mir so ziemlich eines der ersten Befehle in Quellcode

Hauptschleife wäre bei mir ungefähr so

Code: Alles auswählen

repeat
  Repeat
    Event=WindowEvent()
    ;eventauswertung
  until event=#null

  ;zeichnen
  delay(0)
  flipbuffers()
until event=#pb_event_closewindow

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 17:43
von #NULL
@GPI
Dein closeWindow beendet das Programm aber nur, wenn es zufällig das letzte Event in der Eventschleife war. Besser in 'eventauswertung' bei closeWindow ein Flag setzen und dies dann in der äußeren Schleife testen um zu beenden.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 18:32
von Re57
Danke, das hat mich jetzt tatsächlich ein kleines Stück weitergebracht. Mein kleiner Testcode sieht jetzt so aus:

Code: Alles auswählen

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget

InitSprite()

OpenWindow(1,0,0,1366,700,"",#Flags)
OpenWindowedScreen(WindowID(1),0,0,1366,700)

StartDrawing(ScreenOutput())
Box(0,0,1366,700,RGB(0,150,0))
StopDrawing()

   UsePNGImageDecoder()
   LoadSprite(1, "C:\Users\lenovo\Desktop\Viertel.png")
   DisplaySprite(1,150,150)      
     
 Repeat
   Event = WindowEvent()
   Delay(1)
   FlipBuffers()
 Until Event = #PB_Event_CloseWindow  
 End
Es kommt jetzt zu keiner Fehlermeldung mehr und die grüne Hintergrundfarbe sorgt jetzt dafür, daß das Sprite überhaupt sichtbar wird, wenngleich aber leider nur als schwarze Fläche. Wenn ich statt WindowEvent() + Delay(1) WaitWindowsEvent(1) verwende, funktioniert das auch. Die jetzige Ausgabe des Programms kommt aber genauso auch komplett ohne FlipBuffers() im Code, das läßt doch dann evtl. vermuten, daß FlipBuffers() aus irgendeinem Grund überhaupt nicht greift.

Ich hatte dann auch noch versucht, ein jpg-Sprite zu laden, aber das führte wieder zu der "not initialized" Fehlermeldung, egal, ob ich mit UseJPEG2000IMAGEDecoder arbeitete oder nicht. Danke für weitere Hilfe.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 20:06
von HeX0R
Das wäre wohl der richtige Moment mal ins Handbuch zu schauen,
... oder sich die Beispiele der Kollegen genauer anzuschauen (Tipp: ;zeichnen)

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 20:27
von GPI
aus eigener Erfahrung:

Nie, nie, NIEMALS auf den Screen zeichnen "StartDrawing(ScreenOutput())" - das verursacht nur Probleme und ist saulangsam.
Es gibt ein ClearScreen-Command (oder so ähnlich), damit kannst du den Bildschirm schnell löschen.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 21:26
von #NULL
Die Eventbearbeitung braucht eine eigene Schleife. Du musst pro Hauptschleifendurchgang alle Events in einer eigenen/nested Schleife abarbeiten (siehe code von GPI) und erst dann Flipbuffers aufrufen.

Re: Sprite laden funktioniert nicht

Verfasst: 10.04.2020 21:40
von Re57
Du musst pro Hauptschleifendurchgang alle Events in einer eigenen/nested Schleife abarbeiten (siehe code von GPI
Das hatte aber auch nicht funktioniert mit dem Code von GPI und nebenbei reagierte dann auch nicht mehr Event_CloseWindow.
nie, nie, Niemals auf den Screen zeichnen
Das kannte ich bisher nur mit direkt aufs Fenster zeichnen (weil dann alles weg ist, wenn man das Fenter an der oberen Leiste verschiebt). Ich lese jetzt erst nochmal im Handbuch. Danke.