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 :

animation des sprites


Sujet :

SDL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 4
    Points
    4
    Par défaut animation des sprites
    j'ai écris un code qui permet de déplacer une sprite dans le sens droite est gauche mais lors de compilation une fenêtre blanche est affichée sans avoir les sprites.ou es le problème svp?
    Nom : cat.png
Affichages : 819
Taille : 10,9 Ko
    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
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
     
    #include <SDL/SDL.h>
    #include<SDL/SDL_image.h>
    #define CAT_WIDTH 95
    #define CAT_HEIGHT 125
    #define SCREEN_HEIGHT 640
    # define SCREEN_WIDTH 480
     
    void apply_surface(int x, int y, SDL_Surface *source,SDL_Surface *destination, SDL_Rect *clip=NULL)
    {
    SDL_Rect offset;
    offset.x=x;
    offset.y=y;
    SDL_BlitSurface(source,clip,destination,&offset);
    };
     
    typedef struct stSprite stSprite;
    struct stSprite
    {
    int offset;
    int vitesse;
    int frame;
    int status;
    };
     
    int main ( int argc, char** argv )
    {
        SDL_Surface *ecran=NULL, *image=NULL;
        SDL_Rect clipsRight[3],clipsLeft[3];
        int CAT_RIGHT=0,CAT_LEFT=0;
        int continuer=1;
        stSprite sprite;
        sprite.offset=0;
        sprite.vitesse=0;
        sprite.frame=0;
        sprite.status=CAT_RIGHT;
        SDL_Event event;
        int FRAMES_PER_SECOND=3;
     
     
    //On coupe la feuille de sprite
        clipsRight[ 0 ].x = 0;
        clipsRight[ 0 ].y = 0;
        clipsRight[ 0 ].w = CAT_WIDTH;
        clipsRight[ 0 ].h = CAT_HEIGHT;
     
        clipsRight[ 1 ].x = CAT_WIDTH;
        clipsRight[ 1 ].y = 0;
        clipsRight[ 1 ].w = CAT_WIDTH;
        clipsRight[ 1 ].h = CAT_HEIGHT;
     
        clipsRight[ 2 ].x = CAT_WIDTH * 2;
        clipsRight[ 2 ].y = 0;
        clipsRight[ 2 ].w = CAT_WIDTH;
        clipsRight[ 2 ].h = CAT_HEIGHT;
     
        clipsLeft[ 0 ].x = 0;
        clipsLeft[ 0 ].y = CAT_HEIGHT;
        clipsLeft[ 0 ].w = CAT_WIDTH;
        clipsLeft[ 0 ].h = CAT_HEIGHT;
     
        clipsLeft[ 1 ].x = CAT_WIDTH;
        clipsLeft[ 1 ].y = CAT_HEIGHT;
        clipsLeft[ 1 ].w = CAT_WIDTH;
        clipsLeft[ 1 ].h = CAT_HEIGHT;
     
        clipsLeft[ 2 ].x = CAT_WIDTH * 2;
        clipsLeft[ 2 ].y = CAT_HEIGHT;
        clipsLeft[ 2 ].w = CAT_WIDTH;
        clipsLeft[ 2 ].h = CAT_HEIGHT;
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
        image = IMG_Load("cat.png");
     
        while(continuer)
        {
    SDL_GetTicks();
          while(SDL_PollEvent(&event))
          {
          switch(event.type)
          {
          case SDL_QUIT:
          continuer=0;
          break;
     
          case SDL_KEYDOWN:
     
          {
           switch(event.key.keysym.sym)
          case SDLK_RIGHT:
          sprite.vitesse+= CAT_WIDTH/4;
          break;
          case SDLK_LEFT:
          sprite.vitesse-= CAT_WIDTH/4;
          break;
          default: break;
          }
     
          case SDL_KEYUP:
     
          {
          switch(event.key.keysym.sym)
          case SDLK_RIGHT:
          sprite.vitesse-= CAT_WIDTH/4;
          break;
          case SDLK_LEFT:
          sprite.vitesse+= CAT_WIDTH/4;
          break;
          }
          }
    }
    SDL_FillRect(ecran,&ecran->clip_rect,SDL_MapRGB(ecran->format,255,255,255));
     
    //affichage de cat sur l'ecran
     
    //Mouvement
        sprite.offset += sprite.vitesse;
     
        //On garde le personnage dans les limites de la fenêtre SDL
        if( sprite.vitesse < 0 )
        {
            sprite.offset= 0;
        }
        if( sprite.vitesse + CAT_WIDTH > SCREEN_WIDTH )
        {
            sprite.vitesse= SCREEN_WIDTH - CAT_WIDTH;
        }
        //Si Cat bouge à gauche
        if( sprite.vitesse < 0 )
        {
            //On prend le personnage de profil gauche
            sprite.status = CAT_LEFT;
    if( sprite.frame >= 3 )
        {
            sprite.frame = 0;
        }
            //On bouge à la prochaine image de l'animation
            sprite.frame++;
        }
        //Si Cat bouge à droite
        else if( sprite.vitesse> 0 )
        {
            //On prend le personnage de profil droit
            sprite.status = CAT_RIGHT;
     
            if( sprite.frame >= 3 )
        {
            sprite.frame = 0;
        }
     
            //On bouge à la prochaine image de l'animation
            sprite.frame++;
        }
        //Si Cat ne bouge plus
        else
        {
            //Restart the animation
            sprite.frame = 1;
        }
     
        //Affichage
        if( sprite.status == CAT_RIGHT )
        {
            apply_surface( sprite.offset, SCREEN_HEIGHT - CAT_HEIGHT, image, ecran, &clipsRight[ sprite.frame ] );
        }
        else if( sprite.status == CAT_LEFT )
        {
            apply_surface( sprite.offset, SCREEN_HEIGHT - CAT_HEIGHT, image, ecran, &clipsLeft[ sprite.frame ] );
        }
     
        //Mise a jour de l'ecran
            if( SDL_Flip( ecran) == -1 )
            {
                return 1;
            }
     
            //On rend la main tant qu'on en a pas besoin
            while( SDL_GetTicks() < 1000 / FRAMES_PER_SECOND )
            {
                //Attente...
            }
        }
        SDL_Quit();
        SDL_FreeSurface(image);
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 226
    Points : 10 188
    Points
    10 188
    Par défaut
    Bon y ' a beaucoup de chose a dire niveau code , le premier indentation.
    Pour répondre a ton souci quelque printf t'aurais permis de savoir ou est le souci j'ai compiler et la position de ton cat et de x:0 et y:515 , du coup le code marche mais ton chat est hors de écran.

    Après il y a plein de petit détails , plutôt mal pensé , pour CAT_RIGHT , c'est une variable donc on évite les majuscules.
    "SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);" , 32 est inutile ici 24 me semble plus approprié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    clipsLeft[ 1 ].x = CAT_WIDTH;
        clipsLeft[ 1 ].y = CAT_HEIGHT;
        clipsLeft[ 1 ].w = CAT_WIDTH;
        clipsLeft[ 1 ].h = CAT_HEIGHT;
    Tu pourrais créer une fonction du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    clipsLeft[ 1 ] = SDL_rectangle(CAT_WIDTH, CAT_HEIGHT,CAT_WIDTH,CAT_HEIGHT);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while( SDL_GetTicks() < 1000 / FRAMES_PER_SECOND )
            {
                //Attente...
            }
    boucle infinie pour gérer des fps bof , je le déconseille perso.

    Je trouve apply_surface mal penser comme fonction , surtout que son utilisation est assez lourde.

Discussions similaires

  1. [Turbo Pascal] Unité Vbe2Games : Gestion des sprites et des animations avec l'unité Vbe2
    Par Eric Sigoillot dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 07/04/2014, 21h24
  2. Gestion des Sprites
    Par FCDB dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 02/01/2009, 11h00
  3. [ Question ] Animer des sprites 3D
    Par Dam)rpgheaven dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/07/2004, 16h14
  4. Animer des personnages 3D
    Par mat.M dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 11h28

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