Votre question

[C] Problème bizarre avec la SDL

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
29 Mai 2010 11:18:49

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
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. #include <SDL/SDL_image.h>
  5. #include <FMOD/fmod.h>
  6. #include <SDL/SDL_ttf.h>
  7. #include <string.h>
  8. #include "BCIR.h"
  9.  
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13. SDL_Surface *ecran = NULL;
  14. SDL_Event event; /* La variable contenant l'évènement */
  15. int continuer = 1; /* Notre booléen pour la boucle */
  16. BCIR_BUTTON bouton_ok;
  17. bouton_ok.pos.x=100;
  18. bouton_ok.pos.y=100;
  19.  
  20.  
  21. SDL_Init(SDL_INIT_VIDEO);
  22. FSOUND_Init(44100, 32, 0);
  23.  
  24. ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
  25. SDL_WM_SetCaption("SDL app", NULL);
  26.  
  27. BCIR_loadButton (&bouton_ok,"button1.gif","button2.gif","button3.gif","clik.WAV","survole.WAV");
  28.  
  29. while (continuer) /* TANT QUE la variable ne vaut pas 0 */
  30. {
  31. SDL_WaitEvent(&event); /* On attend un évènement qu'on récupère dans event */
  32. switch(event.type) /* On teste le type d'évènement */
  33. {
  34. case SDL_QUIT: /* Si c'est un évènement QUITTER */
  35. continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
  36. break;
  37. }
  38. BCIR_showButton (&bouton_ok,ecran,event);
  39. SDL_Flip(ecran);
  40. }
  41.  
  42. BCIR_freeButton (&bouton_ok);
  43. FSOUND_Close();
  44. SDL_Quit();
  45.  
  46. return EXIT_SUCCESS;
  47. }
  48.  
  49. int BCIR_showButton (BCIR_BUTTON* button, SDL_Surface* screen, SDL_Event event)
  50. {
  51. //Si on a cliqué ...
  52. if (event.type == SDL_MOUSEBUTTONDOWN)
  53. {
  54. //... dans le bouton
  55. 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)
  56. {
  57. SDL_BlitSurface(button->button[3], NULL, screen, &button->pos);
  58. SDL_Flip(screen);
  59. FSOUND_PlaySound(FSOUND_FREE,button->clik);
  60. sleep(button->time);
  61. return MOUSE_CLIK;
  62. }
  63.  
  64. }
  65. //Si la souris est ...
  66. if (event.type == SDL_MOUSEMOTION)
  67. {
  68. //... dans le bouton
  69. 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)
  70. {
  71. button->minto++;
  72. SDL_BlitSurface(button->button[2], NULL, screen, &button->pos);
  73.  
  74. //Si on est rentré dans le bouton et qu'avant on était "dehors"
  75. if (button->minto == 1)
  76. {
  77. FSOUND_PlaySound(FSOUND_FREE,button->into);//Ici bug, le son ne se lance pas
  78. }
  79. if (button->minto == 4)
  80. {button->minto = 2;}
  81. return MOUSE_IN;
  82. }
  83. }
  84. button->minto=0;
  85. SDL_BlitSurface(button->button[1], NULL, screen, &button->pos);
  86. return 0;
  87.  
  88.  
  89.  
  90. }
  91.  
  92. void BCIR_setTimeButton (BCIR_BUTTON* button, int time)
  93. {
  94. button->time = time;
  95. }
  96.  
  97. int BCIR_loadButton (BCIR_BUTTON* button, char* str_img1, char* str_img2, char* str_img3, char* str_clik, char* str_into)
  98. {
  99. memset(button,0,sizeof(button));
  100. button->minto = 0;
  101. button->time = 250;
  102. button->into = FSOUND_Sample_Load(FSOUND_FREE,str_into, 0, 0, 0);
  103. button->clik = FSOUND_Sample_Load(FSOUND_FREE,str_clik, 0, 0, 0);
  104. button->button[1] = IMG_Load (str_img1);
  105. button->button[2] = IMG_Load (str_img2);
  106. button->button[3] = IMG_Load (str_img3);
  107.  
  108. if ( button->clik == NULL ||
  109. button->into == NULL ||
  110. button->button[1] == NULL ||
  111. button->button[2] == NULL ||
  112. button->button[3] == NULL)
  113. {
  114. return ERROR;
  115. }
  116. else
  117. {
  118. return OK;
  119. }
  120. }
  121.  
  122.  
  123.  
  124. void BCIR_freeButton (BCIR_BUTTON* button)
  125. {
  126. FSOUND_Sample_Free(button->clik);
  127. FSOUND_Sample_Free(button->into);
  128. SDL_FreeSurface(button->button[1]);
  129. SDL_FreeSurface(button->button[2]);
  130. SDL_FreeSurface(button->button[3]);
  131. }



BCIR.h

  1. #define OK 0
  2. #define ERROR 1
  3. #define MOUSE_IN 2
  4. #define MOUSE_CLIK 3
  5. #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 */
  6.  
  7.  
  8. typedef struct BCIR_BUTTON BCIR_BUTTON;
  9. struct BCIR_BUTTON
  10. {
  11. SDL_Surface* button [3];
  12. FSOUND_SAMPLE* into;
  13. FSOUND_SAMPLE* clik;
  14. SDL_Rect pos;
  15. int minto;
  16. int time;
  17. };
  18. int BCIR_loadButton (BCIR_BUTTON* button, char* str_img1, char* str_img2, char* str_img3, char* str_clik, char* str_into);
  19. void BCIR_freeButton (BCIR_BUTTON* button);
  20. int BCIR_showButton (BCIR_BUTTON* button, SDL_Surface* screen, SDL_Event event);
  21. 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

Contenus similaires
31 Mai 2010 21:13:53

Pourquoi personne ne réponds ? :pfff:  :cry:  :sweat: 
m
0
l
1 Juin 2010 00:56:41

Bonsoir,
Ton problème viens peut être du chargement de ton sample, a tu essayer de faire un playsound avec un autre sample ?.
Est- ce que le sample "clik.WAV" se joue aussi ?
Sinon fouille du coté de FMOD l'erreur viens de la est surement pas de SDL comme tu là écrit dans ton titre.

Bon courage !
m
0
l
1 Juin 2010 18:09:00

clik.WAV se joue oui, mais pas survole.WAV
J'ai essayé de faire un playsound avec un autre sample, mais ca ne marche pas
m
0
l
1 Juin 2010 21:03:18

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... !
m
0
l
1 Juin 2010 21:33:45

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 ...
m
0
l
1 Juin 2010 23:44:12

Bonsoir, a tu vérifié que la condition était vérifié au moins une fois ?
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS