Seite 1 von 2

2D Sprung

Verfasst: 12.07.2007 19:27
von S3b
wo soll ich anfangen..

Is mein erster 2d Spiel Versuch

die figur liegt auf posx und posy

Frage: wie bring ich das fertig, dass die Figur einen 'Sprung' macht?
Hab schon a wenq probiert aber bin nicht wirklich zu nem ergebnis gekommen

hier der code:

Code: Alles auswählen

InitKeyboard()

Path$="C:\sonswas\"
 InitSprite()
  If OpenScreen(640, 480, 32, "blubba")
  
  LoadSprite(0, Path$+"Back.bmp", 0)
  
  LoadSprite(5, Path$+"player_2.bmp",0)
  LoadSprite(6,Path$+"player_3.bmp",0)
  LoadSprite(7,Path$+"player_4.bmp",0)
  LoadSprite(8,Path$+"player_5.bmp",0)
  
  LoadSprite(1, Path$+"player_2_back.bmp",0)
  LoadSprite(2, Path$+"player_3_back.bmp",0)
  LoadSprite(3, Path$+"player_4_back.bmp",0)
  LoadSprite(4, Path$+"player_5_back.bmp",0)
  
  TransparentSpriteColor(1, RGB(00,00,00))
  TransparentSpriteColor(2, RGB(00,00,00))
  TransparentSpriteColor(3, RGB(00,00,00))
  TransparentSpriteColor(4, RGB(00,00,00))
  TransparentSpriteColor(5, RGB(00,00,00))
  TransparentSpriteColor(6, RGB(00,00,00))
  TransparentSpriteColor(7, RGB(00,00,00))
  TransparentSpriteColor(8, RGB(00,00,00))
  
  
 InitPalette() 
  LoadPalette(0, Path$+"Back.bmp")
  
