Seite 1 von 1

Spieler - Bewegung

Verfasst: 05.03.2009 00:23
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

Verfasst: 05.03.2009 00:31
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 ...

Verfasst: 05.03.2009 01:06
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.

Verfasst: 05.03.2009 01:13
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) 

Verfasst: 05.03.2009 02:54
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

Verfasst: 05.03.2009 03:08
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.