Animation C en CallBack (SDL)

Fermé
Lord Shoedsackovskaïa Messages postés 163 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 19 novembre 2013 - Modifié par Lord Shoedsackovskaïa le 9/02/2011 à 12:22
Lord Shoedsackovskaïa Messages postés 163 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 19 novembre 2013 - 9 févr. 2011 à 19:20
Bonjour amis internautes, j'ai un petit problème : en fait je suis en train de coder le code source du menu principal d'un programme en C avec la bibliothèque SDL. J'ai mis un fond d'écran, et je voudrais placer une animation à l'intérieur (à l'origine c'était un gif, mais je me suis aperçu que la SDL ne pouvait pas les animer, donc j'ai décomposer en plusieurs images que je voudrais blitter les unes après les autres. Mais mon code source compilé affiche le fond d'écran, mais pas l'animation. Le voici :

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

#include "main.h" 

int main ( int argc, char** argv ) 
{ 
    SDL_Surface *ecran = NULL, *backgroundMenu = NULL, *rayman = NULL;  //pointeurs sur des variables de surfaces 
    SDL_Rect positionBGMenu, positionRaymanMenu;    //variable de position des surfaces (.x et .y) 
    positionBGMenu.x = 0; 
    positionBGMenu.y = 0; 
    positionRaymanMenu.x = 0; 
    positionRaymanMenu.y = 0; 

    SDL_TimerID timer; //création d'un timer 
    timer = SDL_AddTimer(550, animerRayman, &rayman); /* Démarrage du Timer */ 


    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);  //initialisation de la SDL en mode vidéo et timer 
    ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); //options du mode vidéo (fenetré, avec double buffering et redimentionnable) 

    //chargement des sprites 
    SDL_WM_SetIcon(IMG_Load("icone.png"), NULL);    //chargement de l'icone 
    backgroundMenu = IMG_Load("menu/background.jpg"); 

    int continuer = 1; //initialisation du booléen continuer 
    SDL_Event event; //création d'un évenement 

   while (continuer) //boucle qui se termine uniquement si le joueur ferme la fenêtre 
    { 
        SDL_PollEvent(&event); //attente d'un évènement sans pour autant bloquer le programme 
        switch(event.type) //identifier l'évènement 
        { 
            case SDL_QUIT: //fermer la fenêtre 
                continuer = 0; //le booléen continuer = 0 donc fin de la boucle 
                break; 
        } 

        //blittage 
        SDL_BlitSurface(backgroundMenu, NULL, ecran, &positionBGMenu); 
        SDL_BlitSurface(rayman, NULL, ecran, &positionRaymanMenu); 

        SDL_Flip(ecran); //rafraîchissement de l'écean 
    } 
    SDL_RemoveTimer(timer); //fermeture des timers 
    SDL_FreeSurface(backgroundMenu); //déchargement du fond 
    SDL_FreeSurface(rayman); 
    SDL_Quit(); //fermeture de la SDL 

    return 0; 
} 

/* Fonction de callback (sera appelée toutes les 30ms) 
Objectif : Animer Rayman (menu principal)*/ 
Uint32 animerRayman(Uint32 intervalle, void *parametre) 
{ 
    SDL_Surface* rayman = parametre; /* Conversion de void* en SDL_Rect* */ 
    int animer = 1; 

    if (animer = 1) 
    { 
        rayman = IMG_Load("menu/rayman_menu1.gif"); 
        animer++; 
    } 
    else if (animer = 2) 
    { 
        rayman = IMG_Load("menu/rayman_menu2.gif"); 
        animer++; 
    } 
    else if (animer = 3) 
    { 
        rayman = IMG_Load("menu/rayman_menu3.gif"); 
        animer++; 
    } 
    else if (animer = 4) 
    { 
        rayman = IMG_Load("menu/rayman_menu4.gif"); 
        animer++; 
    } 
    else if (animer = 5) 
    { 
        rayman = IMG_Load("menu/rayman_menu5.gif"); 
        animer++; 
    } 
    else if (animer = 6) 
    { 
        rayman = IMG_Load("menu/rayman_menu6.gif"); 
        animer++; 
    } 
    else if (animer = 7) 
    { 
        rayman = IMG_Load("menu/rayman_menu7.gif"); 
        animer = 1; 
    } 
    return intervalle; 
} 





Merci d'avance pour vos réponses !



- Make me a sandwich !
- What ? Make it yourself !
- Sudo makeme a sandwich
- Okay

2 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
9 févr. 2011 à 14:55
Bonjour,
Peut-être bien que :
if (animer = 1) 
devrait être
if (animer == 1)  

Plutôt que de recharger l'image x fois prenez toutes les images et mettez les bout à bout dans une seule, ensuite vous n'affichez que la partie nécessaire de l'image puis vous décaler et afficher la suite etc.. en boucle. Regardez le deuxième paramètre de SDL_BlitSurface c'est pour la position (SDL_Rect) dans l'image qui est son premier paramètre.
en gros :
SDL_Surface *image;
SDL_Rect pos_screen, pos_image;
image=SDL_LoadBMP("c:\rayman.bmp");
et pour le blit vous utilisez pos_image pour vous déplacer dans l'image et afficher le rect voulu :
SDL_BlitSurface(image,&pos_image,screen,&pos_screen);
0
Lord Shoedsackovskaïa Messages postés 163 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 19 novembre 2013 13
9 févr. 2011 à 19:20
Merci pour ta réponse. Mais déjà, avant de ne blitter qu'une partie de l'image, il faudrait déjà... Que le code marche :p
J'avais effectivement oublié les ==, mais il y a autre chose qui fait que le programme n'affiche pas mon sprite.
0