Animation C en CallBack (SDL)
Lord Shoedsackovskaïa
Messages postés
234
Statut
Membre
-
Lord Shoedsackovskaïa Messages postés 234 Statut Membre -
Lord Shoedsackovskaïa Messages postés 234 Statut Membre -
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 :
Merci d'avance pour vos réponses !
- Make me a sandwich !
- What ? Make it yourself !
- Sudo makeme a sandwich
- Okay
#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
A voir également:
- Animation C en CallBack (SDL)
- Dp animation maker - Télécharger - Animation
- Logiciel d animation 2d gratuit - Télécharger - Divers Web & Internet
- Transformer une video en dessin animé - Télécharger - Montage & Édition
- Animation paper download - Télécharger - Animation
- Logiciel animation flash - Télécharger - Animation
2 réponses
Bonjour,
Peut-être bien que :
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);
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);