Probleme mit Sprites

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Probleme mit Sprites

Beitrag von gnasen »

Ich habe mal wieder einen schönen Fehler, der mich zum wahnsinn bringt.
Das Programm soll 36 Sprites zeichnen, wobei sich der Inhalt der Sprites andauernd ändern kann, die Koordinaten etc werden in nem array gespeichert, sowie die Spritenummern. (Am besten mal den Code anschauen). In einem Ordner \pics befindet sich die Datei 0.jpg.

Code: Alles auswählen

;/sprite_array(x,0) = Spritenummer
;/sprite_array(x,1) = X-coor.
;/sprite_array(x,2) = Y-coor.
;/sprite_array(x,3) = bild Nr.
;/sprite_array(x,4) = Sprite3DNummer


InitSprite()
InitSprite3D()

Enumeration
  #image0
  #Window_Main
EndEnumeration

Global Dim sprite_array.l(37,5)

;{ Fenster erstellen
;-Fenster erstellen

Image0 = CatchImage(#image0, ?Image0)
DataSection
Image0:
IncludeBinary "background.jpg"
EndDataSection
OpenWindow(#Window_Main, 0, 0, 800, 600, "...", #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered| #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Window_Main), 0, 0, 590, 570, 0, 0, 0)

ClearScreen(RGB(255, 255, 255))

For i = 1 To 36
  sprite_array(i,0) = i
  sprite_array(i,3) = 0
  sprite_array(i,4) = 0
  sprite_array(i,5) = 0
Next

Global Dim arrays(filereadin_counter, 1)
For i = 0 To filereadin_counter
  arrays(i, 0) = i
  arrays(i, 1) = i
  LoadSprite(arrays(i, 0), "pics\" + Str(i) + ".jpg", #PB_Sprite_Texture) 
  CreateSprite3D(arrays(i, 1), arrays(i,0))
Next
LoadSprite(filereadin_counter+1, "background.jpg")

sprite_array(1,1)=100
sprite_array(1,2)=100
sprite_array(2,1)=200
sprite_array(2,2)=200
;- ..... ausgelassen
sprite_array(36,1) = 0
sprite_array(36,2) = 0

;}

Procedure redraw()
    ClearScreen(RGB(0,0,0))
    DisplaySprite(filereadin_counter+1,0,0)
    Start3D()
    For i = 1 To 36
      If i => 13 And i <= 18
        DisplaySprite3D(arrays(sprite_array(i,3),1), sprite_array(i,1),sprite_array(i,2))
      Else
        DisplaySprite(arrays(sprite_array(i,3),0), sprite_array(i,1), sprite_array(i,2)) 
      EndIf
      Debug sprite_array(i,3)
    Next  
    Stop3D()
    
    FlipBuffers()

EndProcedure

Repeat
  EventID = WaitWindowEvent()
  redraw()
Until EventID=#PB_Event_CloseWindow
filereadin_counter ist übrigens die Anzahl verschiedener Sprites, hier aber nicht relevant!

Es geht darum, dass das Prog nicht mehr auf Befehle reagiert, solange es in der Schleife ist (dabei ist das hier schon stark entschlackt!).
Wenn ich es in einen Thread oder eine endlosschleife packe, wird die CPU auslastung enorm, bzw das Bild zieht schlieren.

Mache ich was grundelegendes falsch? ich kann mir nicht vorstellen, dass 36 sprites zuviele sind....

Schonmal danke im Vorraus ;)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau dir mal in der Help zu OpenWindowedScreen() das Beispiel an,
dort wird gezeigt, wie ein Eventloop für nen Windowedscreen aussehen sollte...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Probleme mit Sprites

Beitrag von PureLust »

gnasen hat geschrieben:Es geht darum, dass das Prog nicht mehr auf Befehle reagiert, solange es in der Schleife ist (dabei ist das hier schon stark entschlackt!).
Was soll das heissen "nicht mehr auf Befehle reagiert"?
MausBefehle, Keyboard- oder Joystick-Befehle?
In Deinem EventLoop sind keinerlei Abfragen dafür. :roll:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Was soll das heissen "nicht mehr auf Befehle reagiert"?
MausBefehle, Keyboard- oder Joystick-Befehle?
In Deinem EventLoop sind keinerlei Abfragen dafür.
zB das verschieben vom Fenster. Eigentlich waren da abfragen, habs aber fürs Forum gekürzt ;)

Ich hab mir das in der Hilfedatei mal angeschaut, zieht nicht mehr nach etc, alles okay, nur die CPU Last ist auf ~75% gestiegen
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> nur die CPU Last ist auf ~75% gestiegen

deine eventschleife brät ja auch voll durch... verwende lieber ein WaitWindowEvent(10) oder so....

außerdem, jedesmal wenn das programm bei FlipBuffers ankommt,
und der nächste VSync noch nicht erreicht ist, wartet FlipBuffers unter Vollast.

sowas kann man aber erst am schluß abstellen, wenn man alles drin hat,
vorher ergeben feinabstimmungen des timings keinen sinn -
du weißt ja noch garnicht, wieviel zeit deine algorithmen brauchen werden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

ok danke für den Tipp, dann lasse ich das ganze erstmal so, tuning dann halt zum schluss, kann man wohl nix machen
Antworten