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 d'animation de sprite


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 13
    Points : 14
    Points
    14
    Par défaut Problème d'animation de sprite
    Bonjour à tous;

    Après avoir fait quelques jeux basiques en SDL, je me suis lancé dans le codage de petits détailles qui donnent vraiment du peps au jeu .
    Ainsi je me suis mis à bosser sur l'animation des sprites.



    Pour simplifier les testes et les explications, nous allons gérer que une seule direction avec un minimum d'image, ( 3 frames) .

    Nous avons donc une plaquette de 3 sprites, dont la frame 0 représente le personnage bougeant la jambe gauche, la frame 1 le personnage immobile et la frame 3 le personnage bougeant la jambe droite.

    Dès que le joueur appuie sur la flèche du mouvement, on prend le temps à ce moment précis dans timeX. On change de frame et on bouge l'image du personnage seulement si timeX-timeY > 200, pour rentrer dans le cycle de l'animation on fait prendre à la variable timeX, la valeur de timeY (je sais pas si vous me suivez ).

    Voila donc le code que j'ai pondu:

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include "main.h"
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *hero = NULL;
        long j;
        SDL_Rect clip[1][3], position;
        long frame = 1;
        long timex = 0, timey = 0;
        long orientation = BAS, animation = 0;
     
         for(j=0;j<3;j++)
        {
                clip[0][j].x = j*32;
                clip[0][j].y = 0;
                clip[0][j].w = 32;
                clip[0][j].h = 32;
        }
     
        SDL_Event event;
        long continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Gestion des animations en SDL", NULL);
     
        hero = IMG_Load("hero_cygne.png");
     
        position.x = 300;
        position.y = 0;
     
        while(continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_DOWN:
                            orientation = BAS;
                            animation = 1;
                            timex = SDL_GetTicks();
                    }
                    break;
            }
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            if(animation)
            {
                timey = SDL_GetTicks();
     
                if(timey-timex > 200)
                {
                    frame = (frame+1)%3;
                    deplacer_joueur(&position, orientation);
                    timex = timey;
                    timey = 0;
                }
            }
     
            SDL_BlitSurface(hero, &clip[0][frame], ecran, &position);
     
            SDL_Flip(ecran);
        }
     
        SDL_FreeSurface(hero);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
    void deplacer_joueur(SDL_Rect *position_hero, long orientation)
    {
     
        if(orientation == BAS)
        {
            position_hero->y+=2;
        }
    }
    Celui-ci marche, le personnage, dès que j'appuie sur la flèche du bas, se déplace en étant animer vers le bas automatiquement.

    J'ai voulu le modifier pour que le personnage puisse être complètement contrôlable, c'est à dire, dès que j'appuie sur la flèche du bas, il doit se déplacer vers le bas en étant animer, puis dès que je relache la touche, il ne doit plus bouger et revenir à la position frame = 1.
    Voila mon code modifié:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include "main.h"
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *hero = NULL;
        long j;
        SDL_Rect clip[1][3], position;
        long frame = 1;
        long timex = 0, timey = 0;
        long orientation = BAS, animation = 0;
     
         for(j=0;j<3;j++)
        {
                clip[0][j].x = j*32;
                clip[0][j].y = 0;
                clip[0][j].w = 32;
                clip[0][j].h = 32;
        }
     
        SDL_Event event;
        long continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Gestion des animations en SDL", NULL);
     
        hero = IMG_Load("hero_cygne.png");
     
        position.x = 300;
        position.y = 0;
     
        while(continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_DOWN:
                            orientation = BAS;
                            animation = 1;
                            timex = SDL_GetTicks();
                    }
                    break;
                case SDL_KEYUP:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_DOWN:
                            animation = 0;
                    }
                    break;
            }
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            if(animation)
            {
                timey = SDL_GetTicks();
     
                if(timey-timex > 200)
                {
                    frame = (frame+1)%3;
                    deplacer_joueur(&position, orientation);
                    timex = timey;
                    timey = 0;
                }
            }
            else
            {
                frame = 1;
            }
     
            SDL_BlitSurface(hero, &clip[0][frame], ecran, &position);
     
            SDL_Flip(ecran);
        }
     
        SDL_FreeSurface(hero);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
    void deplacer_joueur(SDL_Rect *position_hero, long orientation)
    {
     
        if(orientation == BAS)
        {
            position_hero->y+=2;
        }
    }
    Mais ce dernier code ne marche pas, en effet, rien ne se fait quand je presse la flèche du bas, le personnage ne bouge même plus.
    Je n'arrive vraiment pas à régler ce problème avec mon niveau de débutant en programmation , l'erreur doit se trouver dans SDL_KEYUP mais je ne la vois pas...

    Merci d'avance pour l'aide.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je vois une erreur après un case il faut mettre un break que tu ne fait pas.

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 621
    Points : 1 551
    Points
    1 551
    Par défaut
    Hé bien oui, c'est normal que ton animation ne se fasse plus après modification

    J'explique: suite à ta modification, pour que ton personnage se déplace, tu es obligé de tenir la touche DOWN enfoncée.

    Si tu tiens cette touche enfoncée, tu passes par le case SDL_KEYDOWN, puis par le case SDLK_DOWN à chaque boucle "while(continuer)"

    Donc, timex est remis à SDL_GetTicks() à chaque boucle.

    Donc, timey-timex>200 est toujours faux.

    Donc, pas d'appel à deplacer_joueur(...).

    Donc pas d'animation.

    CQFD

    Pour vérifier ça, mets simplement la ligne 68 de ton code en commentaire...

    Edgar.

    PS: à prendre avec humour.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2008, 15h16
  2. Problème pour animer un sprite
    Par Soward dans le forum SDL
    Réponses: 17
    Dernier message: 02/08/2007, 16h30
  3. problème avec les point sprites
    Par conrad dans le forum DirectX
    Réponses: 2
    Dernier message: 14/07/2005, 18h44
  4. [Director] Problème d'animation dans navigateur
    Par phendile dans le forum Autres langages
    Réponses: 1
    Dernier message: 01/12/2004, 20h36
  5. [ Question ] Animer des sprites 3D
    Par Dam)rpgheaven dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/07/2004, 16h14

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