Frage zu einer 2D Übung - Sprite bewegen

Anfängerfragen zum Programmieren mit PureBasic.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von - chris - »

Komplett dann so:

Code: Alles auswählen


UseJPEGImageDecoder()

;Konstante und Eigenschaften zu Screen

Enumeration
  #SPRITE2D_oben
  #SPRITE2D_unten
  #SPRITE2D_recht
  #SPRITE2D_link
  #Boden
EndEnumeration

Global Screenbreite.i    = 1024
Global Screenhoehe.i     = 768
Global Screenfarbtiefe.i = 32
Global Beenden.i         = #False

;EInfache Prozedur zur Fehlerprüfung
Procedure Fehlerbehandlung(Ergebnis.i, Text.s)
  If Ergebnis = 0
    MessageRequester("Fehler", Text, #PB_MessageRequester_Ok)
    End
  EndIf
EndProcedure

;Initialisiere Umgebung
Fehlerbehandlung(InitSprite(), "Initsprite() fehlgeschlagen.")
Fehlerbehandlung(InitKeyboard(), "InitKeyboard() fehlgeschlagen.")
Fehlerbehandlung(OpenScreen(Screenbreite, Screenhoehe, Screenfarbtiefe, "2D Spiel", 1), "Kann Screen nicht öffnen.")
SetFrameRate(60)

;Lade Sprite
; LoadSprite(#Boden, "Boden.jpg")
; LoadSprite(#SPRITE2D_link, "figurlink.jpg")
; LoadSprite(#SPRITE2D_recht, "figurrecht.jpg")
; LoadSprite(#SPRITE2D_oben, "figuroben.jpg")
; LoadSprite(#SPRITE2D_unten, "figurunten.jpg")

CreateSprite(#Boden, Screenbreite, Screenhoehe)
If StartDrawing(SpriteOutput(#Boden))
  Box(0, 0, 1024, 768, RGB(120, 120, 0))
  Circle(20, 20, 20, RGB(0, 255, 0))
  StopDrawing()
EndIf

CreateSprite(#SPRITE2D_recht, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_recht))
  LineXY(0, 0, 0, 20, RGB(255, 0, 0))
  LineXY(0, 20, 20, 10, RGB(255, 0, 0))
  LineXY(0, 0, 20, 10, RGB(255, 0, 0))
  FillArea(10, 10, RGB(255, 0, 0), RGB(255, 0, 0))
  StopDrawing()
EndIf

CreateSprite(#SPRITE2D_link, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_link))
  LineXY(20, 0, 20, 20, RGB(255, 0, 0))
  LineXY(20, 0, 0, 10, RGB(255, 0, 0))
  LineXY(20, 20, 0, 10, RGB(255, 0, 0))
  FillArea(10, 10, RGB(255, 0, 0), RGB(255, 0, 0))
  StopDrawing()
EndIf

CreateSprite(#SPRITE2D_unten, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_unten))
  LineXY(0, 0, 20, 0, RGB(255, 0, 0))
  LineXY(0, 0, 10, 20, RGB(255, 0, 0))
  LineXY(20, 0, 10, 20, RGB(255, 0, 0))
  FillArea(10, 10, RGB(255, 0, 0), RGB(255, 0, 0))
  StopDrawing()
EndIf

CreateSprite(#SPRITE2D_oben, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_oben))
  LineXY(0, 20, 20, 20, RGB(255, 0, 0))
  LineXY(0, 20, 10, 0, RGB(255, 0, 0))
  LineXY(20, 20, 10, 0, RGB(255, 0, 0))
  FillArea(10, 10, RGB(255, 0, 0), RGB(255, 0, 0))
  StopDrawing()
EndIf

;Hauptschleife
Repeat

  ;Screen wird gelöscht
  ClearScreen(RGB(0, 0, 0))

  ;Boden als Hintergrundbild anzeigen
  DisplaySprite(#Boden, 0, 0)

  ;R = 1

  ;Figur wird auf dem Bodenbild angezeigt und bewegt sich
  If R = 0
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  ElseIf R = 1
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  ElseIf R = 2
    DisplayTransparentSprite(#SPRITE2D_unten, x, y)
  ElseIf R = 3
    DisplayTransparentSprite(#SPRITE2D_oben, x, y)
  EndIf
  
  
  ;Grafik wird geflipped (getauscht) und angezeigt
  FlipBuffers()

  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  EndIf

  If KeyboardPushed(#PB_Key_D)
    If x < 980
      x = x + 1
      R = 0
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_A)
    If x > 0
      x = x - 1
      R = 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_S)
    If y < 700
      y = y + 1
      R = 2
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_W)
    If y > 0
      y = y - 1
      R = 3
    EndIf
  EndIf

Until Beenden = #True

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

Ja genau so habe ich es auch in meinem Code, komisch dass es nicht geht, ich gucke nachher nochmal, ob es den Bildern selbst liegt, verschiedene Größen , evetuell andere Formate usw. Aber die Variable R habe ich wie bei dir richtig im Code und trotzdem wird die Figur nach rechts gezeigt und ändert sich dabei auch nicht. Für Leute die eventuell doch in meinem Code Beispiel einen Fehler finden, poste ich diesen hier nochmal komplett.

Code: Alles auswählen

UseJPEGImageDecoder()

;Konstante und Eigenschaften zu Screen

Enumeration
  #SPRITE2D_oben
  #SPRITE2D_unten
  #SPRITE2D_recht
  #SPRITE2D_link
  #Boden
EndEnumeration

Global Screenbreite.i = 1024
Global Screenhoehe.i = 768
Global Screenfarbtiefe.i = 32
Global Beenden.i = #False


;EInfache Prozedur zur Fehlerprüfung
Procedure Fehlerbehandlung(Ergebnis.i, Text.s)
  If Ergebnis = 0
    MessageRequester("Fehler",Text,#PB_MessageRequester_Ok)
    End
  EndIf
EndProcedure

;Initialisiere Umgebung
Fehlerbehandlung(InitSprite(),"Initsprite() fehlgeschlagen.")
Fehlerbehandlung(InitKeyboard(),"InitKeyboard() fehlgeschlagen.")
Fehlerbehandlung(OpenScreen(Screenbreite,Screenhoehe,Screenfarbtiefe,"2D Spiel",1),"Kann Screen nicht öffnen.")
SetFrameRate(60)

;Lade Sprite
LoadSprite(#Boden, "Boden.jpg")
LoadSprite(#SPRITE2D_link, "figurlink.jpg")
LoadSprite(#SPRITE2D_recht, "figurrecht.jpg")
LoadSprite(#SPRITE2D_oben, "figuroben.jpg")
LoadSprite(#SPRITE2D_unten, "figurunten.jpg")




;Hauptschleife
Repeat
  
  ;Screen wird gelöscht
  ClearScreen(RGB(0,0,0))
  
  ;Boden als Hintergrundbild anzeigen
    DisplaySprite(#Boden, 0, 0)
    
    
   
R = 1
    
    
    ;Figur wird auf dem Bodenbild angezeigt und bewegt sich
    
    
    
If R = 1
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  EndIf 

    
    
      
    ;Grafik wird geflipped (getauscht) und angezeigt
  FlipBuffers()

  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  EndIf

  If KeyboardPushed(#PB_Key_D)
    If x < 980
      x = x + 1
      R = 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_A)
    If x > 0
      x = x - 1
      R = 0
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_S)
    If y < 700
      y = y + 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_W)
    If y > 0
      y = y - 1
    EndIf
  EndIf
 

Until Beenden = #True

End


Für die Hilfe muss ich mich nochmal bedanken.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von - chris - »

Du hast in deiner Hauptschleife R = 1 stehen,
also läuft deine Figur immer nach rechts.

Das mit CreateSprite habe ich nur gemacht,
weil ich keine Bilder zur Verfügung habe,
deshalb habe ich die so erstellt.

Code: Alles auswählen


;Hauptschleife
Repeat
  
  ;Screen wird gelöscht
  ClearScreen(RGB(0,0,0))
  
  ;Boden als Hintergrundbild anzeigen
    DisplaySprite(#Boden, 0, 0)
    
    
   
R = 1
    
    
    ;Figur wird auf dem Bodenbild angezeigt und bewegt sich
    
    
    
If R = 1
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  EndIf 


PB v5.72 x86/x64
Windows 10 Pro 64bit
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

In der Hauptschleife habe ich jetzt R = 1 zu R = 0 gemacht, anschließend habe ich diesen Abschnitt bearbeitet.

Code: Alles auswählen

If R = 1
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  EndIf 
zu

Code: Alles auswählen

If R = 0
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  EndIf 
D.h. jetzt müsste es so laufen, dass wenn R = 0 ist, dann Bild nach rechts zeigen, ansonsten Bild nach links zeigen.

Danach muss man ja normalerweise diese Variable R für die Tasten noch legen, dieses habe ich mit diesem hier getan:

Code: Alles auswählen

If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  EndIf

  If KeyboardPushed(#PB_Key_D)
    If x < 980
      x = x + 1
      R = 0
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_A)
    If x > 0
      x = x - 1
      R = 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_S)
    If y < 700
      y = y + 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_W)
    If y > 0
      y = y - 1
    EndIf
  EndIf
Die Bilder habe ich danach nochmal überprüft, alle Größen und Formate sind jetzt gleich und es funktioniert immer noch nicht`? Laut Code muss es doch gehen, dass muss wohl anderer Fehler sein.
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von Sirius-2337 »

Wenn ich das jetzt richtig verstanden habe setzt du immernoch R auf einen Wert (jetzt 0) und überprüfst danach welchen wert R hat. Da kann doch immer nur die eine Bedingung erfüllt sein.

Du musst den Wert von R nur ändern, wenn eine Taste gedrückt wird und nicht jedes mal bevor du überprüfst welchen Wert R hat.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von Kiffi »

@01-andreas: R darf natürlich nur in den 'If KeyboardPushed'-Abfragen
gesetzt werden. Nimm mal das einzelne R = 1 (oder R = 0) aus Deinem Code.
Dann funktioniert es auch.

Grüße ... Kiffi
a²+b²=mc²
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

Cool, vielen Dank für die nette Unterstützung.

Der Fehler lag wohl an diesem Code in der Hauptschleife:

R = 0 bzw. R = 1, den musste ich entfernen.

Nur das musste ich im Code haben, damit es auch funktioniert.

Code: Alles auswählen

;Hauptschleife
Repeat
  
  ;Screen wird gelöscht
  ClearScreen(RGB(0,0,0))
  
  ;Boden als Hintergrundbild anzeigen
    DisplaySprite(#Boden, 0, 0)
    
    
   

    
    
    ;Figur wird auf dem Bodenbild angezeigt und bewegt sich
    
    
    
If R = 0
    DisplayTransparentSprite(#SPRITE2D_recht, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_link, x, y)
  EndIf 

    
    
      
    ;Grafik wird geflipped (getauscht) und angezeigt
  FlipBuffers()

  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  EndIf

  If KeyboardPushed(#PB_Key_D)
    If x < 980
      x = x + 1
      R = 0
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_A)
    If x > 0
      x = x - 1
      R = 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_S)
    If y < 700
      y = y + 1
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_W)
    If y > 0
      y = y - 1
    EndIf
  EndIf
 

Until Beenden = #True

End
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

Moin,

ich möchte jetzt gerne diese Figur "rennen sehen", wenn ich D gedrückt halte. Ich habe es bisher so eingegeben:

Code: Alles auswählen

If KeyboardPushed(#PB_Key_D)
    If x < 940
      x = x + 1
      R = 16
      
      R = 17
      
      R = 18
      
      R = 19
      
      R = 20
      
      R = 21
      
      R = 22
      
      R = 23
    EndIf
Bilder sind alle geladen worden mit LoadSprite und die braune Farbe um die Figur habe ich entfernt, wie muss dieser Abschnitt aufgebaut sein, damit die Figur rennt und nicht nur das letzte Bild vom Rennen anzeigt wird. Und ich würde dort auch gleich einbauen, dass wenn ich D nicht mehr gedrückt halte, die Figur wieder normal steht.

R = 0 ist die Variable damit die Figur nach rechts guckt und stehen bleibt. Wenn ich R = 0 aber im Abschnitt an letzter Stelle stehen habe, rennt die Figur gar nicht erst, so sonst wie der Abschnitt hier aufgebaut ist, hat die Figur das eine Bein immer in der Luft (es wird nur das letzte Bild vom Rennen angezeigt, nicht alle Bilder von RennenBild 1 bis Rennen-BildEnde durch)

Das gleiche habe ich beim Schlagen, wenn die Figur mit dem Schwert zuschlagen will, ist es für mich viel zu schnell und auch hier wird wenn ich Leertaste drücke für Schlagen, wird die Figur in der Position vom letzten "Schlag-Bild" bleiben, normal müsste sie nach dem Schlagen auch wieder normal stehen. Das normale stehen und nach rechts gucken ist wie ich schon hier erwähnt habe lautet: R = 0, sonst R = 16 - R = 23 für die Rennen-Bilder
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von STARGÅTE »

Da ich deine Frage nciht verstanden habe, heir nur eine allgemeine Information:

Code: Alles auswählen

If x < 940
      x = x + 1
      R = 16
      
      R = 17
      
      R = 18
      
      R = 19
      
      R = 20
      
      R = 21
      
      R = 22
      
      R = 23
    EndIf 
Dieser Code entspricht:

Code: Alles auswählen

If x < 940
      x = x + 1
      R = 23
    EndIf 
Der Grund ist, das du ja nur durch R = 16, R = 17, ...
nichts an dem eigentlichen Bild, Screen, usw. änderst.
Du machst nix weiter als der Variable R immer wieder ein Wert zuzuweisen, und das in einer Zeit in der du es nicht mal sehen würdest wenn was passieren würde!

Also, wenn du ein Variable änderst die für ein Bild steht, dann musst du dieses Bild auch weiterhin anzeigen und außerdem "Zeit geben" das Bild auch zu sehen!
Natürlich nicht mit einem Delay(), weil das ja wieder alles aufhalten würde.

Am besten du suchst mal nach Animation hier im Forum, dann findest du mit sicherheit einige Beispiele, von dem was du suchst: "Figur rennen sehen"
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
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

Moin, eigentlich brauche ich sowas wie Delay(), nur nicht dass das Programm für eine bestimmte Zeit angehalten wird, sondern die Bewegung, hatte es ja auch vorher schon versucht mit Delay, aber da bleibt das Programm komplett für eine Sekunde stehen.

Ich schaue mal weiter, ob ich dafür etwas finde.
Antworten