Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SDL
SDL Forum d'entraide sur l'API SDL. Avant de poster -> FAQ SDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/05/2012, 14h52   #1
Menudelux
Invité de passage
 
Homme Alexis
Étudiant
Inscription : avril 2012
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 17
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 8
Points : 2
Points : 2
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 :
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 :
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.
Menudelux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 08h36   #2
Kannagi
Membre émérite
 
Avatar de Kannagi
 
Homme
Inscription : mai 2010
Messages : 461
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2010
Messages : 461
Points : 838
Points : 838
Envoyer un message via MSN à Kannagi
Je vois une erreur après un case il faut mettre un break que tu ne fait pas.
Kannagi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 19h11   #3
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 201
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 201
Points : 314
Points : 314
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.
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h02.


 
 
 
 
Partenaires

Hébergement Web