[C] Problème bizarre avec la SDL
Dernière réponse : dans Programmation
Bonjour
Je programme en C avec la lib SDL et j'ai pu remarquer qu'elle ne permettait pas (à l'inverse de GTK+ et de WinAPI) la création d'interface graphique avec des boutons, des cases à cochers, des entrées pour le texte, des ascenseurs, des petites flèches, des menus déroulants. (En fait si elle le permet, mais c'est long, compliqué et répétitif) C'est pourquoi j'ai eu l'idée de créer une bibliothèque de fonction qu'on "ajouterai" à la SDL pour qu'on puisse utiliser toutes ces choses facilement. BCIR (Bibliothèque pour Creation d'Interface Rapide)
Donc j'ai commencé à coder. Voilà mon code:
BCIR.c
BCIR.h
Le problème c'est que quand je compile et que je "passe" la souris sur le bouton,
le son "survole.WAV" ne se lance pas.
Je n'ai pas trouvé d'erreurs dans mon code, donc si quelqu'un trouve une quelconque erreur ou quelque chose qui puisse m'aider, poster SVP.
Merci d'avance.
Je programme en C avec la lib SDL et j'ai pu remarquer qu'elle ne permettait pas (à l'inverse de GTK+ et de WinAPI) la création d'interface graphique avec des boutons, des cases à cochers, des entrées pour le texte, des ascenseurs, des petites flèches, des menus déroulants. (En fait si elle le permet, mais c'est long, compliqué et répétitif) C'est pourquoi j'ai eu l'idée de créer une bibliothèque de fonction qu'on "ajouterai" à la SDL pour qu'on puisse utiliser toutes ces choses facilement. BCIR (Bibliothèque pour Creation d'Interface Rapide)
Donc j'ai commencé à coder. Voilà mon code:
BCIR.c
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <FMOD/fmod.h>
#include <SDL/SDL_ttf.h>
#include <string.h>
#include "BCIR.h"
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL;
SDL_Event event; /* La variable contenant l'évènement */
int continuer = 1; /* Notre booléen pour la boucle */
BCIR_BUTTON bouton_ok;
bouton_ok.pos.x=100;
bouton_ok.pos.y=100;
SDL_Init(SDL_INIT_VIDEO);
FSOUND_Init(44100, 32, 0);
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("SDL app", NULL);
BCIR_loadButton (&bouton_ok,"button1.gif","button2.gif","button3.gif","clik.WAV","survole.WAV");
while (continuer) /* TANT QUE la variable ne vaut pas 0 */
{
SDL_WaitEvent(&event); /* On attend un évènement qu'on récupère dans event */
switch(event.type) /* On teste le type d'évènement */
{
case SDL_QUIT: /* Si c'est un évènement QUITTER */
continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
break;
}
BCIR_showButton (&bouton_ok,ecran,event);
SDL_Flip(ecran);
}
BCIR_freeButton (&bouton_ok);
FSOUND_Close();
SDL_Quit();
return EXIT_SUCCESS;
}
int BCIR_showButton (BCIR_BUTTON* button, SDL_Surface* screen, SDL_Event event)
{
//Si on a cliqué ...
if (event.type == SDL_MOUSEBUTTONDOWN)
{
//... dans le bouton
if (event.button.x > button->pos.x && event.button.y > button->pos.y && event.button.x < button->pos.x + button->button[3]->w && event.button.y < button->pos.y + button->button[3]->h)
{
SDL_BlitSurface(button->button[3], NULL, screen, &button->pos);
SDL_Flip(screen);
FSOUND_PlaySound(FSOUND_FREE,button->clik);
sleep(button->time);
return MOUSE_CLIK;
}
}
//Si la souris est ...
if (event.type == SDL_MOUSEMOTION)
{
//... dans le bouton
if (event.motion.x > button->pos.x && event.motion.y > button->pos.y && event.motion.x < button->pos.x + button->button[3]->w && event.motion.y < button->pos.y + button->button[3]->h)
{
button->minto++;
SDL_BlitSurface(button->button[2], NULL, screen, &button->pos);
//Si on est rentré dans le bouton et qu'avant on était "dehors"
if (button->minto == 1)
{
FSOUND_PlaySound(FSOUND_FREE,button->into);//Ici bug, le son ne se lance pas
}
if (button->minto == 4)
{button->minto = 2;}
return MOUSE_IN;
}
}
button->minto=0;
SDL_BlitSurface(button->button[1], NULL, screen, &button->pos);
return 0;
}
void BCIR_setTimeButton (BCIR_BUTTON* button, int time)
{
button->time = time;
}
int BCIR_loadButton (BCIR_BUTTON* button, char* str_img1, char* str_img2, char* str_img3, char* str_clik, char* str_into)
{
memset(button,0,sizeof(button));
button->minto = 0;
button->time = 250;
button->into = FSOUND_Sample_Load(FSOUND_FREE,str_into, 0, 0, 0);
button->clik = FSOUND_Sample_Load(FSOUND_FREE,str_clik, 0, 0, 0);
button->button[1] = IMG_Load (str_img1);
button->button[2] = IMG_Load (str_img2);
button->button[3] = IMG_Load (str_img3);
if ( button->clik == NULL ||
button->into == NULL ||
button->button[1] == NULL ||
button->button[2] == NULL ||
button->button[3] == NULL)
{
return ERROR;
}
else
{
return OK;
}
}
void BCIR_freeButton (BCIR_BUTTON* button)
{
FSOUND_Sample_Free(button->clik);
FSOUND_Sample_Free(button->into);
SDL_FreeSurface(button->button[1]);
SDL_FreeSurface(button->button[2]);
SDL_FreeSurface(button->button[3]);
}
BCIR.h
#define OK 0
#define ERROR 1
#define MOUSE_IN 2
#define MOUSE_CLIK 3
#define NO_SOUND "nosound.wav" /*Si on ne veut pas de son quand on survole le bouton, on envoi à BCIR_loadButton la define NO_SOUND, qui indiquera le fichier nosound.wav, qui est en fait un fichier "son" qui produit en fait du silence lol */
typedef struct BCIR_BUTTON BCIR_BUTTON;
struct BCIR_BUTTON
{
SDL_Surface* button [3];
FSOUND_SAMPLE* into;
FSOUND_SAMPLE* clik;
SDL_Rect pos;
int minto;
int time;
};
int BCIR_loadButton (BCIR_BUTTON* button, char* str_img1, char* str_img2, char* str_img3, char* str_clik, char* str_into);
void BCIR_freeButton (BCIR_BUTTON* button);
int BCIR_showButton (BCIR_BUTTON* button, SDL_Surface* screen, SDL_Event event);
void BCIR_setTimeButton (BCIR_BUTTON* button, int time);
Le problème c'est que quand je compile et que je "passe" la souris sur le bouton,
le son "survole.WAV" ne se lance pas.
Je n'ai pas trouvé d'erreurs dans mon code, donc si quelqu'un trouve une quelconque erreur ou quelque chose qui puisse m'aider, poster SVP.
Merci d'avance.
Autres pages sur : probleme bizarre sdl
Lassé par la pub ? Créez un compte
A tu regardé si ta condition minto == 1 était vérifié ?, d'ailleurs je n'ai pas très bien compris a quoi elle servait.. Si tu pouvais m'éclairé..
Pasque, tu cherche le bouton et tu mes minto a 0, dès que la sourie entre dans le champ du bouton tu l'incrémente ? et ensuite tu teste si elle est a un sa serait pas mieux de mettre un boolean?
SI on entre dans le champs du bouton FAIRE
FSOUND_PlaySound(FSOUND_FREE,button->into);
FINSI
Je hais le C, c'est le code le plus illisible que j'ai jamais vu... Et on appelle sa "puissant" laissé moi rire... !
Pasque, tu cherche le bouton et tu mes minto a 0, dès que la sourie entre dans le champ du bouton tu l'incrémente ? et ensuite tu teste si elle est a un sa serait pas mieux de mettre un boolean?
SI on entre dans le champs du bouton FAIRE
FSOUND_PlaySound(FSOUND_FREE,button->into);
FINSI
Je hais le C, c'est le code le plus illisible que j'ai jamais vu... Et on appelle sa "puissant" laissé moi rire... !
En fait, tant que le curseur est dans le bouton, minto s'incrémente(pour pas que ca dépasse la mémoire je fais une condition qui dit, si minto s'incrémente jusqu'à 4 il revient à 2, comme ça minto ne peut pas être égal à un trop grand nombre).Vu qu'à la base il est à 0, si c'est la première fois qu'il est dans le bouton, minto s'incrémente donc est égal à 1: je fais une condition qui dit si minto = 1 alors on joue le son du clik. Si le curseur ressort, on met minto à 0, donc la prochaine fois qu'on entrera dans le bouton on entendra le son du clik.
Eh oui je code un peu à la barbare ...
Eh oui je code un peu à la barbare ...
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumC fuite de memoire sdl ttf
- ForumProbleme installation sdl image.h
- ForumProbleme d'installation de la sdl
- ForumSdl en c
- ForumCompilation c avec sdl probleme.
- ForumSdl probleme pour utiliser sdl ttf
- articlesProbleme code block et sdl windows 7
- ForumProbleme sdl ttf
- ForumProbleme sdl
- ForumSdl probleme affichage
- Voir plus