Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme Animation SDL

Sujet résolu
    14 mai 2006 à 14:51:29

    Bonjour, je cherche à faire une petite animation (c'est pour faire un petit RPG 2D ;) ) et trouvé un moyen de le faire grâce au cours : Maitrisez le temps !
    Voici le listing :

    /* constantes.h */

    #ifndef DEF_CONSTANTES
    #define DEF_CONSTANTES
       
        #define TAILLE_BLOC        32
        #define NB_BLOCS_LARGEUR   3
        #define NB_BLOCS_HAUTEUR   4
        #define LARGEUR_FENETRE    TAILLE_BLOC * NB_BLOCS_LARGEUR
        #define HAUTEUR_FENETRE    TAILLE_BLOC * NB_BLOCS_HAUTEUR
       
    #endif


    /* AnimationEau.c */

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constantes.h"

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran=NULL, *animWater[4]={NULL}; /* c'est une animation avec 4 frames */
        SDL_Rect positionAnimWater;
        SDL_Event event;
        int continuer=1, i, numeroImage=0;
        int tempsActuel=0, tempsPrecedent=0;
       
        /* Initialisation */
        SDL_Init(SDL_INIT_VIDEO);
       
        /* Chargement ecran */
        ecran = SDL_SetVideoMode(2*LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE);
                /* J'ai mis 2*LARGEUR_FENETRE parce que sinon la fenetre est trop petite */
                /* et ça fait un bug sur le coté droit de l'animation*/
        SDL_WM_SetCaption("Animation eau",NULL);
       
        /* Chargement de AnimWater */
        animWater[0] = IMG_Load("water0.png");          /* IL EST ICI MON PROBLEME! */
        animWater[1] = IMG_Load("water1.png");          /* IMAGINONS QUE JE VEUILLE */
        animWater[2] = IMG_Load("water2.png");          /* FAIRE UN ANIMATION AVEC  */
        animWater[3] = IMG_Load("water3.png");          /* 50 FRAMES !!! */
        positionAnimWater.x = 0;
        positionAnimWater.y = 0;
               
        /* evennement */
        while(continuer)
        {
            SDL_PollEvent(&event); /* Pour ne pas bloquer le programme */
            switch(event.type)
            {
                case SDL_QUIT:
                     continuer = 0;
                     break;
                case SDL_KEYDOWN:
                     switch(event.key.keysym.sym)
                     {
                         case SDLK_ESCAPE:
                              continuer = 0;
                              break;
                     }
                     break;
            }

            /* tempo de 250ms entre les différentes frames */
            tempsActuel = SDL_GetTicks();
            if(tempsActuel - tempsPrecedent > 250)
            {
                if(numeroImage<3)
                    numeroImage++;
                else numeroImage = 0;
                tempsPrecedent = tempsActuel;
            }
            else /* Si ça fait moins de 250ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
            {
                SDL_Delay(250 - (tempsActuel - tempsPrecedent));
            }
                   
            /* Raffraichissement des données */
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
            SDL_BlitSurface(animWater[numeroImage],NULL,ecran,&positionAnimWater);
           
            SDL_Flip(ecran);
           
        }
       
        /* Liberation memoire */
        for(i=0;i<=3;i++)
        {
            SDL_FreeSurface(animWater[i]);
        }
       
        SDL_Quit();
        return EXIT_SUCCESS;
                     
    }


    Voici les images (c'est tiré de la bibliothèque de RPG MAKER XP) :
    Image Source que je n'utilise pas dans le programme car je sais pas comment on fait pour prendre un partie de l'image
    Je l'ai donc découper avec Photoshop:
    water0.png
    water1.png
    water2.png
    water3.png


    Mon problème : si j'ai envie de faire une animation avec 50 frames ou voir plus, ça veut dire que je doit faire plus de 50 IMG_Load("image",NULL) ???
    Il doit y avoir un autre moyen mais je sais pas comment faire et ça me serais très utile.
    Comment on fait? o_O

    J'aurais peut-être un solution : Prendre l'image source et selectionner uniquement la partie qui sert pour la frame 1 et après on selectionne une autre partie pour la frame 2 etc...
    Mais la c'est pareil, je sais pas comment on fait...

    Help ! :D

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2006 à 14:53:28

      Utilise la balise C et pas <citation auteur="Code C"> :D
      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2006 à 14:54:36

        deja si animwater doit contenir 4 images tu dois ecrire *animWater[4]={NULL};
        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui ne nous tue pas, nous rend beaucoup moins mort - David TMX
          14 mai 2006 à 14:59:04

          Oui mais je prend en compte animWater[0] jusqu'à animWater[3] donc ça fait 4 case je pense. non?
          • Partager sur Facebook
          • Partager sur Twitter
            14 mai 2006 à 14:59:56

            oui mai kan tu declare un tableau, le chiffre entre crochet indique le nombre de cases
            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui ne nous tue pas, nous rend beaucoup moins mort - David TMX
              14 mai 2006 à 15:01:30

              A ok d'accord. Je modifie :p
              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2006 à 15:16:39

                sinon pour ton probleme
                ce que je ferais c'est que si tes images possedent bien toutes le meme nom avec la meme extension (water0.jpg ... water49.jpg)

                char nom[50];
                char nombre[5];
                char extension[10];
                char fichier[100]; //chaine qui contiendra le nom complet

                strcpy(nom,"water");
                strcpy(extension,".jpg")

                for(int i = 0; i < 50; i++)
                {
                  sprintf(nombre,"%d",i); // conversion entier en chaine de caractere
                  strcat(fichier,nom);
                  strcat(fichier,nombre);
                  strcat(fichier,extension);

                  animWater[i] = IMG_Load(fichier);
                }



                normalement ceci devrait marché (je te le garanti pas^^)

                EDIT : penser a inclure <string.h>
                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui ne nous tue pas, nous rend beaucoup moins mort - David TMX
                  14 mai 2006 à 15:59:21

                  J' ai intégré ce code dans mon listing et tout ce que ça fait, c'est d'ouvrir un fenêtre vide (pourtant syntaxiquement, c'est bien une solution à mon problème).
                  J'ai l'impression que ça fait quelque chose comme un boucle infinie mais il n'y en a pas dans ton code.
                  Comprend pas

                  searching... :p

                  (note : il manque un ; à la ligne 7)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mai 2006 à 16:08:11

                    oula, je vois pa trop ce qui se passe ^^
                    remet ton code complet ici pour voir
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Ce qui ne nous tue pas, nous rend beaucoup moins mort - David TMX
                      14 mai 2006 à 16:14:18

                      /*
                      animationEau.c
                      **************

                      Par KaphiSo
                      14.05.2006

                      objectif : animer une image
                      */


                      #include <stdlib.h>
                      #include <stdio.h>
                      #include <SDL/SDL.h>
                      #include <SDL/SDL_image.h>
                      #include <string.h>

                      #include "constantes.h"

                      int main(int argc, char *argv[])
                      {
                          SDL_Surface *ecran=NULL, *animWater[4]={NULL}; /* c'est une animation avec 4 frames */
                          SDL_Rect positionAnimWater;
                          SDL_Event event;
                          int continuer=1, i, j, numeroImage=0;
                          int tempsActuel=0, tempsPrecedent=0;
                          char nom[50], nombre[5], extension[10], fichier[100];
                         
                          /* Initialisation */
                          SDL_Init(SDL_INIT_VIDEO);
                         
                          /* Chargement ecran */
                          ecran = SDL_SetVideoMode(2*LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE);
                                  /* J'ai mis 2*LARGEUR_FENETRE parce que sinon la fenetre est trop petite */
                                  /* et ça fait un bug sur le coté droit de l'animation*/
                          SDL_WM_SetCaption("Animation eau",NULL);
                         
                          /* Chargement de AnimWater */
                          strcpy(nom,"water");
                          strcpy(extension,".png");

                          for(j = 0; j <= 3; j++)
                          {
                            sprintf(nombre,"%d",j); /* conversion entier en chaine de caractere*/
                       
                            strcat(fichier,nom);
                            strcat(fichier,nombre);
                            strcat(fichier,extension);

                            animWater[j] = IMG_Load(fichier);
                          }
                           
                          positionAnimWater.x = 0;
                          positionAnimWater.y = 0;
                                 
                          /* evennement */
                          while(continuer)
                          {
                              SDL_PollEvent(&event); /* Pour ne pas bloquer le programme */
                              switch(event.type)
                              {
                                  case SDL_QUIT:
                                       continuer = 0;
                                       break;
                                  case SDL_KEYDOWN:
                                       switch(event.key.keysym.sym)
                                       {
                                           case SDLK_ESCAPE:
                                                continuer = 0;
                                                break;
                                       }
                                       break;
                              }


                                     
                              /* Raffraichissement des données */
                              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
                              SDL_BlitSurface(animWater[0],NULL,ecran,&positionAnimWater);
                             
                              SDL_Flip(ecran);
                             
                          }
                         
                          /* Liberation memoire */
                          for(i=0;i<=3;i++)
                          {
                              SDL_FreeSurface(animWater[i]);
                          }
                         
                          SDL_Quit();
                          return EXIT_SUCCESS;
                                       
                      }


                      Mes images sont au format png donc j'ai changé l'extension :)

                      Petite question :D : on a le droit d'écrire IMG_Load(fichier) ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 mai 2006 à 16:40:21

                        Citation : ErOBaKa

                        char nom[50];
                        char nombre[5];
                        char extension[10];
                        char fichier[100]; //chaine qui contiendra le nom complet

                        strcpy(nom,"water");
                        strcpy(extension,".jpg")

                        for(int i = 0; i < 50; i++)
                        {
                          sprintf(nombre,"%d",i); // conversion entier en chaine de caractere
                          strcat(fichier,nom);
                          strcat(fichier,nombre);
                          strcat(fichier,extension);

                          animWater[i] = IMG_Load(fichier);
                        }



                        Tu utilises sprintf() et 3 fois strcat, alors que justement sprintf() est là pour permettre d'éliminer tous ces strcat. Sinon, tu peux utiliser directement les chaines constantes "water" par exemple, sans avoir à les copier où que ce soit (c'est même complètement débile !).
                        Plutôt ça, non ?
                        char filename[128];
                        int i=0;
                        for(;i<50;i++)
                        {
                            sprintf(filename,"water%d.jpg",i);
                            animWater[i] = IMG_Load(filename);
                        }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 mai 2006 à 16:54:58

                          lol remram44 effectivement c plus simple :p
                          sinon g trouver d'ou venait le probleme,
                          a chaque tour de boucle il faut vider fichier[] sinon les noms des fichiers sajoute a la suite xD

                          ajoute ca au debut de la boucle for
                          strcpy(fichier,"");
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Ce qui ne nous tue pas, nous rend beaucoup moins mort - David TMX
                            14 mai 2006 à 17:00:45

                            Waou super les 2 méthodes marchent !
                            Je vais pouvoir continuer mon jeu :p
                            Merci beaucoup !
                            :D:D:D

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Probleme Animation SDL

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown