Se connecter avec
S'enregistrer | Connectez-vous

[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
  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

Lassé par la pub ? Créez un compte

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 !

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... !

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 ...
Lassé par la pub ? Créez un compte
Tom's guide dans le monde