2016-11-13 2 views
-3

Je vais essayer d'expliquer simple, mon personnage saute, mais il ne tombe pas lorsque le bouton Space est relâché. Comment puis-je réparer ça?C++ SDL Le lecteur ne tombe pas quand il saute

Voici mon code pour le saut:

if (keystate[keys[7]]) //Keys 7 = SPACE Button 
{ 
    jumping = true; 
} 
if (jumping) //If is jumping 
{ 
    positionRect.y += jumpVel; 
    jumpVel -= gravity; 
    maxjumpheight++; 
} 

if (maxjumpheight >= 40) 
{ 
    positionRect.y += maxjumpheight * delta; 

    std::cout << "maxjumpheight: " << maxjumpheight << std::endl; 
    jumping = false; 
    if (maxjumpheight == 40) 
    { 
     maxjumpheight == 0; 
    } 
} 

Here est toute source du fichier Player.cpp!

+1

'if (maxjumpheight == 40) { maxjumpheight == 0; } 'ne se produira pas souvent. –

+1

Pouvez-vous expliquer mieux? Je veux juste faire simple: Quand le joueur saute jumpheight ++; donc si la hauteur du saut est 40, il doit être remis à zéro à nouveau. – BalioFVFX

+0

@BalioFVFX Je suppose que vous vouliez utiliser l'affectation ('='), ne pas comparer les valeurs et rejeter le résultat. – keltar

Répondre

0

La manière normale de gérer ceci est de donner au joueur une impulsion de vélocité dans la direction y et avec un peu de physique. Si jumpVel est la vitesse dans la direction y, il devient comme suit (je vais ajouter dans quelques conseils stylistiques aussi bien):

if (keystate[keys[7]]) //Keys 7 = SPACE Button 
{ 
    jumping = true; 

    // unnecessary to set jumping to true and just check it directly afterwards. Just add it here instead 

    jumpVel = 1.0; // Set this to some value, this is the impulse you give the player when he jumps 
} 

// Okay, time to update the position. Lets limit the player so he can't go below 0 
if (positionRect.y > 0) { 
    positionRect.y += jumpVel * delta; // This is how you calculate the new position given speed and change in time 
} 

// gravity affects the speed with which we fall 
jumpVel -= 9.8 * delta; 

Comme ça! Maintenant, l'implémentation ci-dessus permet au joueur de voler si vous maintenez la barre d'espace, mais si vous le laissez partir, vous devriez voir le gars tomber. Je vais laisser comme un exercice pour si vous voulez limiter la hauteur maximale :)

EDIT: Votre axe y est inversé, de sorte que nous devons changer cette conséquence:

if (keystate[keys[7]]) //Keys 7 = SPACE Button 
{ 
    jumping = true; 
    jumpVel = 1.0; 
} 

// the character is above the bottom of the screen 
if (positionRect.y > 480) { 
    positionRect.y -= jumpVel * delta; 
    //  note:^we just flip the axis 
} 
jumpVel -= 9.8 * delta; 

EDIT2: D'accord , laisse passer la physique pour le moment. La façon la plus simple à mettre en œuvre le comportement que vous voulez est

if (positionRect.y > 0 && positionRect.y < 480) { 
    // We are inside the screen bounds 
    if (keystate[keys[7]]) { 
     positionRect.y -= 1.0; // jump 
    } else { 
     positionRect.y += 1.0; // fall 
    } 
} 

Retirez les jumping/falling/maxjumpheight drapeaux.

EDIT3: Ah, bien sûr. Permet de le modifier une fois de plus.

if (keystate[keys[7]]) { 
    if (positionRect.y > 0) positionRect.y -= 1.0; // jump if below the top 
} else { 
    if (positionRect.y < 480) positionRect.x += 1.0; // fall if above the bottom 
} 
+0

Bon les gars, merci à tous pour l'aide que j'apprécie! Maintenant, juste à gauche, quand le bouton Space est relâché, le personnage doit tomber. Chaque fois que j'essaie de faire quelque chose, il commence à tomber immédiatement, même sans toucher quoi que ce soit du clavier, sa chute .. Alors j'ai décidé de vérifier si la hauteur du saut est supérieure à 35 - Commencez à tomber. Mais cela ne le fait pas correctement. Jusqu'à présent, voici mon code: http://pastebin.com/4qvuQjHY – BalioFVFX

+0

@BalioFVFX Mon code traite de ce problème. Si 'jumpVel> 0' vous sautez, et si' jumpVel <0' vous tombez. Vos drapeaux 'jumping 'et' falling' sont inutiles. – pingul

+0

Quand j'essaie d'utiliser votre code, mes personnages vont apparaître sur l'écran quand ils atteignent la coordonnée 0, qui est le haut de l'écran: \ – BalioFVFX

0

Si vous voulez que le caractère arrête de sauter lorsque vous relâchez. Ajoutez un else à la première instruction if avec jump = false.

+0

Merci pour votre aide. Avez-vous une idée de comment le faire tomber quand la clé est libérée? Voici le code jusqu'à présent: http://pastebin.com/jwKfLQ9H – BalioFVFX