IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Faire sauter un personnage


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut Faire sauter un personnage
    Salut, je suis en train de faire un jeu d'aventure 2D en C++, un peu comme Super Mario, mais j'arrive pas a faire sauter mon personnage correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void Heros::recupEvent(SDL_Event event)
    {
        if(event.type == SDL_KEYDOWN)
        {
            switch(event.key.keysym.sym)
            {
                case SDLK_RIGHT: m_vitesse += (VITESSE_PERSO / FPS); break;
                case SDLK_LEFT: m_vitesse -= (VITESSE_PERSO / FPS); break;
                case SDLK_1: changeStance(SAUT);  saut.start(); break;
                default: break;
            }
        }
     
        else if(event.type == SDL_KEYUP)
        {
            switch(event.key.keysym.sym)
            {
                case SDLK_RIGHT: m_vitesse -= (VITESSE_PERSO / FPS); break;
                case SDLK_LEFT: m_vitesse += (VITESSE_PERSO/ FPS); break;
                default: break;
            }
        }
    }
    Ici je récupère l'evenement, si on appuie sur 1, on charge le sprite de saut, puis on enclanche le chrono de la classe Timer (la même que dans l'un des tuto du site pour animer les frames d'un chat). Puis un peu plus tard, quelque part dans la boucle principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (m_stance == SAUT)
            jump();
    Qui appelle la fonction suivante, qui doit faire monter, puis descendre le héros selon une parabole :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Heros::jump()
    {
        float x = saut.get_ticks();
        m_position.y = (100*(x*x) + -200*x + (HAUTEUR_ECRAN - m_hauteur));
    }
    Mais ça ne marche pas : dès fois il se colle tout en haut, dois fois il reste en bas.

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    Bon, je suis pas un pro mais quelques idées en vrac comme ça:

    m_vitesse += (VITESSE_PERSO / FPS)

    ça m'a l'air pas top :s
    il y a pas moyen de bloquer les fps à une vitesse prédéfinie? Et ainsi changer ça par une constante.


    et sinon, pour les sauts, ce que moi je fais (mais à nouveau, je sais pas du tout si c'est une bonne manière, mais en tout cas, ça marche) c'est je met un décompte, tant que je suis pas arrivé à 0, j'incrémente la position du joueur et une fois le compteur à zéro, je laisse la gravité faire le reste
    C'est peut-être ce que tu comptais faire, mais je comprends pas trop ta formule de barbare : (100*(x*x) + -200*x + (HAUTEUR_ECRAN - m_hauteur)) .

    Et sinon, pour avoir un plus beau style, il vaut mieux ne pas utiliser de constantes comme ça dans une formule, mais plutot utiliser des variables, même si elles ne sont utilisées qu'une seule fois...

    Voilà, j'espère que ça te sera utile..

  3. #3
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par luckyvae
    Bon, je suis pas un pro mais quelques idées en vrac comme ça:

    m_vitesse += (VITESSE_PERSO / FPS)

    ça m'a l'air pas top :s
    il y a pas moyen de bloquer les fps à une vitesse prédéfinie? Et ainsi changer ça par une constante.
    Pourtant c'est ce qu'il y a dans un des tutos du site, et ça me convient.


    Citation Envoyé par luckyvae
    et sinon, pour les sauts, ce que moi je fais (mais à nouveau, je sais pas du tout si c'est une bonne manière, mais en tout cas, ça marche) c'est je met un décompte, tant que je suis pas arrivé à 0, j'incrémente la position du joueur et une fois le compteur à zéro, je laisse la gravité faire le reste
    Ben il y a pas encore de "gravité" dans mon jeu (et je comptait pas en mettre, vu que ça m'aurait pas vraiment servit). Et ta façon ne donne pas un mouvement très réaliste (enfin, d'après ce que j'ai compris).


    Citation Envoyé par luckyvae
    C'est peut-être ce que tu comptais faire, mais je comprends pas trop ta formule de barbare : (100*(x*x) + -200*x + (HAUTEUR_ECRAN - m_hauteur)) .
    Ben c'est une équation du second degré, qui fait monter le perso de 100px en une seconde, en allant de moins en moins vite, puis le fait redescendre de plus en plus vite.


    Citation Envoyé par luckyvae
    Et sinon, pour avoir un plus beau style, il vaut mieux ne pas utiliser de constantes comme ça dans une formule, mais plutot utiliser des variables, même si elles ne sont utilisées qu'une seule fois...

    Voilà, j'espère que ça te sera utile..
    Le style je verrai plus tard, quand ça marchera


    EDIT : Je crois avoir capté le problème : saut.get_ticks(); me renvoie 0 au lieu du temps que j'aurai voulu

  4. #4
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    il faut faire attention parce que tu dois rajouter une condition au cas ou tu as un paysage ainsi (ou les # correspondes à des blocs) :
    parce qu'alors le but du saut et de ne pas se retrouver à la même hauteur qu'au départ (une fois pour arriver plus bas, une autre pour arriver plus haut). Donc si tu ne fais qu'appliquer cette fonction du second degré, ça pourrait poser quelques problèmes...

  5. #5
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    Oui j'avais pensé à ça : je ferai un test de collision, et si ça touche, ben je lui demanderai gentillement de s'arreter .

    Mais pour mon problème : enfait, ça renvoie pas 0, c'est juste que c'ets en ms, du coup ça fausse mon calcul

    EDIT : La méthode de luckyvae marche, mais ça fait pas très "naturel" (enfin, avec ce que j'ai fait, je vais essayer d'amléiorer ça).

    EDIT2 : J'ai réussi a faire ma méthode . Par contre j'ai encore tout plein d'autres problème que je dosi regler

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    Si tu veux faire un saut qui soit plus naturel (donc avoir une jolie parabole renversée) il y a facilement moyen de faire en sorte que l'incrémentation soit non-linéaire.

    C'est ce que je faisais, et puis lorsque la gravité reprenait le dessus (qui n'était en fait que la gestion des collisions avec le joueur), on descendait de plus en plus vite.

    Maintenant il faut voir aussi niveau gameplay: il me semble que dans les mario classiques par exemples, quand on sautait, on descendait à vitesse constante.

    Parce que pour ton système pour l'instant, ce que je me dit c'est que si le joueur saute dans un grand trou, ta fonction va être croissante, puis décroissante comme tu le souhaitais mais en fin d'animation, il faudra que tu regardes si il y a collision, si oui, tu devra reprendre la vitesse de chute pour pouvoir continuer à l'augmenter et cette transition doit être non-perceptible par le joueur. et ça pourrait faire une difficulté que tu pourrais éviter. Mais, encore une fois, je ne suis pas un pro, je parle uniquement avec ma petite expérience personnelle.

    est-ce que tu as déjà implémenté ton moteur de collisions? Si oui, tant mieux, si non, il faudrait d'abord commencer par ça...

  7. #7
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    Non, j'ai pas encore fait le moteur de collision, d'abord je commence par le personnage (genre sauter, attaquer, tout ça...).

  8. #8
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    ok. tient nous au courant des évolutions (on est toujours avide de screens et tout ça )

  9. #9
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    Et un screen! Un!



    C'est un peu vide pour l'instant mais ça avance

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    La meilleure solution demeure toujours d'avoir un semblant de moteur physique pour gérer cela.

    Si on attache à un objet un vecteur d'accélération et un de vitesse, on est capable de faire pas mal de choses...

    Ce que je fais généralement c'est ceci :

    - Par défaut le vecteur d'accélération est vers le bas, il représente la gravité.
    - Le vecteur vitesse dépend du mouvement du personnage, lorsqu'il saute, on le fait aller vers le haut (rotation possible mais personnellement dans un jeu comme mario, j'ai une tendance à simplement séparer les composantes x et y et juste mettre une valeur non nulle pour le y).

    La valeur qu'on ajoute dépend de la vitesse initiale du personnage.

    Ensuite, à chaque mise à jour du personnage,

    On recalcule la vitesse en utilisant la formule :

    ax = direction contraire du joueur définit par vx si au sol
    ay = vers le bas -> gravité

    vx = vx0 + delta * ax -> la vitesse dépend linéairement de l'accélération
    vy = vy0 + delta * ay

    x = x0 + delta * v
    y = y0 + delta * v


    Sachant que delta est calculé par le temps entre deux mise à jour et ax est calculé dépendant si le personnage est au sol ou non.

    J'avais fait ceci et cela donnait des bons résultats.

    Jc

  11. #11
    Membre habitué
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Points : 145
    Points
    145
    Par défaut
    T'as pas un exemple concret? Car j'ai peur d'avoir pas tout saisi

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Citation Envoyé par bogoss91
    Ici je récupère l'evenement, si on appuie sur 1, on charge le sprite de saut, puis on enclanche le chrono de la classe Timer (la même que dans l'un des tuto du site pour animer les frames d'un chat). Puis un peu plus tard, quelque part dans la boucle principale :

    Mais ça ne marche pas : dès fois il se colle tout en haut, dois fois il reste en bas.
    Pourquoi déclencher un chrono de classe timer ??
    Regarde dans les tutos du site sinon cherche sur le forum les sources de mon petit projet de Bomberman il faut selon des deltas de temps effectuer des actions particulières
    T1 tu prends un delta1
    T2 un delta 2
    Si delta2-delta1<tempo et si perso saute on met à jour la position et l'affichage

    Sinon il faut effectivement pondérer le mouvement avec de l'accélération.
    A chaque delta de temps cette accélération est incrémentée et tu l'ajoutes au Y de la position de ton perso.
    Si le personnage retombe l'accélération diminue.
    Désolé je pars en vacances demain j'aurais pu te programmer un petit quelque chose sinon courant aout

Discussions similaires

  1. faire bouger un personnage
    Par youp_db dans le forum SDL
    Réponses: 4
    Dernier message: 31/07/2006, 18h43
  2. aide comment faire sauter un personnage
    Par MAXIMIX dans le forum SDL
    Réponses: 3
    Dernier message: 24/05/2006, 09h05
  3. Faire sauter un bonhomme
    Par jbidou88 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 11
    Dernier message: 03/05/2006, 15h09
  4. Réponses: 1
    Dernier message: 23/01/2006, 22h23
  5. Faire bouger un personnage
    Par DeusXL dans le forum DirectX
    Réponses: 35
    Dernier message: 09/06/2004, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo