Frage zu einer 2D Übung - Sprite bewegen

Anfängerfragen zum Programmieren mit PureBasic.
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

Frage zu einer 2D Übung - Sprite bewegen

Beitrag von 01-andreas »

Hallo alle,

ich beschäftige mich heute mit 2D Übungen, ich bin jetzt gerade dabei eine kleine Übung zu machen, bei der man einen Screen erstellt und eine Figur (Sprite) mit dem Hintergrundbild lädt. Als nächstes hätte ich gerne vor, die Figur zu bewegen, wie genau mache ich es, könnt ihr mir hier bei dem Beispiel helfen?

Code: Alles auswählen

UseJPEGImageDecoder()

;Konstante und Eigenschaften zu Screen

Enumeration
  #SPRITE2D
  #Boden
EndEnumeration

Global Screenbreite.i = 1024
Global Screenhoehe.i = 768
Global Screenfarbtiefe.i = 32
Global Beenden.i = #False
Global XUrsprung.i = Screenbreite / 2
Global YUsprung.i = Screenhoehe / 2

;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,"Figur1.jpg")

;Hauptschleife
Repeat
  
  ClearScreen(RGB(0,0,0))
  
 
    DisplayTransparentSprite(#SPRITE2D, 0, 0)
    
    
  
  FlipBuffers()
  
  
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  EndIf
  
Until Beenden = #True
End
Es ist ja so, dass ich diese Figur bewegen muss, in dem ich die Figur an mehreren Positionen anzeige, so dass das Auge denkt, wir bewegen dieses Bild.

Ich hab bisher es noch nicht herausgefunden, wie genau ich die Figur bewege.
Und kann ich mein Hintergrundbild "Boden.jpg" auch in einer Größe vom Screen laden oder muss es immer in 32x32 sein, sodass ich dieses Bild am Ende vermehren muss. Ich vermute mal, dass diese Bewegung mit For und Next abläuft, in dem man immer die Position abzieht und das Bild erneut anzeigt.

Ich würde mich sehr freuen, wenn ihr mir bei meiner Übung helfen könnt oder mir auch Tipps geben könnt mit welchen Codes man hier arbeiten muss.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

Der Bildschirm wird mit ClearScreen(RGB(0,0,0)) komplett gelöscht
und muß komplett neu gezeichnet werden, so z.B.:

Code: Alles auswählen


UseJPEGImageDecoder()

;Konstante und Eigenschaften zu Screen

Enumeration
  #SPRITE2D
  #Boden
EndEnumeration

Global Screenbreite.i = 1024
Global Screenhoehe.i = 768
Global Screenfarbtiefe.i = 32
Global Beenden.i = #False
Global XUrsprung.i = Screenbreite / 2
Global YUsprung.i = Screenhoehe / 2

;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,"Figur1.jpg")

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

