main.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include <iostream>
  2. #include <SDL/SDL.h>
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include <deque>
  6. #include "Coordonnee.h"
  7. #include "FeuFolet.h"
  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. srand(time(0));
  35. Uint32 tempsPrecedent(0);
  36. int power(5);
  37. int graviteY(1);
  38. int nbPop(5);
  39. int rayon(12);
  40. Uint32 couleur(0);
  41. Uint8 rouge(0);
  42. Uint8 vert(0);
  43. Uint8 bleu(0);
  44. DoubleAxe saved;
  45. DoubleAxe souris;
  46. initialiserDbAxes(&saved);
  47. initialiserDbAxes(&souris);
  48. deque<DoubleAxe> precedent;
  49. deque<DoubleAxe> maintenant;
  50. deque<Uint32> couleurBille;
  51. SDL_ShowCursor(SDL_DISABLE);
  52. /// [3] Boucle principale
  53. bool done = false;
  54. while (!done)
  55. {
  56. // [3.1] Gestion évènements
  57. SDL_Event event;
  58. while (SDL_PollEvent(&event))
  59. {
  60. switch (event.type)
  61. {
  62. case SDL_QUIT:
  63. done = true;
  64. break;
  65. case SDL_KEYDOWN:
  66. if (event.key.keysym.sym == SDLK_ESCAPE)
  67. done = true;
  68. break;
  69. case SDL_MOUSEMOTION:
  70. souris.x = event.motion.x;
  71. souris.y = event.motion.y;
  72. vert = souris.x*255/largeur;
  73. rouge = souris.y*255/hauteur;
  74. if ((int)vert+rouge > 255)
  75. bleu = 0;
  76. else
  77. bleu = 255-vert-rouge;
  78. couleur=SDL_MapRGB(screen->format,rouge,vert,bleu);
  79. break;
  80. } // end switch event type
  81. } // end of message processing
  82. // [3.2] Calculs
  83. //Ajout des nouveaux feux
  84. for (int i(0); i<nbPop; i++)
  85. {
  86. //Positions
  87. maintenant.push_back(souris);//Position souris
  88. saved.x=souris.x+(power-rand()%(power*2+1));
  89. saved.y=souris.y/*+(power-rand()%(power*2+1))*/+power;//+power rajouté
  90. precedent.push_back(saved);//Orientation
  91. //Couleur
  92. couleurBille.push_back(couleur);
  93. }
  94. //Deplacement
  95. for (Uint32 i(0); i<maintenant.size(); i++)
  96. {
  97. saved=maintenant[i];
  98. maintenant[i].x+=maintenant[i].x-precedent[i].x;
  99. maintenant[i].y+=maintenant[i].y-precedent[i].y+graviteY;
  100. precedent[i]=saved;
  101. }
  102. //nettoyer
  103. while((maintenant.front().x>largeur || maintenant.front().x<0
  104. || maintenant.front().y>hauteur || maintenant.front().y<0)
  105. && !maintenant.empty())
  106. {
  107. maintenant.pop_front();
  108. precedent.pop_front();
  109. couleurBille.pop_front();
  110. }
  111. // [3.3] Dessin des composants
  112. SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
  113. if (!maintenant.empty())
  114. for (Uint32 i(0); i<maintenant.size(); i++)
  115. blitFeuFollet(screen, maintenant[i].x, maintenant[i].y, rayon, couleurBille[i], 128);
  116. SDL_Flip(screen);
  117. // [3.4] Gestion du temps
  118. if (SDL_GetTicks()-tempsPrecedent > 40)
  119. cout << "Temps de calcul trop long ! Cadence dépassée de "
  120. <<SDL_GetTicks()-tempsPrecedent-40
  121. <<" mili secondes." << endl;
  122. while (40>SDL_GetTicks()-tempsPrecedent)
  123. {
  124. //ça bloque pendant 30 ms moins le temps de calcul
  125. }
  126. tempsPrecedent=SDL_GetTicks();
  127. } //fin bcl principale
  128. ///[4] Destruction des composants
  129. SDL_FreeSurface(screen);
  130. cout << "Aucune erreur détectée." << endl;
  131. return 0;
  132. }