Se connecter / S'enregistrer
Votre question

[c]Besoin d'aide pour un switch (SDL)

Tags :
  • Erreur de syntaxe
  • Programmation
Dernière réponse : dans Programmation
14 Janvier 2008 22:01:31

Bonjour

je suis en train d'étudier la librairie SDL sur le sdz mais dans un exercice j'ai un peoblème, mon switch ne fonctionne pas ^^ . le principe du code est d'afficher 3 zozor puis avec une touche on les éfface, pour ce qui est de l'affichage des 3 zozor pas de problème mais des que je met la touche j'ai des erreurs de compilation, j'aimerez savoir si mon switch est bon... et si il n'est pas bon ou est-ce que j'ai faux.

  1. switch(event.type)
  2. {
  3.  
  4. case SDL_QUIT:
  5. continuer = 0;
  6. break;
  7.  
  8. case SDL_MOUSEBUTTONUP:
  9. if (event.button.button == SDL_BUTTON_LEFT)
  10. {
  11. positionZozor[0].x = event.button.x;
  12. positionZozor[0].y = event.button.y;
  13. i = 0;
  14. }
  15.  
  16. break;
  17. case SDL_KEYDOWN:
  18. switch(event.key.keysym.sym)
  19. {
  20.  
  21. case SDLK_UP:
  22. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
  23. SDL_Flip(ecran);
  24. break;
  25. }
  26. break;
  27. }

Autres pages sur : besoin aide switch sdl

a b L Programmation
14 Janvier 2008 23:02:54

Quelles sont tes erreurs de compilation?
15 Janvier 2008 18:17:43

Voila le rapport d'érreur, je précise que je suis sous visual c++ express

Citation :
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(90) : error C2371: 'SDL_FreeSurface' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(91) : error C2371: 'SDL_FreeSurface' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl_video.h(513) : voir la déclaration de 'SDL_FreeSurface'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(92) : error C2371: 'SDL_Quit' : redéfinition ; types de base différents
1> c:\program files\microsoft visual studio 8\vc\include\sdl\sdl.h(86) : voir la déclaration de 'SDL_Quit'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(94) : error C2059: erreur de syntaxe : 'return'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\exe-sdl\exe-sdl\main.c(95) : error C2059: erreur de syntaxe : '}'


et voila le code en entier:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. int continuer = 1;
  8.  
  9. long i = 0;
  10. SDL_Surface *ecran = NULL, *zozor = NULL;
  11. SDL_Rect positionZozor[5];
  12.  
  13.  
  14. SDL_Init(SDL_INIT_VIDEO);
  15.  
  16. ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
  17. SDL_WM_SetCaption("Couleur via clavier", NULL);
  18.  
  19.  
  20. zozor = SDL_LoadBMP("zozor.bmp");
  21. SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
  22.  
  23.  
  24.  
  25. SDL_EnableKeyRepeat(10, 10);
  26.  
  27. while (continuer)
  28. {
  29.  
  30. SDL_Event event;
  31.  
  32. SDL_WaitEvent(&event);
  33.  
  34. switch(event.type)
  35. {
  36.  
  37. case SDL_QUIT:
  38. continuer = 0;
  39. break;
  40.  
  41. case SDL_MOUSEBUTTONUP:
  42. if (event.button.button == SDL_BUTTON_LEFT)
  43. {
  44. positionZozor[0].x = event.button.x;
  45. positionZozor[0].y = event.button.y;
  46. i = 0;
  47. }
  48.  
  49. break;
  50. case SDL_KEYDOWN:
  51. switch(event.key.keysym.sym)
  52. {
  53.  
  54. case SDLK_UP:
  55. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
  56. SDL_Flip(ecran);
  57. break;
  58. }
  59. break;
  60. }
  61. }
  62.  
  63. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
  64. SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[0]);
  65.  
  66.  
  67. for (i = 0; i <= 2; i++)
  68. {
  69.  
  70. positionZozor[i+1].x = positionZozor[i].x - 100;
  71. positionZozor[i+1].y = positionZozor[i].y - 100;
  72.  
  73. SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[i]);
  74.  
  75.  
  76. }
  77. SDL_Flip(ecran);
  78.  
  79.  
  80.  
  81. SDL_FreeSurface(ecran);
  82. SDL_FreeSurface(zozor);
  83. SDL_Quit();
  84.  
  85. return EXIT_SUCCESS;
  86. }


edit: il y avait une erreur de boucle mais le programme ne fonctionne toujours pas, j'ai corrigé la boucle
Contenus similaires
a b L Programmation
15 Janvier 2008 21:13:46

Au vue des messages d'erreurs, il semblerait que tu ais oublié une accolade ouvrante dans ton code, ce qui ne semble pas le cas ici (6 ouvrantes, 6 fermantes). J'imagine que c'était ton problème initial.

Quel est le problème maintenant?
15 Janvier 2008 21:16:13

Effectivement c'était mon problème initial

maintenant j'ai un joli écran noir jusqu'a que je clique sur UP ou ca devient blanc
a b L Programmation
15 Janvier 2008 21:48:23

Normal SDL_WaitEvent reste bloquée en attente d'un évènement. Quand tu appuie sur une touche, tu débloques et tu continues.
Il faut utiliser la technique de SDL_PollEvent() qui n'est pas bloquante, mais il faut gérer les sprites ce qui peut poser d'autres problèmes: http://www.infos-du-net.com/forum/261318-21-problemes

ps: dans la boucle "while" tu n'affiche pas tes "zozors", tu ne les afficheras que lorsque tu quitteras :) 
15 Janvier 2008 22:32:31

j'ai corrigé un ou deux petit truc pais j'ai encore une question,

comment faire pour éffacer ce qu'il y à l'écran, j'avais pensé faire ca:

# case SDLK_UP:
# SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255,255));
# SDL_Flip(ecran);
# break;

le problème est qu'on vois bien que l'écran change puisque les images "clignote" quelques instans mais ca n'éfface pas les zozor

comment faire pour éffacer les zozor ?
a b L Programmation
16 Janvier 2008 20:43:04

En fait avec la SDL, tu travaille en double-buffering, c'est-à-dire que ce que tu mets dans "ecran" ne s'affiche pas à l'écran, mais dans une autre zone de mémoire tampon (que j'appelle buffer). C'est SDL_Flip qui force à afficher ce qu'il y a dans le buffer.
Si l'on affichait les sprites directement à l'écran (ce qui est possible si on gère tout en assembleur par exemple), alors on voit des clignotements dues au rafraichissement de l'écran. Un écran à 60Hz rafraichit tout l'écran 60 fois par seconde. Si on y met un gros sprite au milieu de l'écran et que le rafraichissement est en cours et également au milieu de l'écran, pour une image, on aura le sprite coupé en 2.
Ceci génère des clignotements. Pour éviter ça, le double buffering permet de n'afficher à l'écran que lorsque tout est prêt dedans (en plus on se synchronise avec le balayage pour éviter le clignotement du doube-buffering).

Bref, dans ton exemple, tu fait un SDL_Flip après avoir effacé ton buffer. Donc le buffer vide est affiché à l'écran. Donc ton écran noir devient noir un court instant. C'est ce qui génère ton clignotement.

Le SDL_Flip ne doit se faire que lorsque le buffer contient tout ce qui doit être affiché à l'écran, PAS AVANT (donc, logiquement, on ne devrait voir qu'un seul SDL_Flip dans ton code) :) 
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