CreateSprite(#SPRITE2D, 20, 20)
If StartDrawing(SpriteOutput(#SPRITE2D))
  Box(0,0,20,20,RGB(255,0,0))
  StopDrawing()
EndIf  

;Hauptschleife
Repeat
 
  ClearScreen(RGB(0,0,0))
  
    DisplaySprite(#Boden, 0, 0)
  
    DisplayTransparentSprite(#SPRITE2D, x, 0)
   
    x = x + 1
    
    If x = > 100
      x = 0
    EndIf  
 
  FlipBuffers()
 
 
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Beenden = #True
  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 »

Vielen Dank für die Hilfe, jetzt bin ich weiter gekommen und habe jetzt die Bewegung auf die Tasten gelegt (a,s,d und w)
Ich habe die Figur mit a,s,d und w bewegt um x + 2, x - 2, y+ 2, y - 2.

Aber mit dem Code KeyboardReleased(#PB_Key_"irgendeineTaste") bewegt sich die Figur, aber ich muss die Taste immer wieder drücken, gibt es auch eine Funktion für das Halten und loslassen, d.h. ich halte nur den Buchstaben W und die Figur geht geradeaus nach Norden und wenn ich die Taste loslasse, bleibt die Figur an der aktuellen Position stehen.


D.h. ist ein Beispiel von meiner Übung , wo die Figur bei jedem Drücken von W auf der Y Achse 2 nach oben (y - 2) geht.

Code: Alles auswählen

If KeyboardReleased(#PB_Key_W)
    
    y = y - 2
    
    EndIf
Könnt ihr mir kurz das Stichwort sagen für diese Funktion mit dem Halten und loslassen, ich habe unter Keyboard in F1 geschaut, aber keine passende Befehle gefunden für mein Beispiel.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

Anstatt KeyboardReleased den Befehl KeyboardPushed.
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 »

Ok klappt alles, jetzt möchte ich hier noch eine allgemeine Frage stellen:

Beim 2D Spiel bleibt der Hintergrund ja nicht stehen, d.h. wenn man die Figur bewegt, bewegt sich auch das Hintergrundbild, es sei denn es soll wirklich nur ein bestimmtes Bild (z.b. 1024 x 768) sein und darauf alles laufen wie Tetris usw.

Beim 2D Spiel muss ich dann normalerweise die X und Y Achsen vom Boden (Sprite) und von der Figur (Sprite) gleichzeitig abziehen. So bewegen sich beide Bilder wenn ich eine Taste gedrückt halte wie z.B. W (geradeaus nach Norden laufen).

Das klappt soweit auch alles, nur ich frage mich hier:

1. Frage: Ist das Hintergrundbild in einem größeren 2D Spiel in einer sehr großen Größe wie zum Beispiel 8000 x 8000 oder wie ist es machbar, dass man in einem Spiel durch mehrere Städte geht.

2. Frage: Gibt es ein Tutorial, bei dem kurz erklärt wird, wie beim Drücken einer Taste sich ein Sprite verändert, z. B.
ich halte W gedrückt und laufe mit einer Figur nach Norden, jetzt drücke ich aber S damit ich in den Süden laufen kann, dabei bleibt die Figur aber gleich (Sprite ist das gleiche). Gibt hierfür denn ein Tutorial oder findet man solche Befehle in der F1 Hilfe.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

zur 2.Frage: mit verschiedenen Sprite's (für jede Richtung z.b.: für rechts - links)

Code: Alles auswählen


UseJPEGImageDecoder()

;Konstante und Eigenschaften zu Screen

Enumeration
  #SPRITE2D_R
  #SPRITE2D_L
  #SPRITE2D_Box
  #Boden
EndEnumeration

Global Screenbreite.i    = 1024
Global Screenhoehe.i     = 768
Global Screenfarbtiefe.i = 32
Global Beenden.i         = #False
Global XUrsprung.i       = Screenbreite / 2
Global YUsprung.i        = Screenhoehe / 2

;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,"Figur1.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_Box, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_Box))
  Box(0, 0, 21, 21, RGB(255, 0, 0))
  StopDrawing()
EndIf

CreateSprite(#SPRITE2D_R, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_R))
  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_L, 21, 21)
If StartDrawing(SpriteOutput(#SPRITE2D_L))
  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

x = 20
y = 10
R = 1

;Hauptschleife
Repeat

  ClearScreen(RGB(0, 0, 0))

  DisplaySprite(#Boden, 0, 0)
  
  DisplayTransparentSprite(#SPRITE2D_Box, 200, 200)
  
  If R = 1
    DisplayTransparentSprite(#SPRITE2D_R, x, y)
  Else
    DisplayTransparentSprite(#SPRITE2D_L, x, y)
  EndIf  

  FlipBuffers()

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

  If KeyboardPushed(#PB_Key_S)
    If x < 1024
      x = x + 1
      R = 1
    EndIf
  EndIf

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

  If KeyboardPushed(#PB_Key_Z)
    If y < 768
      y = y + 1
    EndIf
  EndIf

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

Until Beenden = #True

End

Zuletzt geändert von - chris - am 27.12.2010 14:07, insgesamt 3-mal geändert.
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 »

Ich kann etwas nicht nachvollziehen, bei deiner Übung erstellst du eigene Sprites durch 2D Drawing und legst sie auf den Srpite Boden. Ich habe versucht 4 Sprites (jede Figurbewegung) geladen, dann so eingestellt, dass die Figur nur bis zum Rand vom Screen laufen kann. Drücke ich F5, sehe ich meine Figur die nach rechts guckt, wie mache ich es so, dass die Figur beim Drücken A nach links guckt

A drücken + Bewegung nach links mit Y Achse + Sprite anzeigen, wie kriege ich sowas genau hin, kannst du oder jemand anders mein Beispiel nehmen und bei der Berechnung von X und Y Achsen mit Kommentaren anzeigen, wie ich es machen müsste.

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
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_A)
    If x > 0
      x = x - 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
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

Du setzt die Variable R = 1 in der Repeat-Schleife, also auf dauer 1.

Ich habe die Variable R auf 1 gesetzt, wenn ich nach rechts laufe
und setze die Variable R auf 0 wenn ich nach links laufe.
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 »

Also meinst du es so?

Code: Alles auswählen

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 
Und danach nochmal

Code: Alles auswählen

;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
Die Figur (nach rechts gucken) bleibt hier trotzdem immer, egal ob ich nach links oder rechts gehe. Hat das was damit zu tun, dass bei deiner Übung die Sprites selbst erstellt wurden oder ist es egal? Anders kann ich es sonst nicht nachvollziehen.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

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

Beitrag von - chris - »

Hier schreibst du R = 1 und danach If R = 1.

Code: Alles auswählen


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
Antworten