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
}
'if (maxjumpheight == 40) { maxjumpheight == 0; } 'ne se produira pas souvent. –
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
@BalioFVFX Je suppose que vous vouliez utiliser l'affectation ('='), ne pas comparer les valeurs et rejeter le résultat. – keltar