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

SDL Discussion :

[SDL] Gestion du saut


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 76
    Points : 46
    Points
    46
    Par défaut [SDL] Gestion du saut
    Bonjour je débute et je ne voix pas encore comment faire pour que le personnage principal puisse sauter.

    Est ce que l'ont peut sauter et en même temps se déplacer sur la droite ou sur la gauche pendant le saut ?

    Merci pour vos réponses.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Ben pour le faire sauter tu changes sa position. Tu peux utiliser une interpolation pour changer la hauteur.

    Ensuite pouvoir aller a gauche ou a droite durant le saut, ça c'est a toi de décider. Est ce que tu veux que le joueur puisse faire ça?

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    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 386
    Points : 20 479
    Points
    20 479
    Par défaut
    Citation Envoyé par john93 Voir le message
    Bonjour je débute et je ne voix pas encore comment faire pour que le personnage principal puisse sauter.
    Comme le dit dFrancis750 il suffit de changer la position x et y sur pression de touche..
    Un moyen plus sophistiqué c'est de faire afficher le personnage avec une trajectoire d'arc de cercle ou mieux d'hyperbole...
    L'équation d'un arcle de cercle c'est basiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour angle=0 jusuqu'à angle=angle_arc_cercle
    x'=x+distance_deplacement * ( cos (angle) )
    y'=y+distance_deplacement * ( sin (angle) )
    fin pour
    attention en C les angles sont en radians il faut les convertir en degrés

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Faut rajouter l'interpolation sinon le saut ne se fera pas a la meme vitesse sur toutes les machines.

    Ensuite je pense que y a des moyens d'eviter un cosinus et un sinus qui bouffe de la ressource mais si tu debutes je pense que tu t'en moque.

    Ce que je ferais c'est utiliser l'arc de cercle seulement sur les ordonnées et d'utiliser la vitesse du personnage pour defnir son deplacement sur les abscisses. Ca evitera un changement de vitesse du personnage (il va vite en marchant et ralentit en sautant ou inversement) ou de chercher quel bonne vitesse faut lui donner pour etre raccord.


    J'espere que je suis clair et que ca t'aidera.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 76
    Points : 46
    Points
    46
    Par défaut re: code maj
    enfaite mon delire c'est de programmer le saut dans le même style que mario

    Voila mon code boucle principal pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(continuer != 0){
            etat = fenetre.evenement(&continuer, &sauter);
            fenetre.actualiser();
            sauter = mario->Annimer(etat, sauter);
            SDL_Flip(ptr_ecran);
    }
    1. Etat me permet de savoir quel touche a été appuyer
    2. Sauter me permet de voir si je suis entrein d'effectuer mon saut



    Voici mon code qui me permet de savoir quel touches ont été appuyer :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    int Fenetre::evenement(int *continuer, int *saut)
    {  
            SDL_PollEvent(&event);
     
            switch(event.type)
            {
                case SDL_QUIT:
                     *continuer = 0;
                     break;
     
                case SDL_KEYDOWN:
                     switch(event.key.keysym.sym)
                     {
                         case SDLK_RIGHT: // Flèche droite
                              etat = 2;
                              break;
     
                         case SDLK_LEFT: // Flèche gauche
                              etat = 1;
                              break;
                     }
                     break;
     
                case SDL_KEYUP:
                     switch(event.key.keysym.sym)
                     {
                         case SDLK_RIGHT: // Flèche haut
                              etat = 0;
                              break;
                         case SDLK_LEFT: // Flèche haut
                              etat = 0;
                              break;
                         case SDLK_UP:
                              *saut = 1;
                              break;
                     }
                     break;
                }
     
                return(etat);
    }
    voici le code qui me permet d'animer mon personnage:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    int Personnage::Annimer(int etat,int saut)
    {       
            /* ici nous recuperons le temps pour les futures annimations du personnage */
     
            temps_actuel = SDL_GetTicks(); 
     
            sauter = saut;   // on recupere l'etat du saut pour un future traitement
     
           /* si ont a appuyer sur le bouton "haut" alors l'etat de la variable sauter passe a 1 
              on fait bouger le personnage jusqu'en haut de l'ecran de pixel en pixel.
              
              si le personnage atteind le plafond de l'ecran alors j'attribu a l'etat de la variable
              sauter "0".
              
              si l'on ne saute pas je creer un effet de gravité constante en faisant descendre mon perso
              jusqu'a ce que la position du personnage atteigne 280 px
           */
     
           if(sauter == 1){
                   position_personnage.y--;
                   if(position_personnage.y ==0)
                           sauter = 0;
           }
           else{
                if(position_personnage.y <= 280)
                    position_personnage.y++;
           }
     
     
            /* si aucune touche n'est appuyer on afiche le sprite du personnage
               au repos correspondant a sa direction */
     
            if(etat == 0){
                    if(direction == 1)
                                 SDL_BlitSurface(personnage[8], NULL, ecran_copy, &position_personnage);
                    if(direction == 2)
                                 SDL_BlitSurface(personnage[0], NULL, ecran_copy, &position_personnage);
            }
     
            /* si le bouton gauche est appuyer nous attribuons sa direction 
               ont affiche l'annimation du personnage puis ont le fait s'avancer vers la gauche */
     
            if(etat == 1){
                    direction = 1;
                    if((temps_actuel - temps_precedent) > 30){
                             if(numero_annim == 15)
                                  numero_annim = 8;
                             else if(numero_annim > 15)
                                  numero_annim = 8;
                             else
                                  numero_annim++;
     
                             SDL_BlitSurface(personnage[numero_annim], NULL, ecran_copy, &position_personnage);
                             temps_precedent = temps_actuel;
                    }
                    position_personnage.x--;
                    SDL_BlitSurface(personnage[numero_annim], NULL, ecran_copy, &position_personnage);
            }
     
            /* si le bouton droite est appuyer nous attribuons sa direction 
               ont affiche l'annimation du personnage puis ont le fait s'avancer vers la droite */
     
            if(etat == 2){
                    direction = 2;
                    if((temps_actuel - temps_precedent) > 30){
                             if(numero_annim == 7)
                                  numero_annim = 0;
                             else if(numero_annim > 7)
                                  numero_annim = 0;
                             else
                                  numero_annim++;
     
                             SDL_BlitSurface(personnage[numero_annim], NULL, ecran_copy, &position_personnage);
                             temps_precedent = temps_actuel;
                    }
                    position_personnage.x++;
                    SDL_BlitSurface(personnage[numero_annim], NULL, ecran_copy, &position_personnage);
            }
     
            /* retourne l'etat du saut pour un prochain traitement */
     
            return(sauter);
    }
    je sais pas si ma logique est bonne ou faut que je change je parle au niveau du saut, mais si quelque chose ne vous parait pas normale dans ce code n'hésitez pas à me le dire.

    Merci pour l'aide apporter les mec.

  6. #6
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Pour gérer le sauts on utilise souvent les lois de la physique, avec la gravité. Surtout qu'une fois le modèle physique en place, faire un saut est très facile à réaliser, il suffit d'assigner une valeur négative au vecteur vitesse y et de laisser le moteur tourner.

    Tente des recherche sur google avec "2D game physic", tu devrais trouver des résultats.

    Je viens de mettre la main sur un tuto qui ma l'air pas mal, ils y abordent le saut : http://www.geocities.com/SiliconVall...49/physics.htm

    Par contre ce qui peut-être gênant dans ton code c'est les y-- ou x++, il vaut mieux assigner une vitesse a ton bonhomme, et le faire bouger en fonction du temps (et non en fonction de la rapidité de ton PC).

    Bon c'est vrai que quand on débute, ça fait beaucoup de chose à la fois ! Mais le jeu en vaut la chandelle

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 76
    Points : 46
    Points
    46
    Par défaut re: Polyfructol
    Merci pour ton aide Polyfructol .

    Je vais voir par rapport à ce que tu m'a dit au niveau des vecteurs et de la vitesse pour gérer les déplacements du personnage.

    Je te fais savoir si j'ai réussis à passer cette phase très difficile pour un débutant de ma sorte.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Tu devrais mettre des enum pour t'es etats. Et dans ta fonction Animer y a moyen de factoriser le code aussi.

    Ensuite ce qu'a proposé Polyfructol ca s'appelle la kinematic si je ne me trompe pas. Ca consiste a appliquer la loi de la gravité sans prendre en compte aucune autre force.

    En gros l'equation c'est ca:

    Positiony=Position0y+vitesse*temp

    avec :
    vitesse= vitesse0- 9.81*temp

    Toi tu dois definir vitesse0. Donc en gros quand tu veux sauter, tu passe vitesse0 a une valeur qui va bien pour faire un jolie saut.
    Perso je ferais plutot une interpolation plutot que d'appliquer de la physique.

    Et Polyfructol a raison pour le coup des ++ et --. Ca definit la vitesse d'animation en fonction de la vitesse d'execution et pas en fonction du temp ce qui fait que sur un pc rapide les anim seront rapide et elles seront lentes sur un pc lent.

    Les equations je les ai ecrites de memoires donc c'est possible qu'elles soient fausses.

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Pour les mouvements, plutôt que d'utiliser tes ++, jettes un oeil sur ces tutos :
    http://loka.developpez.com/tutoriel/...uvements/#LX-2
    http://loka.developpez.com/tutoriel/...mation/#LXII-D

Discussions similaires

  1. [SDL] Gestion combats
    Par Splinter_7 dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 09/05/2007, 22h27
  2. [SDL] Gestion des sauts
    Par Splinter_7 dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 02/05/2007, 19h29
  3. [10] Gestion du saut de page sur imprimantes à aiguilles
    Par cramto dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 02/04/2007, 22h52
  4. Jeu 2D / gestion de saut d'un personnage
    Par scarface56 dans le forum Physique
    Réponses: 9
    Dernier message: 23/01/2007, 10h52
  5. [SDL] Gestion des touches claviers problématique
    Par Invité4 dans le forum SDL
    Réponses: 3
    Dernier message: 13/10/2006, 21h15

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