main.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include <iostream>
  2. #include <SDL/SDL.h>
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include "PluieFlamme.h"
  6. /*
  7. #include <deque>*/
  8. using namespace std;
  9. int main ( int argc, char** argv )
  10. {
  11. /// [1] Démarrage
  12. // [1.1] Démarrages SDL
  13. if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
  14. {
  15. cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << endl;
  16. return 1;
  17. }
  18. // [1.2] Préparation de fermeture
  19. atexit(SDL_Quit);
  20. // [1.3] Para-fenêtre
  21. SDL_WM_SetCaption("Application SDL", 0);
  22. /// [2] Préparation des composants
  23. // [2.1] Préparation de la fenêtre
  24. int largeur(640);
  25. int hauteur(480);
  26. SDL_Surface* screen = SDL_SetVideoMode(largeur, hauteur, 32,
  27. SDL_HWSURFACE|SDL_DOUBLEBUF);
  28. if ( !screen )
  29. {
  30. cout << "Unable to set 640x480 video: " << SDL_GetError() << endl;
  31. return 1;
  32. }
  33. // [2.2] Préparation
  34. DoubleAxe souris;
  35. Uint32 tempsPrecedent;
  36. Uint8 rouge(0);
  37. Uint8 vert(0);
  38. Uint8 bleu(0);
  39. Uint32 couleur;
  40. PluieFlamme* boum(0);
  41. int nbPop, power, rayon;
  42. float graviteY, resistance;
  43. // [2.3] Requête de parmètres
  44. cout << "Entrez les paramètres."<< endl;
  45. cout << "Nombre de particules par salve: ";
  46. cin >> nbPop;
  47. cout << "Puissance de dissipation des particules (defaut 5): ";
  48. cin >> power;
  49. cout << "Gravité (défaut 0.5): ";
  50. cin >> graviteY;
  51. cout << "Rayon des particules (défaut 12): ";
  52. cin >> rayon;
  53. cout << "Resistance de l'air (défaut 0.98): ";
  54. cin >> resistance;
  55. cout << "Démarrage du lanceur chinois." << endl;
  56. /// [3] Boucle principale
  57. bool done = false;
  58. while (!done)
  59. {
  60. // [3.1] Gestion évènements
  61. SDL_Event event;
  62. while (SDL_PollEvent(&event))
  63. {
  64. switch (event.type)
  65. {
  66. case SDL_QUIT:
  67. done = true;
  68. break;
  69. case SDL_KEYDOWN:
  70. if (event.key.keysym.sym == SDLK_ESCAPE)
  71. done = true;
  72. break;
  73. case SDL_MOUSEBUTTONDOWN:
  74. if (event.button.button==SDL_BUTTON_LEFT && boum==0)
  75. {
  76. souris.x=event.button.x;
  77. souris.y=event.button.y;
  78. boum = new PluieFlamme(souris, nbPop, power, graviteY, rayon, couleur, resistance);
  79. }
  80. break;
  81. case SDL_MOUSEMOTION:
  82. vert = event.motion.x*255/largeur;
  83. rouge = event.motion.y*255/hauteur;
  84. if ((int)vert+rouge > 255)
  85. bleu = 0;
  86. else
  87. bleu = 255-vert-rouge;
  88. couleur=SDL_MapRGB(screen->format,rouge,vert,bleu);
  89. break;
  90. } // end switch event type
  91. } // end of message processing
  92. // [3.2] Calculs
  93. //nettoyer
  94. if (boum!=0 && boum->estFini(screen))
  95. {
  96. delete boum;
  97. boum = 0;
  98. }
  99. // [3.3] Dessin des composants
  100. SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
  101. if (boum!=0)
  102. {
  103. boum->deplacement();
  104. boum->dessiner(screen);
  105. }
  106. SDL_Flip(screen);
  107. // [3.4] Gestion du temps
  108. if (SDL_GetTicks()-tempsPrecedent > 40)
  109. cout << "Temps de calcul trop long ! Cadence dépassée de "
  110. <<SDL_GetTicks()-tempsPrecedent-40
  111. <<" mili secondes." << endl;
  112. while (40>SDL_GetTicks()-tempsPrecedent)
  113. {
  114. //ça bloque pendant 30 ms moins le temps de calcul
  115. }
  116. tempsPrecedent=SDL_GetTicks();
  117. } //fin bcl principale
  118. ///[4] Destruction des composants
  119. SDL_FreeSurface(screen);
  120. if (boum!=0)
  121. delete boum;
  122. cout << "Aucune erreur détectée." << endl;
  123. return 0;
  124. }