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 :

Problème avec les animations de mon personnage


Sujet :

SDL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut Problème avec les animations de mon personnage
    Bonjour,

    J'ai un soucis que j'arrive vraiment pas à régler, j'ai pas mal cherché mais sans succès..

    J'ai un personnage en 2D qui a 2 animations différentes, une lorsqu'il est à l'arret et une lorsqu'il avance.

    Les 2 animations fonctionnent mais je n'arrive pas a faire en sorte que l'annimation a l'arret se joue quand il avance pas et l'autre pendant qu'il avance.

    Lorsque j'avance il joue les 2 animations en même temps et je vois pas comment faire.

    Voici une partie du code :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     while(continuer)
        {
            tempsEcoule = SDL_GetTicks();
            if(SDL_PollEvent(&event) == NULL)
            {
                if((tempsEcoule - tempsPrecedent > 55) && persoAactuelA == persoA[PERSOA3])
                {
                    persoAactuelA = persoA[PERSOA0];
                    tempsPrecedent = tempsEcoule +70;
                }
     
                if((tempsEcoule - tempsPrecedent > 55) && persoAactuelA == persoA[PERSOA0])
                {
                    persoAactuelA = persoA[PERSOA1];
                    tempsPrecedent = tempsEcoule +70;
                }
     
                if((tempsEcoule - tempsPrecedent > 55) && persoAactuelA == persoA[PERSOA1])
                {
                    persoAactuelA = persoA[PERSOC2];
                    tempsPrecedent = tempsEcoule +70;
                }
     
                if((tempsEcoule - tempsPrecedent > 55) && persoAactuelA == persoA[PERSOA2])
                {
                    persoAactuelA = persoA[PERSOA3];
                    tempsPrecedent = tempsEcoule +70;
                }
     
     
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                SDL_BlitSurface(persoAactuelA, NULL, ecran, &position);
                SDL_Flip(ecran);
            }
     
            switch(event.type)
            {
                case SDL_QUIT:
                   continuer = 0;
                break;
     
                case SDL_KEYDOWN:
                   switch(event.key.keysym.sym)
                   {
                        case SDLK_ESCAPE:
                          continuer = 0;
                        break;
     
                        case SDLK_RIGHT:
     
                        tempsEcoule = SDL_GetTicks();
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC5])
                          {
                              persoAactuelL = persoCL[PERSOC0];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC0])
                          {
                              persoAactuelL = persoCL[PERSOC1];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC1])
                          {
                              persoAactuelL = persoCL[PERSOC2];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC2])
                          {
                              persoAactuelL = persoCL[PERSOC3];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC3])
                          {
                              persoAactuelL = persoCL[PERSOC4];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelL == persoCL[PERSOC4])
                          {
                              persoAactuelL = persoCL[PERSOC5];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          position.x ++;
                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                          SDL_BlitSurface(persoAactuelL, NULL, ecran, &position);
                          SDL_Flip(ecran);
     
                        break;
     
                        case SDLK_LEFT:
                        tempsEcoule = SDL_GetTicks();
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC5])
                          {
                              persoAactuelR = persoCR[PERSOC0];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC0])
                          {
                              persoAactuelR = persoCR[PERSOC1];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC1])
                          {
                              persoAactuelR = persoCR[PERSOC2];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC2])
                          {
                              persoAactuelR = persoCR[PERSOC3];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC3])
                          {
                              persoAactuelR = persoCR[PERSOC4];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          if((tempsEcoule - tempsPrecedent > 55) && persoAactuelR == persoCR[PERSOC4])
                          {
                              persoAactuelR = persoCR[PERSOC5];
                              tempsPrecedent = tempsEcoule +70;
                          }
     
                          position.x --;
                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                          SDL_BlitSurface(persoAactuelR, NULL, ecran, &position);
                          SDL_Flip(ecran);
                        break;
                   }
                 break;
            }
        }
    Merci pour votre aide

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bonjour,

    Ta facon de coder la boucle interne n'est pas vraiment la meilleure conseillée. En principe, il est conseillé d'avoir deux boucles imbriquées :

    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
    while(continuer) {
        //Traiter les événements
        while(SDL_PollEvent(&event))
            {
            //Pour chaque événement, on regarde d'abord le type
            switch(event.type)
                {
                //Gestion de l'événement en fonction de son type   
     
                //Si on ne veut pas le gérer, on ne fait rien
                default:
                    break;
                }
            }
    }
    - Ensuite ton code me semble bien compliqué pour quelque chose d'aussi simple.

    - Si tu faisais une petite fonction qui te mettait à jour l'image à dessiner, tu ne penses pas que ce serait mieux ?

    - Enfin, comme toujours, s'il n'y a pas de nouveaux événements alors le dernier événement est inclu dans la variable event, ceci provoque forcément un problème dans ton code.

    - Si ton personnage avait une structure/classe avec une gestion interne de l'animation, tu pourrais simplement avoir quelques fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mouvement(); 
    void Arret();
    void MisAJour(int temps);
    SDL_Surface* getImage();
    Mouvement -> Permet de dire qu'on est en mouvement, on retournera donc les surfaces d'animations du perso en mouvements...
    Arret -> Permet de dire qu'on est en mouvement, on retournera donc les surfaces d'animations du perso à l'arrêt...
    MisAjour -> Prend l'interval du temps ou le temps actuel et met à jour l'image à afficher
    getImage -> retourne la surface à afficher.

    Ce genre de structuration me semble nettement plus adapté.
    Jc

Discussions similaires

  1. [PPT-2010] Problème avec les animations
    Par boy2boy_xav dans le forum Powerpoint
    Réponses: 2
    Dernier message: 18/06/2014, 14h14
  2. Réponses: 1
    Dernier message: 24/05/2010, 15h21
  3. Problème avec les relations dans mon modèle
    Par wam35 dans le forum Schéma
    Réponses: 3
    Dernier message: 21/01/2008, 21h22
  4. Réponses: 3
    Dernier message: 26/04/2006, 22h45

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