Spieler - Bewegung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Spieler - Bewegung

Beitrag von Tur0k »

Hallo Community!

Gibts es in Purebasic eine Möglichkeit ein Sprite zu entfernen?

Ich versuche gerade ein Sprite mit den Pfeiltasten zu bewegen,
doch es *naja* verschmiert alles.

Code: Alles auswählen

UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf


If OpenWindow(0, 0, 0, 700, 500, "PureTurok", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(0), 0, 0, 700, 500, 0, 0, 0)
    ; Map Sprite (Test)
    LoadSprite(0, "map01_test.bmp")
    CopySprite(0, 1)
    DisplaySprite(0, 0, 0)
    LoadSprite(0, "person.png", #PB_Sprite_Texture)

  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

EndIf

    PlayerX = 0
    PlayerY = 0
   
Repeat

  Repeat
  
    ExamineKeyboard()

    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1 
    EndSelect
    
  Until Event = 0
  
    If KeyboardPushed(#PB_Key_Up)
    PlayerY = PlayerY - 1
    EndIf  
    If KeyboardPushed(#PB_Key_Down)
    PlayerY = PlayerY + 1
    EndIf  
    If KeyboardPushed(#PB_Key_Left)
    PlayerX = PlayerX - 1
    EndIf  
    If KeyboardPushed(#PB_Key_Right)
    PlayerX = PlayerX + 1
    EndIf  
    
    ; Person
    CreateSprite3D(0, 0)
    If Start3D()
    DisplaySprite3D(0, PlayerX, PlayerY)
    Stop3D()
    EndIf
    
  FlipBuffers()

Until  Quit Or KeyboardPushed(#PB_Key_Escape)
Bilder:
http://turok.bplaced.net/filemanager/pureimage/

Falls ihr irgendwelche anderen Fehler bemerkt, wäre ich froh wenn ihr sie posten würdet.
Tipps usw. wären SUPER! :)

Mfg. Tur0k
buuh* :D
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Bitte nutze doch ClearScreen(0) (wie in allen Beispielen zu sehen ist)
um den Bildschirminhalt zu löschen, dann verschwimmt auch nix ...
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ergänzung:

setze ClearScreen an den Anfang des Loops, sozusagen "gegenüber" von FlipBuffers.
alles was zwischen Clear und Flip steht, wird in einem Frame auf den Screen gezeichnet.

und bei ClearScreen wird eine Farbe übergeben.
du kannst z.B. $802010 verwenden, um RGB( 16, 32, 128) zu übergeben.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Ergänzung 2:

Das ExamineKeyboard() sollte nicht in der Inneren Schleife für das Window stehen da es ja garnix damit zu tuen hat, und möglicherweise dadurch ereignisse verloren gehen
CreateSprite3D() brauch auch nicht jedes mal aufgerufen werden.

Außerdem sollte die Karte nicht nur am anfang angezeigt werden sondern auch in der schleife. und vorallem eine andere NUmmer bekommen

Zsammenfassend wäre das der neue Code:

Code: Alles auswählen

UseJPEGImageDecoder() 
UseTGAImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
  MessageRequester("Error", "Can't open the sprite system", 0) 
  End 
EndIf 

If InitSprite3D() = 0 
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0) 
  End 
EndIf 


If OpenWindow(0, 0, 0, 700, 500, "PureTurok", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 

  If OpenWindowedScreen(WindowID(0), 0, 0, 700, 500, 0, 0, 0) 
    ; Map Sprite (Test) 
    LoadSprite(1, "map01_test.bmp") 
    LoadSprite(0, "person.png", #PB_Sprite_Texture) 
    CreateSprite3D(0, 0) 

  Else 
    MessageRequester("Error", "Can't open windowed screen!", 0) 
    End 
  EndIf 

EndIf 

    PlayerX = 0 
    PlayerY = 0 
    
Repeat 

  Repeat 
  
    Event = WindowEvent() 
    
    Select Event 
      Case #PB_Event_CloseWindow 
        Quit = 1 
    EndSelect 
    
  Until Event = 0 
  
  ExamineKeyboard() 

    If KeyboardPushed(#PB_Key_Up) 
    PlayerY = PlayerY - 1 
    EndIf  
    If KeyboardPushed(#PB_Key_Down) 
    PlayerY = PlayerY + 1 
    EndIf  
    If KeyboardPushed(#PB_Key_Left) 
    PlayerX = PlayerX - 1 
    EndIf  
    If KeyboardPushed(#PB_Key_Right) 
    PlayerX = PlayerX + 1 
    EndIf  
   
  ClearScreen(RGB(0,0,0)) 
    
    DisplaySprite3D(1, 0, 0)  
    ; Person 
    If Start3D() 
    DisplaySprite3D(0, PlayerX, PlayerY) 
    Stop3D() 
    EndIf 
    
  FlipBuffers() 

Until  Quit Or KeyboardPushed(#PB_Key_Escape) 
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
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Danke für eure Antworten!

STARGÅTE, ich hab den Code getestet, aber bekam folgenden Fehler:

Code: Alles auswählen

The specified #Sprite3D is not initialized.
Hab versucht, selber zu fixen.

Code: Alles auswählen

UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf


If OpenWindow(0, 0, 0, 700, 500, "PureTurok", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  If OpenWindowedScreen(WindowID(0), 0, 0, 700, 500, 0, 0, 0)
    ; Map Sprite (Test)
    LoadSprite(1, "map01_test.bmp", #PB_Sprite_Texture)
    LoadSprite(0, "person.png", #PB_Sprite_Texture)
    CreateSprite3D(0, 0)
    CreateSprite3D(1, 1)

  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

EndIf

    PlayerX = 0
    PlayerY = 0
   
Repeat

  Repeat
 
    Event = WindowEvent()
   
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1
    EndSelect
   
  Until Event = 0
 
  ExamineKeyboard()

    If KeyboardPushed(#PB_Key_Up)
    PlayerY = PlayerY - 1
    EndIf 
    If KeyboardPushed(#PB_Key_Down)
    PlayerY = PlayerY + 1
    EndIf 
    If KeyboardPushed(#PB_Key_Left)
    PlayerX = PlayerX - 1
    EndIf 
    If KeyboardPushed(#PB_Key_Right)
    PlayerX = PlayerX + 1
    EndIf 
   
  ClearScreen(RGB(0,0,0))
   
    ; Person
    If Start3D()
    DisplaySprite3D(1, 0, 0) 
    DisplaySprite3D(0, PlayerX, PlayerY)
    Stop3D()
    EndIf
   
  FlipBuffers()

Until  Quit Or KeyboardPushed(#PB_Key_Escape) 
Und irgendwie bekomm ich 50 CPU Auslastung. :freak:

Mfg. Tur0k
buuh* :D
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

meiner ansicht nach musst du den Hintergrund nicht unbedingt als Sprite3D darstellen...
aber schaden tuts auch nich, könnte sogar schneller sein.


> irgendwie bekomm ich 50 CPU Auslastung.

ja ist klar.
du hast keinerlei timing drin, das die CPU entlasten könnte,
das heißt innerhalb des FlipBuffers ist eine ungebremste Warteschleife,
die die CPU auf Vollast fährt.

dass du 50% angezeigt bekommst, liegt daran, dass dies nur ein thread ist der nur auf einem Kern läuft, und du zwei Kerne hast.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten