|
@@ -0,0 +1,155 @@
|
|
|
+#include <iostream>
|
|
|
+#include <SDL.h>
|
|
|
+
|
|
|
+#include <ctime>
|
|
|
+#include <cstdlib>
|
|
|
+
|
|
|
+#include <deque>
|
|
|
+
|
|
|
+#include "Coordonnee.h"
|
|
|
+#include "FeuFolet.h"
|
|
|
+
|
|
|
+using namespace std;
|
|
|
+
|
|
|
+int main ( int argc, char** argv )
|
|
|
+{
|
|
|
+ /// [1] Démarrage
|
|
|
+ // [1.1] Démarrages SDL
|
|
|
+ if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
|
|
|
+ {
|
|
|
+ cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << endl;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // [1.2] Préparation de fermeture
|
|
|
+ atexit(SDL_Quit);
|
|
|
+
|
|
|
+ // [1.3] Para-fenêtre
|
|
|
+ SDL_WM_SetCaption("Application SDL", 0);
|
|
|
+
|
|
|
+ /// [2] Préparation des composants
|
|
|
+ // [2.1] Préparation de la fenêtre
|
|
|
+ int largeur(640);
|
|
|
+ int hauteur(480);
|
|
|
+ SDL_Surface* screen = SDL_SetVideoMode(largeur, hauteur, 32,
|
|
|
+ SDL_HWSURFACE|SDL_DOUBLEBUF);
|
|
|
+ if ( !screen )
|
|
|
+ {
|
|
|
+ cout << "Unable to set 640x480 video: " << SDL_GetError() << endl;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // [2.2] Préparation
|
|
|
+ srand(time(0));
|
|
|
+ Uint32 tempsPrecedent(0);
|
|
|
+
|
|
|
+ int power(5);
|
|
|
+ int graviteY(1);
|
|
|
+ int nbPop(5);
|
|
|
+ int rayon(12);
|
|
|
+ Uint32 couleur(0);
|
|
|
+ Uint8 rouge(0);
|
|
|
+ Uint8 vert(0);
|
|
|
+ Uint8 bleu(0);
|
|
|
+
|
|
|
+ DoubleAxe saved;
|
|
|
+ DoubleAxe souris;
|
|
|
+ initialiserDbAxes(&saved);
|
|
|
+ initialiserDbAxes(&souris);
|
|
|
+
|
|
|
+ deque<DoubleAxe> precedent;
|
|
|
+ deque<DoubleAxe> maintenant;
|
|
|
+ deque<Uint32> couleurBille;
|
|
|
+
|
|
|
+ SDL_ShowCursor(SDL_DISABLE);
|
|
|
+ /// [3] Boucle principale
|
|
|
+ bool done = false;
|
|
|
+ while (!done)
|
|
|
+ {
|
|
|
+ // [3.1] Gestion évènements
|
|
|
+ SDL_Event event;
|
|
|
+ while (SDL_PollEvent(&event))
|
|
|
+ {
|
|
|
+ switch (event.type)
|
|
|
+ {
|
|
|
+ case SDL_QUIT:
|
|
|
+ done = true;
|
|
|
+ break;
|
|
|
+ case SDL_KEYDOWN:
|
|
|
+ if (event.key.keysym.sym == SDLK_ESCAPE)
|
|
|
+ done = true;
|
|
|
+ break;
|
|
|
+ case SDL_MOUSEMOTION:
|
|
|
+ souris.x = event.motion.x;
|
|
|
+ souris.y = event.motion.y;
|
|
|
+ vert = souris.x*255/largeur;
|
|
|
+ rouge = souris.y*255/hauteur;
|
|
|
+ if ((int)vert+rouge > 255)
|
|
|
+ bleu = 0;
|
|
|
+ else
|
|
|
+ bleu = 255-vert-rouge;
|
|
|
+
|
|
|
+ couleur=SDL_MapRGB(screen->format,rouge,vert,bleu);
|
|
|
+ break;
|
|
|
+ } // end switch event type
|
|
|
+ } // end of message processing
|
|
|
+
|
|
|
+ // [3.2] Calculs
|
|
|
+ //Ajout des nouveaux feux
|
|
|
+ for (int i(0); i<nbPop; i++)
|
|
|
+ {
|
|
|
+ //Positions
|
|
|
+ maintenant.push_back(souris);//Position souris
|
|
|
+ saved.x=souris.x+(power-rand()%(power*2+1));
|
|
|
+ saved.y=souris.y/*+(power-rand()%(power*2+1))*/+power;//+power rajouté
|
|
|
+ precedent.push_back(saved);//Orientation
|
|
|
+
|
|
|
+ //Couleur
|
|
|
+ couleurBille.push_back(couleur);
|
|
|
+ }
|
|
|
+
|
|
|
+ //Deplacement
|
|
|
+ for (Uint32 i(0); i<maintenant.size(); i++)
|
|
|
+ {
|
|
|
+ saved=maintenant[i];
|
|
|
+ maintenant[i].x+=maintenant[i].x-precedent[i].x;
|
|
|
+ maintenant[i].y+=maintenant[i].y-precedent[i].y+graviteY;
|
|
|
+ precedent[i]=saved;
|
|
|
+ }
|
|
|
+ //nettoyer
|
|
|
+ while((maintenant.front().x>largeur || maintenant.front().x<0
|
|
|
+ || maintenant.front().y>hauteur || maintenant.front().y<0)
|
|
|
+ && !maintenant.empty())
|
|
|
+ {
|
|
|
+ maintenant.pop_front();
|
|
|
+ precedent.pop_front();
|
|
|
+ couleurBille.pop_front();
|
|
|
+ }
|
|
|
+
|
|
|
+ // [3.3] Dessin des composants
|
|
|
+ SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
|
|
|
+
|
|
|
+ if (!maintenant.empty())
|
|
|
+ for (Uint32 i(0); i<maintenant.size(); i++)
|
|
|
+ blitFeuFollet(screen, maintenant[i].x, maintenant[i].y, rayon, couleurBille[i], 128);
|
|
|
+
|
|
|
+ SDL_Flip(screen);
|
|
|
+
|
|
|
+ // [3.4] Gestion du temps
|
|
|
+ if (SDL_GetTicks()-tempsPrecedent > 40)
|
|
|
+ cout << "Temps de calcul trop long ! Cadence dépassée de "
|
|
|
+ <<SDL_GetTicks()-tempsPrecedent-40
|
|
|
+ <<" mili secondes." << endl;
|
|
|
+ while (40>SDL_GetTicks()-tempsPrecedent)
|
|
|
+ {
|
|
|
+ //ça bloque pendant 30 ms moins le temps de calcul
|
|
|
+ }
|
|
|
+ tempsPrecedent=SDL_GetTicks();
|
|
|
+ } //fin bcl principale
|
|
|
+
|
|
|
+ ///[4] Destruction des composants
|
|
|
+ SDL_FreeSurface(screen);
|
|
|
+
|
|
|
+ cout << "Aucune erreur détectée." << endl;
|
|
|
+ return 0;
|
|
|
+}
|