Sprite laden funktioniert nicht

Anfängerfragen zum Programmieren mit PureBasic.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Sprite laden funktioniert nicht

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sprite laden funktioniert nicht

Beitrag von STARGÅTE »

Da du dort ein PNG versuchst zu laden, benötigst du UsePNGImageDecoder()
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
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Sprite laden funktioniert nicht

Beitrag 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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Sprite laden funktioniert nicht

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Sprite laden funktioniert nicht

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Sprite laden funktioniert nicht

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Sprite laden funktioniert nicht

Beitrag von HeX0R »

Das wäre wohl der richtige Moment mal ins Handbuch zu schauen,
... oder sich die Beispiele der Kollegen genauer anzuschauen (Tipp: ;zeichnen)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Sprite laden funktioniert nicht

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Sprite laden funktioniert nicht

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Sprite laden funktioniert nicht

Beitrag 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.
Zuletzt geändert von Re57 am 10.04.2020 23:19, insgesamt 1-mal geändert.
Antworten