JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ca47519543d564c37cdf606864373d28Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Probleme mit dem Sprung für Jump and Run
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 17:40    Titel: Probleme mit dem Sprung für Jump and Run Antworten mit Zitat

Hallo,
ich bin gerade dabei ein kleines jump and run zu bauen.
Doch mit dem Springen der Figur habe ich ein Problem:

Wenn man springt und die springen Taste gedrückt hält, bleibt die Figur in der Luft. Ich will aber, dass das nicht so ist.

Denn sonst kann man ja praktisch fliegen.
Ich will also, dass sobald die Figur oben ist, wieder runter fällt.

Hier ein bisschen Code, wie ich die Sprung-Steuerung gemacht habe:
Code:

int spielfigur_y = 370;
int wert = 5;

if (KEY_DOWN(VK_UP))
    {
    spielfigur_y -= wert;
    }
else
{
   spielfigur_y = 370;
}


Vielen Dank,
JkerryZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hamZta
Mini JLI'ler



Anmeldedatum: 28.11.2004
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 18:15    Titel: Antworten mit Zitat

ich hab zwar noch nicht c++ mit dx9 programmiert, aber rein vom logischen her müsstest du ja, wenn die sprungtaste gedrückt wurde, und die figur springen soll auch wieder machen das die taste nicht mehr gedrückt wird Wink

gehts nicht mit VK_UP = false; oder so?

hamZta
_________________
<signatur />
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 18:29    Titel: Antworten mit Zitat

So funktioniert das nicht. Du kannst das nicht so machen das wenn man den Knopf gedrückt hält. Ok Teilweise geht das, wenn du z.b. lange und kurze Sprünge machen willst. Du musst aber jedenfalls eine funktion auslösen wenn du die Taste gedrückt hat die dann den Sprung ausführt bis zu einer gewissen höhe, und wenn die taste immer noch gedrückt wird,wird noch höher gesprungen. Also muss er auch springen wenn du die Taste nicht mehr gedrückt hältst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 18:42    Titel: Antworten mit Zitat

Du musst nicht die Position verringen, sondern die Geschwindigkeit:

Code:

if(fu)
{
   yvel = -sprungkraft;
    jumping = true;
}

// Schwerkraft wirken lassen
yvel += schwerkraft;


ypos += yvel;


Hoffe du verstehst wie ich das meine. ;) Ein Sprung ist eine Beschleunigung und eine Beschleunigung ist die Veränderung der Geschwindigkeit(mit der Zeit, aber das ist in diesem Falle irrelevant).

[Edit]
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 18:43    Titel: Antworten mit Zitat

Schau mal im Tafelwerk: y = v0 - g*t. So kannst du die sprungkraft auch variabel machen(Spielfigur_Kraft), zb für verschiedene Figuren. Mach es so, dass du eine Variable BOOL bLuft machst, so dass man nur springen kann, wenn deine Figur in der Luft ist.
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 20:06    Titel: Antworten mit Zitat

also, wichtig ist, das man eine Abfrage hat, ob der am Boden ist. Dann kann man entweder einen Parabelförmigen Sprung machen (indem man von der Geschwindigkeit immer dier Schwerkraft abzieht) oder das die Geschwindigkeit für eine gewisse Zeit einen Konstanten Wert hat. So kann man auch sehr einfach variable Sprunghöhen machen, allerdings wäre dann der abwärstsürung (wuasi der scheitelpunkt) sehr ruckartig, da könnte man dann noch einen kleine Parabel einbauen.
Parable hat den Nachteil, das bei einem sehr hohen Sprung die Star und Endgeschwindigkeiten extremhoch sind. Kommt halt imemr auf die Situation an, wie mans am besten haben will.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 21:02    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Parable hat den Nachteil, das bei einem sehr hohen Sprung die Star und Endgeschwindigkeiten extremhoch sind. Kommt halt imemr auf die Situation an, wie mans am besten haben will.

Dann muss man für einen höheren Sprung die Parabel eben nicht nur vertikal, sondern eher horizontal(bzw. beides) strecken Wink
Wenn man für einen höheren Sprung länger brauchen soll, dann wählt man eben auf der Zeitachse(X-Achse) einen größeren Betag für die Nullstellen. Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 21:27    Titel: Antworten mit Zitat

also Parabel flacher, indem die Laufgeschwindigkiet erhöht wird, und Flug langsamer, indem man die Schwerkraft niedriger macht? Geht natürlich auch, aber ich wäre ja z. B. dafür in einem Arcade Jum'n'Run Erst so lange zu steigen wie die Taste gedrückt wurde (mit einem Maximum natürlich) und dann den Sprung mit der Schwerkraft abbremsen, so dass oben die Kurve wieder schön ist, und dann auch wieder die höchste Fallgeschwindigkeit zu beschränken.
Aber st ja Geschmacksache, so wie oben würd ichs wahrscheinlich machen, wenn ich nochmal ein neues machen würde, aber das mit der Parabel und der Schwerkraft ist fast noch am einfachsten und am realistischten.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 03.12.2004, 13:52    Titel: Antworten mit Zitat

Also mein Problem ist einfach nur, dass die Figur "fliegt", wenn die Taste nicht losgelassen wird.
Mit Hazels ansatz, klappt das soweit schon einigermaßen. Das Problem ist aber immer noch, dass die Figur nicht wieder runterfällt, wenn ein Wert überschritten ist, selbst wenn die Taste noch gedrückt wird...

Hier noch mal der etwas veränderte Code:
Code:

int spielfigur_y = 370;
int wert = 5;
int schwerkraft = 3;
int jumping = false;

