Comment faire sauter un personnage?

45

Je suis en train de créer un jeu en C # avec Direct X 9.0. Le remake du jeu est Donkey Kong NES. J'ai presque tout terminé, mais j'ai des problèmes avec la physique du saut de Mario. J'ai des variables déclarées pour les coordonnées Y et X.

Je me demandais s'il existait une méthode simple pour le faire. J'ai cherché haut et bas une réponse, mais les réponses que j'ai trouvées ne sont pas pertinentes / ou utilisent un langage de programmation différent tel que XNA.

J'ai actuellement une variable bool définie pour vérifier si W a été pressé, cela déclenchera le code pour le faire sauter. Je déconne comme.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Ce qui n'a pas bien fonctionné. J'ai cherché haut et bas une réponse et maintenant je suis désespéré, si quelqu'un pouvait me diriger dans la bonne direction vers une solution simple. Ce serait génial. Très apprécié pour toutes les réponses.

Sarah
la source
5
Les réponses utilisant un langage de programmation différent ne devraient pas poser de problème. L'algorithme est ce qui est intéressant, pas l'implémentation spécifique ... à moins que vous n'espériez que copier / coller sans rien comprendre, ce que j'espère, bien sûr que non Savoir lire et adapter des algorithmes d'autres langages de programmation est une très bonne compétence.
ccxvii

Réponses:

85

Tout d'abord, XNA utilise également C #, donc c'est le même langage de programmation. Et bien que l'API sous-jacente puisse présenter certaines différences par rapport à DirectX, cela n'a rien à voir avec les sauts; les mêmes tutoriels ou réponses devraient donc s'appliquer ici. En outre, il existe de nombreuses façons de mettre en œuvre cela, en fonction de nombreux facteurs. Ce que je vais décrire ci-dessous n’est qu’une des possibilités.

Exigences physiques de base

Premièrement, vous avez besoin de variables physiques de base et de calculs sur votre boucle de mise à jour. En particulier, vous devez définir la position, la vitesse et la gravité, et votre boucle de mise à jour doit effectuer une opération similaire à celle-ci (détection de collision et réponse omises pour des raisons de simplicité):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Saut à hauteur fixe

Maintenant, le moyen le plus simple d'implémenter un saut qui a toujours la même hauteur, peu importe le temps que vous appuyez sur la touche, consiste simplement à modifier la vitesse verticale une fois. Cela fera monter le personnage, tandis que la gravité prendra automatiquement soin de le faire tomber:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Important Vous ne voulez pas pouvoir faire un saut si votre personnage n'est pas au sol, vous devrez donc cocher cette case.

Saut à hauteur variable

Mais des jeux comme Mario et Sonic ont un saut variable où la hauteur du saut dépend de la durée pendant laquelle vous appuyez sur le bouton. Dans ce cas, vous devrez manipuler et relâcher la touche de saut. Vous pouvez ajouter quelque chose comme:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

En ajustant toutes ces valeurs (c.-à-d. Les nombres tels que 0.5, -12.0fou -6.0f) dans le code ci-dessus, vous pouvez modifier la sensation de votre saut, à quelle hauteur il saute, combien il conserve son élan même après avoir relâché le bouton de saut, à quelle vitesse il tombe, etc. .

Important N'appelez pas ces fonctions à chaque image. Appelez-les une seule fois lorsque la touche est enfoncée ou relâchée. Sinon, votre personnage volera au lieu de sauter.

Exemple de travail

Je viens de créer un exemple rapide des techniques décrites ci-dessus, que vous pouvez essayer sur votre navigateur ici (appuyez sur le bouton de la souris pour sauter, relâchez-le à mi-chemin pour contrôler la hauteur du saut). C'est dans JS mais comme je l'ai mentionné plus tôt, le langage n'est pas pertinent dans ce cas.

http://jsfiddle.net/LyM87/

David Gouveia
la source
11
Vous pourriez également profiter de l’occasion pour partager cet article étonnant écrit il ya quelques jours avec des informations sur ce sujet: Le guide pour la mise en œuvre de plateformes 2D . Et aussi ceci: Sonic Jumping .
David Gouveia
2
L'article décrit une façon de faire du saut variable différente de celle que vous avez décrite dans votre réponse. Cela demande de supprimer la gravité ou de continuer à ajouter l'impulsion lorsque le bouton est maintenu enfoncé. Je fais habituellement ce que David a dit dans sa réponse, mais y a-t-il des idées sur les méthodes de l'article?
Jeff
@Jeff Cela a également attiré mon attention, et c’est précisément la raison pour laquelle j’ai mentionné le fait qu’il existe de nombreuses façons de le mettre en œuvre. Le premier article décrit deux manières supplémentaires de traiter le même problème, tandis que la façon dont j'ai décrit est basée sur le deuxième article. Je ne sais pas comment ils se comparent les uns aux autres, même s’ils sont assez faciles à mettre en œuvre. En fin de compte, j'ai choisi cette méthode car elle était plus facile à expliquer et ne nécessitait ni l'ajout d'une minuterie ni la gestion d'impulsions multiples de magnitude décroissante.
David Gouveia
La réponse peut varier en fonction du jeu et du nombre d'animations que vous souhaitez effectuer. Metroid utilise un saut en vitesse constante: / descente, mais le masque avec un travail d'animation de haute qualité pour lui donner un aspect lisse et "incurvé" au zénith. De nombreux autres utilisateurs de plates-formes utilisent des sauts à vitesse variable, ce qui nécessite plus de travail pour que cela fonctionne correctement.
Sean Middleditch
1
c'était très utile, 5 ans plus tard :) et ce truc de violon est très cool - je devrais apprendre JS!
Fluidité
1

Comme en physique. Seulement au moment où vous appuyez jump keyet que le personnage est au sol, augmentez sa vitesse (il s’appelle impulsion), mais faites-le tomber tout le temps par gravité.

Si vous ne voulez pas que le personnage saute à chaque fois qu'il touche le sol - parce que vous êtes en train de le tenir jump key- ajoutez une jump key is being pressedvariable que vous effacez après jump keyest relâchée et définie après. Pseudocode:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Si j'ai utilisé votre façon:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Comment donkey.yva changer est à votre imagination. Velocity devrait être plus petit. Un âne plus haut est dans l'air pour le rendre beau.

utilisateur712092
la source