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 pour animer un sprite


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut Problème pour animer un sprite
    Bonjour,

    J'ai suivis un tutoriel pour animé un sprite, j'ai recopier le code en modifiant des petites choses (histoire de bien comprendre et d'apprendre), mais j'ai un problème : mon sprite ne s'affiche tout simplement pas à l'écran !

    Voici mon code :

    main.h :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <FMOD/fmod.h>
     
    #define LARGEUR_ECRAN  640
    #define HAUTEUR_ECRAN  480
    #define NBRE_DE_BIT    32
     
    enum{HAUT,DROITE,BAS,GAUCHE};
    enum{AUCUNE_DIRECTION,DIRECTION_HAUT,DIRECTION_DROITE,DIRECTION_BAS,DIRECTION_GAUCHE};
     
    typedef struct
    {
        /* En ce qui concerne l'affichage du sprite */
        SDL_Surface *charset; //Pour charger l'image entière
        SDL_Rect source,dest; //La position des sprites et la selection
     
        //La taille du sprite
        int largeur, hauteur;
     
        /* Le déplacement du sprite */
        int direction; //La direction
        int vitesse; //La vitesse
     
        /* L'animation du sprite */
        int anim; //Si le sprite est animé
        int orientation; //La direction dans laquel est orientée le sprite
        int anim_courante; //L'animation actuelle
        int temps_anim;//Le temps que dure une animation
        int temps_anim_courante; //Le temps de l'animation courante
        int total_anims; //Le nombre total d'animation
    }Sprite;
    et main.c
    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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
     
    #include "main.h"
     
    /*On met nos fonctions*/
    SDL_Surface *chargementImage(char *fichier)
    {
        SDL_Surface *imageACharger;
     
        imageACharger = IMG_Load(fichier);
        if(imageACharger == NULL)
        {
            fprintf(stderr,"Erreur de chargement de l'image");
            exit(EXIT_FAILURE);
        }
     
        return imageACharger;
    }
     
    int chargerSprite(Sprite *sprite, char *image)
    {
        sprite->charset = chargementImage(image);
        if(!sprite->charset)
        {
            fprintf(stderr,"Impossible de charger l'image");
            exit(EXIT_FAILURE);
        }
     
        SDL_SetColorKey(sprite->charset,SDL_SRCCOLORKEY,SDL_MapRGB(sprite->charset->format,255,0,0));
     
        //Maintenant on définie toutes les propriété du sprite
        sprite->source.x = sprite->anim_courante * sprite->largeur;
        sprite->source.y = sprite->orientation * sprite->hauteur;
        sprite->source.w = sprite->largeur;
        sprite->source.h = sprite->hauteur;
        sprite->dest.x = 0;
        sprite->dest.y = 0;
        sprite->largeur = 32;
        sprite->hauteur = 32;
        sprite->vitesse = 2;
        sprite->direction = AUCUNE_DIRECTION;
        sprite->anim = 0;
        sprite->orientation = BAS;
        sprite->anim_courante = 0;
        sprite->temps_anim = 8;
        sprite->temps_anim_courante = 0;
        sprite->total_anims = 4;
     
        return 1;
    }
     
    void fixerDirectionSprite(Sprite *sprite, int direction)
    {
        //On donne au sprite, la directon que l'on a mis dans la fonction
        sprite->direction = direction;
     
        //On lui affecte l'animation correspondante
        if(direction != AUCUNE_DIRECTION)
        {
            sprite->anim = 1; //On l'anim
     
            switch(direction)
            {
                case DIRECTION_BAS:
                    sprite->orientation = BAS;
                    break;
     
                case DIRECTION_GAUCHE:
                    sprite->orientation = GAUCHE;
                    break;
     
                case DIRECTION_DROITE:
                    sprite->orientation = DROITE;
                    break;
     
                case DIRECTION_HAUT:
                    sprite->orientation = HAUT;
                    break;
     
                default:
                    ;
            }
        }
        else //On ne demande aucune direction
        {
            sprite->anim = 0; //On anime pas le sprite
        }
        sprite->anim_courante = 0; //On met l'anim courante à 0
        sprite->temps_anim_courante = 0;
     
        //On règle la source de l'image que l'on doit copier
        sprite->source.x = sprite->anim_courante * sprite->largeur;
        sprite->source.y = sprite->orientation * sprite->hauteur;
    }
     
    void MiseAJourSprite(Sprite *sprite)
    {
        //Si la sprite va vers le bas
        if(sprite->direction & DIRECTION_BAS)
        {
            //On descend le sprite (il ne faut pas qu'il sorte de l'écran)
            sprite->dest.y += sprite->vitesse;
            if(sprite->dest.y + sprite->hauteur > HAUTEUR_ECRAN)
            {
                sprite->dest.y = HAUTEUR_ECRAN - sprite->hauteur;
            }
        }
        else if(sprite->direction & DIRECTION_GAUCHE)
        {
            //On va à gauche
            sprite->dest.x -= sprite->vitesse;
            if(sprite->dest.x < 0)
            {
                sprite->dest.x = 0;
            }
        }
        else if(sprite->direction & DIRECTION_DROITE)
        {
            //On va à droite
            sprite->dest.x += sprite->vitesse;
            if(sprite->dest.x + sprite->largeur > LARGEUR_ECRAN)
            {
                sprite->dest.x = LARGEUR_ECRAN - sprite->largeur;
            }
        }
        else if(sprite->direction & DIRECTION_HAUT)
        {
            //On monte le sprite
            sprite->dest.y -= sprite->vitesse;
            if(sprite->dest.y < 0)
            {
                sprite->dest.y = 0;
            }
        }
    }
     
    void BlitSprite(Sprite * sprite, SDL_Surface *destination)
    {
        //Si le sprite est animé, on fait l'anim
        if(sprite->anim)
        {
            //On décrémente le temps
            sprite->temps_anim_courante--;
            if(sprite->temps_anim_courante <= 0)
            {
                sprite->anim_courante++;
                if(sprite->anim_courante >= sprite->total_anims)
                {
                    sprite->anim_courante = 0;
                }
     
                sprite->source.x = sprite->anim_courante * sprite->largeur;
                sprite->temps_anim_courante = sprite->temps_anim;
            }
        }
     
        //Et enfin : l'heure du blit !
        SDL_BlitSurface(sprite->charset,&sprite->source,destination,&sprite->dest);
    }
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran;
        int continuer = 1;
        SDL_Event event;
        //La variable pour calculer le temps :
        Uint32 tempsActuel, prochainChangement = 0;
     
        //Déclaration d'une variable Sprite
        Sprite persoControlable;
     
        //Initialisation de la SDL
        if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
        {
            fprintf(stderr, "Impossible d'initialiser la SDL");
            exit(EXIT_FAILURE);
        }
     
        //Ouverture de la fenetre
        ecran = SDL_SetVideoMode(LARGEUR_ECRAN,HAUTEUR_ECRAN,NBRE_DE_BIT,SDL_HWSURFACE | SDL_DOUBLEBUF);
        if(ecran == NULL)
        {
            fprintf(stderr, "La fenetre n'a pas pu être ouverte");
            exit(EXIT_FAILURE);
        }
        //On donne un titre à la fenêtre
        SDL_WM_SetCaption("Animation de Sprites",NULL);
     
        /* On charge les 3 sprites (1 controlable seulement) */
        if(!chargerSprite(&persoControlable, "images/pecheur.bmp"))
        {
            fprintf(stderr,"Impossible de charger le 1er sprite");
            SDL_Quit();
            exit(EXIT_FAILURE);
        }
     
        //On place le perso controlable au milieu
        persoControlable.dest.x = ecran->w / 2;
        persoControlable.dest.y = ecran->h / 2;
        fixerDirectionSprite(&persoControlable,DIRECTION_BAS);
        fixerDirectionSprite(&persoControlable,AUCUNE_DIRECTION);
     
     
        while(continuer)
        {
            while(SDL_PollEvent(&event))
            {
                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_UP:
                                fixerDirectionSprite(&persoControlable,DIRECTION_HAUT);
                                break;
     
                            case SDLK_DOWN:
                                fixerDirectionSprite(&persoControlable,DIRECTION_BAS);
                                break;
     
                            case SDLK_RIGHT:
                                fixerDirectionSprite(&persoControlable,DIRECTION_DROITE);
                                break;
     
                            case SDLK_LEFT:
                                fixerDirectionSprite(&persoControlable,DIRECTION_GAUCHE);
                                break;
                        }
                        break;
     
                    case SDL_KEYUP:
                        switch(event.key.keysym.sym)
                        {
                            case SDLK_UP:
                                if(&persoControlable.direction == DIRECTION_HAUT)
                                {
                                    fixerDirectionSprite(&persoControlable,AUCUNE_DIRECTION);
                                }
                                break;
     
                            case SDLK_DOWN:
                                if(&persoControlable.direction == DIRECTION_BAS)
                                {
                                    fixerDirectionSprite(&persoControlable,AUCUNE_DIRECTION);
                                }
                                break;
     
                            case SDLK_RIGHT:
                                if(&persoControlable.direction == DIRECTION_DROITE)
                                {
                                    fixerDirectionSprite(&persoControlable,AUCUNE_DIRECTION);
                                }
                                break;
     
                            case SDLK_LEFT:
                                if(&persoControlable.direction == DIRECTION_GAUCHE)
                                {
                                    fixerDirectionSprite(&persoControlable,AUCUNE_DIRECTION);
                                }
                                break;
                        }
                        break;
     
                }
            }
     
            //On récupère le temps écoulé (milli-seconde)
            tempsActuel = SDL_GetTicks();
     
            if(tempsActuel > prochainChangement)
            {
                prochainChangement = tempsActuel + 20;
     
                //On met à jour le jeu
     
                //MAJ des position des sprites
                MiseAJourSprite(&persoControlable);
     
                //On efface l'écran
                SDL_FillRect(ecran,NULL,0);
     
                //On blit
                BlitSprite(&persoControlable,ecran);
     
                //On met à jour
                SDL_UpdateRect(ecran,0,0,0,0);
     
     
            }
     
        }
     
        SDL_Quit();
     
     
        return EXIT_SUCCESS;
    }
    Voila, et quand je compile, il m'ouvre une fenetre noir (normal), mais mon sprite n'est pas affiché (l'écran reste noir ^^).

    J'ai bien comparer mon code à celui du tutoriel, mais bon je ne vois pas trop où est mon erreur (pour info, le tutoriel est ici)

    A+

  2. #2
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Quelques remarques :

    main.c:241: warning: comparison between pointer and integer
    main.c:248: warning: comparison between pointer and integer
    main.c:255: warning: comparison between pointer and integer
    main.c:262: warning: comparison between pointer and integer
    Cela vient d'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if(&persoControlable.direction == DIRECTION_HAUT)
    qui devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if(persoControlable.direction == DIRECTION_HAUT)
    ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      //Si la sprite va vers le bas
        if(sprite->direction & DIRECTION_BAS)
        {
        }
        else if(sprite->direction & DIRECTION_GAUCHE)
        {
        }
        else if(sprite->direction & DIRECTION_DROITE)
        {
        }
        else if(sprite->direction & DIRECTION_HAUT)
        {
     
        }
    1) C'est une mauvaise habitude de ne pas mettre les accolades autour du else... cela te poser des problèmes un jour.

    2) Ne jamais utiliser le & binaire sauf si on sait exactement ce qu'on fait ce qui n'est pas le cas ici. Ce code ne fonctionnera pas comme tu le souhaite et donc utilise l'opérateur == à la place.

    Enfin :


    Tu as trop de redondance dans ta structure de données et cela a porté des problèmes de code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        //Maintenant on définie toutes les propriété du sprite
        sprite->source.x = sprite->anim_courante * sprite->largeur;
        sprite->source.y = sprite->orientation * sprite->hauteur;
        sprite->source.w = sprite->largeur;
        sprite->source.h = sprite->hauteur;
        sprite->dest.x = 0;
        sprite->dest.y = 0;
        sprite->largeur = 32;
        sprite->hauteur = 32;
    Cela ne te semble pas bizarre d'utiliser les champs largeur et hauteur avant de les avoir initialisés ? Si tu avais un seul endroit avec ces informations ce serait mieux.

    Vu que ton sprite ne changera jamais de largeur ou de hauteur et que source.w et source.h ne changeront jamais, je te conseillerais de laisser tomber les champs largeur et hauteur et garder seulement source.w et source.h

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Bonjour et merci de votre réponse.

    Pour les variables sprite->largeur et sprite->hauteur, vous voulez carément que je les supprime ou bien que je les transforme en #define ?
    Car j'en ai besoin pour le calcul de sprite->source.x et sprite->source.y ?

    Vous voulez que je fasse sa (si j'ai bien compris) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sprite->source.w = 32;
    sprite->source.h = 32;
    sprite->source.x = sprite->anim_courante * sprite->source.w;
    sprite->source.y = sprite->orientation * sprite->source.h;
    Ensuite pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(sprite->direction & DIRECTION_BAS)
    {
    }
    Moi aussi je trouve cette ligne bizard, car : sprite->direction peut valoir 0, 1, 2 ou 3.
    Donc il faudrait plutot faire sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if((sprite->direction > 0) & DIRECTION_BAS)
    {
    }
    Et sinon je ne suis pas sur d'avoir compris, je dois remplacer & par ==, car je dois regarder si sprite->direction est égal à DIRECTION_BAS ?

    A+

  4. #4
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 288
    Points : 240
    Points
    240
    Par défaut
    Regarde par ici: lien

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    J'ai réussis à faire fonctionner le script !

    Je voulais savoir une dernière chose, voici mes deux sprites (je vous expliquerais après mon problème !):





    Ils ne sont pas de la même taille (mais bon sa ce n'est pas grave), par contre sur le sprite de Link on peut voir que la première ligne Link à la tête vers le bas, la deuxième ligne à gauche etc.
    Or sur celle du pecheur la première ligne, il est orienté en haut, la deuxième à droite etc.

    En gros cette fonction marche que si TOUT les sprites sont orienté vers la même direction (par exemple avec Link, quand j'allais vers le haut, il était orienté vers le bas).

    Comment faire pour que ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    enum{BAS,GAUCHE,DROITE,HAUT};
    enum{AUCUNE_DIRECTION,DIRECTION_BAS,DIRECTION_GAUCHE,DIRECTION_DROITE,DIRECTION_HAUT};
    ... pour que ces deux lignes puissent d'adapter en fonction des sprites (en fonction de leur orientation sur le charset) ?

    A+

    EDIT: ironzorg >> le programme que tu m'a donné est en C++, je n'y comprend pas grand chose :s

  6. #6
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 288
    Points : 240
    Points
    240
    Par défaut
    Le tuto n'est pas dur a comprendre et il utilise un systeme beaucoup plus simple que le tient ( pour un perso en tout cas ): les rect et c'est tout ! Et si le C++ te dérange, tu pourra tres certainement trouver une alternative ( c'est la gestion des tiles qui se fait avec le tas, tu pourrais faire de l'allocation dynamique de mémoire ).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Ok, j'essaie de me familiarisé avec les alloc dynamique, car je me rend compte qu'on en a beaucoup besoin dans les programmes.

    J'ai essayé de bidouiller un truc, et comme d'hab sa marche pas :p

    Dans la fonction chargerSprite j'ai rajouté deux "champs" pour mettre la largeur et la hauteur du sprite que l'on veut charger, sa donne sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int chargerSprite(Sprite *sprite, char *image, int largeur, int hauteur)
    {
     //Je vous passe la suite
     sprite->source.w = largeur;
     sprite->source.h = hauteur;
    }
    Et quand j'appelle la fonction je fais sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!chargerSprite(&persoControlable, "images/images_link.gif",100,120))
        {
            fprintf(stderr,"Impossible de charger le 1er sprite");
            SDL_Quit();
            exit(EXIT_FAILURE);
        }
    Mais sa marche plus !
    Quand je compile, il ne me met pas d'erreur, mais il m'affiche le charset en entier (alors que si je met manuelle 100 et 120 à la largeur et à la hauteur, sa marche !)

    Car en faite je voudrait insérer d'autre sprites qui n'ont pas la même dimension (ils sont plus petit) !

    Comment faire ?

    A+

  8. #8
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Citation Envoyé par Soward
    Ils ne sont pas de la même taille (mais bon sa ce n'est pas grave), par contre sur le sprite de Link on peut voir que la première ligne Link à la tête vers le bas, la deuxième ligne à gauche etc.
    Or sur celle du pecheur la première ligne, il est orienté en haut, la deuxième à droite etc.

    En gros cette fonction marche que si TOUT les sprites sont orienté vers la même direction (par exemple avec Link, quand j'allais vers le haut, il était orienté vers le bas).

    Comment faire pour que ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    enum{BAS,GAUCHE,DROITE,HAUT};
    enum{AUCUNE_DIRECTION,DIRECTION_BAS,DIRECTION_GAUCHE,DIRECTION_DROITE,DIRECTION_HAUT};
    ... pour que ces deux lignes puissent d'adapter en fonction des sprites (en fonction de leur orientation sur le charset) ?
    Tu ne peux pas le faire directement. Par contre tu peux rajouter une abstraction du fichier bmp pour gérer cela.

    Par exemple tu peux faire un fichier texte qui te donne :

    - La taille du sprite
    - La position de chaque composante : haut, bas, gauche, droite (donc à quelle ligne se trouve chaque direction)
    - Le nombre d'animations par direction (pour avoir un nombre différent, qui sait)
    - Ensuite, lorsque tu charge le .txt, il te donne toutes ses informations et tu les utilises en conséquence.

    Cela demande plus de programmation mais c'est la seule solution à part retoucher tes images.

    Jc

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Merci, sa pourrait m'être très certainement utile (surtout quand par la suite je voudrais faire des animations d'explosions ou autre, de savoir combien il y a d'anim en tout).

    Je vais essayer de programmer cette fonction (sa va pas être simple :p).
    Par contre comment je fais pour savoir qu'elle animation est en premier dans le sprite ? Enfin je veux dire l'ordinateur ne peut pas savoir si Link est orienté en premier vers le bas ou autre ?

    A+

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

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Citation Envoyé par Soward
    Par contre comment je fais pour savoir qu'elle animation est en premier dans le sprite ? Enfin je veux dire l'ordinateur ne peut pas savoir si Link est orienté en premier vers le bas ou autre ?
    Il faut définir le format de fichier qui va bien...

    Par exemple je verrais bien un fichier link :

    link.bmp
    32
    32
    4 0 0
    4 0 96
    4 0 64
    4 0 32
    J'utilisais ce format avant. Cela me donne en première ligne le fichier bmp qui contient la sprite. Ensuite viennent la largeur et hauteur de la sprite.

    Enfin, les animations pour le bas, le haut, la droite et la gauche. Pour chaque direction, je définis le nombre d'animations et la position de départ.

    Ceci permet de faire un fichier bmp composé de plusieurs bonhommes par exemple...

    Maintenant par contre, j'utilise un format XML ce qui est plus pratique lorsque nous voulons ajouter des informations.

    Jc

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Merci, sa devient un peu compliquer :p

    Dans vos chiffres ici :

    4 0 0
    4 0 96
    4 0 64
    4 0 32
    Le 4 au début signifie le nombre d'animation (il y a quatre positions différentes) ?

    Les 0 et les chiffres de la 3ème colonnes je n'ai pas compris (pardonnez moi) a quoi ils servaient ?

    A+

  12. #12
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Citation Envoyé par Soward
    Le 4 au début signifie le nombre d'animation (il y a quatre positions différentes) ?
    Oui.

    Citation Envoyé par Soward
    Les 0 et les chiffres de la 3ème colonnes je n'ai pas compris (pardonnez moi) a quoi ils servaient ?
    Ce que j'ai dit
    Pour chaque direction, je définis le nombre d'animations et la position de départ.
    Donc par exemple :
    link.bmp
    32
    32
    4 0 0
    4 0 96
    4 0 64
    4 0 32
    se traduit par :

    Cette sprite est définit dans le fichier image link.bmp. Chaque image du personnage fait 32*32 pixels.

    Le nombre d'images pour le mouvement vers le bas est 4. La position de départ du mouvement vers le bas commence à (0,0). Ce qui veut dire que les images de l'animation commencent à (0,0), (32,0), (64,0) et (96,0).

    Le nombre d'images pour le mouvement vers le haut est 4. La position de départ du mouvement vers le haut commence à (0,96). Ce qui veut dire que les images de l'animation commencent à (0,96), (32,96), (64,96) et (96,96).

    ...
    Jc

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Ah oki, j'ai bien compris :p

    A chaque animation on incrémente source.x de 32 (enfin de la largeur du sprite).

    Je vais essayer de coder sa, même si je suis pas un as de la lecture des fichiers.

    Je laisse ce topic ouvert comme sa si j'ai un problème (et je peux être sur que j'en aurais ) je poserais mes questions ici !

    A+

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Me revoila.

    J'ai crée un fichier "sprites.txt" et dedans j'y est mis :
    images/images_link.gif
    25
    30
    4 0 0
    4 0 90
    4 0 60
    4 0 30
    J'ai un peu modifier mon code en mettant sa :
    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
     
    //On met nos #define qui serviront pour lire le fichier
        #define LIEN_DU_CHARSET 100
     
        /* On va charger le fichier de sprite pour pouvoir le charger */
        FILE *fichier = NULL;
        fichier = fopen("sprites.txt","r");
        char lienDuSprite[LIEN_DU_CHARSET] = "";
     
     
     
        //Si le fichier n'a pas été créer
        if(fichier == NULL)
        {
            fprintf(stderr,"Le fichier sprites.txt n'existe pas\n");
            exit(EXIT_FAILURE);
        }
        else //Le fichier sprites.txt existe !
        {
            fprintf(stderr,"Le fichier a bien été ouvert\n");
            //On lit la premiere ligne
            fgets(lienDuSprite,LIEN_DU_CHARSET,fichier);
            //On ouvre le sprite
            sprite->charset = chargementImage(lienDuSprite);
            fprintf(stderr,"L'image %s a bien été ouverte",lienDuSprite);
     
     
            fclose(fichier);
        }
        sprite->charset = chargementImage(image);
        if(!sprite->charset)
        {
            fprintf(stderr,"Impossible de charger l'image");
            exit(EXIT_FAILURE);
        }
    Voila, déja mon premier problème c'est que dans mon fgets, je ne vois pas écrit :
    L'image images/images_link.gif a bien été ouverte
    J'en déduis qu'il y a déja un problème pour lire la première ligne (je précise que le fichier a bien été ouvert).

    Je voulais vous posez une autre question, quand j'aurais réussis à lire la première ligne, je devrais faire une boucle pour lire la deuxième non ? Comment je vais faire pour stocker la hauteur et la largeur dans deux autres variables ?
    Est-ce que si j'ouvre une deuxième fois mon fichier avec fgets il va m'envoyer automatiquement à la deuxième ligne ?

    A+

  15. #15
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Citation Envoyé par Soward
    Voila, déja mon premier problème c'est que dans mon fgets, je ne vois pas écrit :
    Je ne vois pas pourquoi tu utilises fgets... Tu fais du C++ pas du C.

    J'en déduis qu'il y a déja un problème pour lire la première ligne (je précise que le fichier a bien été ouvert).
    Ensuite, il faudrait enlever le '\n' que fgets laisse mais vu que tu n'utiliseras pas fgets puisque t'es en C++...

    Je voulais vous posez une autre question, quand j'aurais réussis à lire la première ligne, je devrais faire une boucle pour lire la deuxième non ?
    Cela dépend.

    Comment je vais faire pour stocker la hauteur et la largeur dans deux autres variables ?
    En principe tu vas avoir une classe Sprite qui contiendra :

    - le nom du fichier image
    - le nombre d'animations haut, bas, gauche droites
    - les images du perso pour ces directions
    - leur taille

    Attention, une bonne structure consiste à avoir une classe Perso après qui contiendra :

    - la position du joueur dans le monde
    - ses points de vie
    - son sac à dos
    - un pointeur/référence à la classe Sprite

    On utilise un pointeur ou une référence pour que chaque perso de ton jeu utilisant les mêmes images utilisent les mêmes images (on les chargera une seule fois).

    Est-ce que si j'ouvre une deuxième fois mon fichier avec fgets il va m'envoyer automatiquement à la deuxième ligne ?
    Cela dépend de comment tu charges tes informations. Si tu fais des fonctions séparées, alors oui, il faudra rouvrir le fichier à chaque fois, aller à la bonne ligne et extraire les informations.

    Si tu fais une seule fonction, alors non.

    Jc

  16. #16
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 578
    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 : 7 578
    Points : 17 833
    Points
    17 833
    Par défaut
    Citation Envoyé par fearyourself
    - le nom du fichier image
    - les images du perso pour ces directions

    Jc
    La technique que j'utilise que je suggérrai plutot c'est d'utiliser un index de bitmaps sur un tableau ou un conteneur du genre std::vector par exemple plutot que de mémoriser le nom de l'image;
    je ferais comme cela :
    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
     
    std::string nom_bitmap,index;
    std::vector<SDL_Surface> liste_images;
    SDL_Surface surface;
     
    for (int i=0;i<nbre_images;i++)
    {
    itoa(i,index,10);
    nom_bitmap=index+".bmp";
    surface.load_bmp( nom_bitmap);
    liste_images.push_back( surface );
    }
     
    class sprite{
    SDL_Rect frames[20];
    int index_bmp;
    int index_animation;
    };
    // puis pour le rendu il suffit de déclarer liste_images[sprite::index_bmp]  pour acceder à la SDL_Surface et pour le rectangle de rendu sprite::frames[sprite::index_animation];
    Eviter de déclarer
    class sprite{
    SDL_Surface mouvements[10];
    };
    parce que le jour ou vous voulez passer par Open GL ou une autre couche multimédia eh bien faut tout refaire

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Bonsoir,

    Heu je suis désolé mais je code en C pas en C++
    Je préfère avoir un bon niveau e C (c'est encore loin :p) avant d'attaquer le C++

    En faite ce que je veux c'est :
    Pouvoir stocker chaque ligne de mon "sprite.txt" dans des variables différentes.
    Je stock le chemin vers l'image dans une première variable.
    Je stock la hauteur et largeur du sprite dans deux autres variables.
    Je stock le nombre d'animation du sprite dans encore une autre variable.

    Bref je sais pas trop faire sa :p

    A+

  18. #18
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 578
    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 : 7 578
    Points : 17 833
    Points
    17 833
    Par défaut
    Citation Envoyé par Soward
    Bonsoir,

    Heu je suis désolé mais je code en C pas en C++
    Je préfère avoir un bon niveau e C (c'est encore loin :p) avant d'attaquer le C++


    A+
    aucun problème il suffit de déclarer struct{...} sinon tu peux utiliser de simples aspects du C++.
    Utiliser les conteneurs de la STL cela simplifie énormément le boulot sinon tu vas devoir faire tes propres méchanismes de listes chainées ce qui peut parfois être contraignant à gérer

Discussions similaires

  1. Problème d'animation de sprite
    Par Menudelux dans le forum SDL
    Réponses: 2
    Dernier message: 02/05/2012, 20h11
  2. Problème pour publier mon anim
    Par edzodzinam dans le forum Flash
    Réponses: 3
    Dernier message: 16/07/2009, 11h27
  3. Réponses: 1
    Dernier message: 26/04/2008, 16h16
  4. Problème pour modifier texte du sprite (flash)
    Par avyrex dans le forum EDI/Outils
    Réponses: 0
    Dernier message: 16/03/2008, 00h13
  5. Réponses: 5
    Dernier message: 13/08/2007, 17h06

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