if (KEY_DOWN(VK_UP))
    {
    spielfigur_y -= wert;
   jumping = true;
    }

if (spfgy <= 340)
{
   jumping = false;
}

if ( spfgy < 370)
{
spfgy += schwerkraft;
}


Vielen Dank, JkerryZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 03.12.2004, 14:03    Titel: Antworten mit Zitat

OK, eine kleine Frage: Ist VK_UP sowas wie ne Windows Nachricht, oder eine Funktion die jedesmal angibt, ob die Taste oben oder unten ist? Im ersten Fall, würde die Bedingung nur einmal true sein, egal wie lange die Taste gedrückt wird, im zweiten solange die Taste gedrückt wird.
Ich gehe man vom zweiten aus:
Code:

float YPos=300;//Spieler steht am boden
float Schwerkraft=5;
float YSpeed=0;//Vertikale hgeschwindigkeit des Spielers
bool AufBoden=true;

if(VK_UP&&AufBoden)//der Sprng wird nur gestartet, wenn der Spieler am Boden steht
{
YSpeed=100;
}

if(!AufBoden)
{
YSpeed-=Schwerkraft;
}
else
{
YSpeed=0;//Der Spieler ist nicht mehr im Sprung, steigt und fällt also nciht!
}

if(YPos>=300)//Der Spieler ist nun wieder unten
{
AufBoden=true;}

YPos+=YSpeed;

Das ist nun die Parabel Lösung. Das einzige was du noch machen muss, ist die Abfrage die AufBoden=true setzt an zu passen. Dort kann man beispielsweise testen, ob der Spieler auf einem Block steht.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 03.12.2004, 14:40    Titel: Antworten mit Zitat

Müsste man nicht für die Geschwindigkeit die Zeit mit in Betracht ziehen? So könnte man ein herrlich animiertes Sterben beim Fall aus großen höhen realisieren, falls du das willst
Code:


y -= Grav * ZeitInnerLuft;
// beim landen
if(!gradeebenaufboden && jetztaufboden)
{
   if(fYSpeed < -20)
   {
         player.health += fYSpeed; // da kleiner 0
   }
   else
   {
         fYSpeed = 0; // sicher landen
   }
}

_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 03.12.2004, 15:20    Titel: Antworten mit Zitat

Das mit der Lebensenergie ist ganz nett, danke, vlt. mach ich das mal später, aber erst muss ich mal das mit dem Springen hinkriegen.

bei Jonathan´s Vorschlag bewegt sich aus irgendeinem Grund gar nichts.
Dann habe ich nochmal ein bisschen an meinem weiter rumgeschraubt, aber der setzt zwar auf den Boden zurück, aber er fällt nicht. Das heisst ich kann nur zurücksetzen. das ist aber nicht ganz so toll. Anders kann man wieder fliegen Sad

An Jonathans Vorschlag habe ich auch noch mal weiter rumgebastelt, aber hab auch nicht mehr bewirken können.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 03.12.2004, 18:01    Titel: Antworten mit Zitat

Code:

bool MakeJump = false;


Diese Variable setzt du auf True wenn die Taste gedrückt wird.

Code:

struct PlayerStruct
{
   D3DXVECTOR2 pos;
   D3DXVECTOR2 prevpos;
   float gravity;
      bool air;
} Player;



void Jump(float speed)
{   
   // Wenn der Player noch auf dem Boden steht
    if(Player.air == false)
   {
      // Momentane Position speichern
      Player.prevpos.x = Player.pos.x;
      Player.prevpos.y = Player.pos.y;

      Player.air = true;
   }
   else if(Player.pos.y > Player.prevpos.y) // Evtl. Bodenkollision
   {
      // Alle Werte zurücksetzen so dass erneut gesprungen werden kann
      Player.air     = false;
      MakeJump       = false;
      Player.gravity = 0.0f;
      Player.pos.y   = Player.prevpos.y;
                                return;
   }
   else
   {
      // Die Schwerkraft zieht immer stärker nach unten bis zum Kehrpunkt
      Player.gravity += 0.1f;
   }


   // Playerposition erhöhen
   Player.pos.y -= speed;
   // Und mit schwerkraft abziehen
   Player.pos.y += Player.gravity;
}


Das ist die Player Struktur und die Jump funktion.

Code:

if(MakeJump == true)
         {
            Jump(4.0f);
         }

         

Zeichne Spieler an: Player.pos.x,Player.pos.y


Das kommt in deine Spieleschleife.

Funktioniert bei mir Wunderbar!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beni5
Super JLI'ler


Alter: 36
Anmeldedatum: 12.11.2003
Beiträge: 310
Wohnort: Switzerland
Medaillen: Keine

BeitragVerfasst am: 04.12.2004, 23:51    Titel: Antworten mit Zitat

Und funktioniert es jetzt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.12.2004, 17:18    Titel: Antworten mit Zitat

Code:
...
if(bJumpButton)
{
  bJumpButton=false;
  JumpDuSau();
}
...


Code:
void JumpDuSau()
{
  if(!bOnGround)
    return;
  PlaySound("Jump");
  player->ySpeed=JumpSpeed;
}


Code:
//Idle
Fly();


Code:
void Fly()
{
  if(bOnGround)
    return;

  player->ySpeed-=Gravity;

  if(abs(player->ySpeed)>maxLuftwiederstand)
  {
    player->health-=abs(player->ySpeed)-maxLuftwiederstand;
    PlaySound("Damage");
    AddEffect("Fire");
  }
}

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum