2D Sprung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
S3b
Beiträge: 46
Registriert: 06.05.2007 13:46
Wohnort: Neustadt

2D Sprung

Beitrag 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..
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag 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.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ^^
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
S3b
Beiträge: 46
Registriert: 06.05.2007 13:46
Wohnort: Neustadt

Beitrag von S3b »

thx auf jeden fall ersdma (((:
ging sehr schnell :D
hat geklappt ^^
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
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
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag 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 ;)
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Antworten