i=5

  posy=200  
  posx=200
  EndIf
 Repeat
    FlipBuffers() 
          
    If IsScreenActive() 
   
          DisplaySprite(0,0,0)
          DisplayTransparentSprite(i, posx,posy)
          
          ExamineKeyboard()
          If KeyboardPushed(#PB_Key_Right)
          posx+3
          i+1
          EndIf
          If KeyboardPushed(#PB_Key_Left)
          posx-3
          i-1
          EndIf
          If KeyboardPushed(#PB_Key_Space)
           ;spring
          EndIf
           

         

          
          If i < 1
          i=4
          EndIf
          If i > 8
          i=5
          EndIf 
          
          
    EndIf
    
  Until KeyboardPushed(#PB_Key_Escape)
  
//edit: 'i' is unwichtig, ..ist nur dafür dass es die Pics a wenq wechselt wenn die Figur sich z.b. dreht..

Verfasst: 12.07.2007 19:33
von a14xerus
mach einen sprung flag
also sobald eine bestimmte taste gedrückt wurde wird die variable "sprung" auf 10 gesetzt.
In der repeatschleife ist eine If abfrage,

Code: Alles auswählen

If sprung > 0
  y-5
  sprung - 1
endif
die bewirkt, das solange die sprungvariable größer als 0 ist die figur nach oben gesetzt wird.
Gegensätzlich dazu fügst du noch eien immer wärende Gravitation ein (einfach immer y + 2 oder so) die wirkt, solange die figur nicht wieder auf dem Boden steht.
Was du dann nurnoch brauchst, ist das die Sprungtaste nur funktioniert, solange die Figur auch auf dem Boden steht.
Fertig ist die (sehr hakelig aussehende) Sprungfunktion

Eerweitern kann man das ganze noch eine einen etwas runder aussehenden Sprung..
Dazu solte man sich meiern meinung nach mal die Mathemaischen funktionen ansehen wie zb sin oder sowas

Verfasst: 12.07.2007 19:37
von N00B
Der Sprung muss ja ne bestimmte Pixelanzahl hoch sein.

Sagen wir mal 20 Pixel.

Dann müsstest schätz ich (hab sbolut 0 Ahnung von Spieleprogrammierung) so was machen wie

Code: Alles auswählen

          If KeyboardPushed(#PB_Key_Space)
            
            Repeat
              posy=200 + 1

            Until posy = 220
            
          EndIf
Also nur ganz grundlegend, warscheinlich müsste man dann noch irgendwie ein Delay zwischen jedes + 1 packen und noch jedesmal die aktuelle Bildposition abgreifen und das Bild refreshen.

Verfasst: 12.07.2007 19:42
von Zaphod
Ich würde da zu sehr simpler Vektorrechnung raten.
Da brauchst du dann zwar auch ein Flag, ob dein Objekt sich grade am Boden befindet, aber der Sprung kann dann schon recht rund aussehen.

Dazu brauchst du nur einen Gravitationsvektor, der idealerweise nach unten zeigt (man kann aber auch lustige Ideen umsetzen bei denen der Vektor nicht genau nach unten zeigt).

Ein Sprung ist dann ein Impulsvektor der dein Objekt nur kurz beeinträchtigt.

Dazu brauchst du dann noch einen Richtungsvektor, der den jeweiligen Zustand deines Objektes beschreibt.

Eine Bewegung ist dann Zustandsvektor=Zustandsvektor+BewegungsImpuls

Dazu rechnest du dann in jeder Zeiteinheit deines Spieles den Gravitationsvektor hinzu, außer dein Objekt liegt auf dem Boden, dann sollte er sich nicht auswirken.

Ich hoffe das war nicht zu umständlich ausgedrückt. Das klingt kompliziert ist aber wirklich sehr einfach.

Verfasst: 12.07.2007 19:47
von Fluid Byte

Code: Alles auswählen

InitSprite() : InitKeyboard()

OpenWindow(0,0,0,640,480,"void",#WS_SYSMENU | #WS_CAPTION | 1)
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)

Repeat
	EventID = WindowEvent()
	
	ClearScreen($854422)
	
	ExamineKeyboard()
	
	If KeyboardPushed(#PB_Key_Space) And Jump = 0
		Accel.f = -10 : Jump = 1
	EndIf
	
	If Jump = 1
		Accel.f + 0.25 : VelY - Accel
	
		If VelY <= 0 : VelY = 0 : Jump = 0 : EndIf
	EndIf
	
	StartDrawing(ScreenOutput())
	Box(320,250 - VelY,50,50,#Red)
	Box(0,300,640,1,#White)
	StopDrawing()	
	
	FlipBuffers()
Until KeyboardPushed(1) Or EventID = 16

Verfasst: 12.07.2007 19:50
von STARGÅTE
ich habs mal gecodet

Wenn du springst passiert das :

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Space) 
 v = -10
EndIf
und als Berechnung :

Code: Alles auswählen

 posy + v ; Bewegung
 if posy > 800 ; Bodenhöhe
  posy = 800
  v = 0
 elseif posy < 800 
  v + 1 ; Gavitation 
 endif
EDIT: Mist zuspät ^^

Verfasst: 12.07.2007 20:56
von S3b
thx auf jeden fall ersdma (((:
ging sehr schnell :D
hat geklappt ^^

Verfasst: 12.07.2007 22:54
von Rubiko
Und wie geht das gleiche mit den Vektoren? Codebeispiele wären nett, da ich kleiner 8. Klässer in Mathe noch keine Vektoren durchgenommen habe und den Wikipedia Artikel genausowenig verstehe :P

Verfasst: 12.07.2007 23:09
von STARGÅTE
naja ein Vektor wäre in 2D (x,y), also eine Wegeplan wie man zu einem Punkt kommt bzw. in welche Richtung ein "Pfeil" zeigt

wir brauchen für den Flug ja ein Richtungs-Vektor

FV - Flug-Vektor

am anfang ist unser FV (0,0) also FV\x = 0 und FV\y = 0,
(wenn FV vom Typ 2D-Vektor ist)

wenn man jetzt nach links oder rechts läuft wird daraus z.B.
(5,0) oder (-5,0)

springt der Spieler jetzt gleichzeitig nach oben, wird darauf am anfang (5,-10)

und nun wir wie oben im CODE der Y-Wert geändert.

Verfasst: 13.07.2007 00:23
von Rubiko
Das heißt die gesamten Veränderungen an der Position sind vom 2D Vektor abhängig? Jede Veränderung findet nur durch Verändern der x und y Werte im Vektor statt...
Mit anderen Worten wird also einfach nur überprüft Welche Werte der Vektor hat und je nachdem die X und Y Position verändert? Dann wär es ja wirklich ziemlich einfach ;)