123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include "Balle.h"
- Balle::Balle(int nbRqt)
- :m_nbRqt(nbRqt),
- m_point(RAYON_BALLE,BLEU), m_position(RAYON_FENETRE, RAYON_FENETRE),
- m_trajectoire(rand()-RAND_MAX/2, rand()-RAND_MAX/2), m_vitesse((float)VITESSE_MAX/4), m_centre(RAYON_FENETRE, RAYON_FENETRE)
- {
- //[1] Renplit le tableau de pointeurs
- for (int i(0); i<NB_JOUEURS_MAX; i++)
- m_tableauRqt[i]=0;
- //[2] Met la valeur de la trajectoire à 1
- m_trajectoire.normaliser();
- }///Constructeur
- void Balle::ajouterRaquette(unsigned int slot, Raquette *ajoutRqt)
- {
- if (slot >= 0 && slot<NB_JOUEURS_MAX)
- m_tableauRqt[slot] = ajoutRqt;
- }///ajouterRaquette
- bool Balle::bouger(SDL_Surface* screen)
- {
- //[1] On bouge
- m_position += m_trajectoire*m_vitesse;
- if((m_position-m_centre).norme()<=RAYON_TERRAIN)//(m_position-m_centre).norme() est égal à la distance par rapport au centre
- return true;
- else
- //[2] ça sort ou pas ?
- {
- //[2.1] Position sur limite
- m_position = m_centre+(m_position-m_centre).normalise()*(RAYON_TERRAIN-RAYON_BALLE);
- float angleEcart;
- bool droite;
- //[2.2] Hum... y a t'il une raquette ?
- for (int i(0); i<NB_JOUEURS_MAX; i++)
- if (m_tableauRqt[i]!=0)
- {
- angleEcart = (m_position-m_centre).scalair(m_tableauRqt[i]->getAngleActuel());
- Vecteur tmp(m_position-m_centre);
- tmp.rotate(5);
- droite = (tmp.scalair(m_tableauRqt[i]->getAngleActuel())<angleEcart);
- if (angleEcart<=ANGLE_ECART_RQT)
- {
- m_trajectoire = (m_centre-m_position).normalise();
- if (m_vitesse<VITESSE_MAX)
- m_vitesse *= ACCELERATEUR;
- if(droite)
- m_trajectoire.rotate(angleEcart/ANGLE_ECART_RQT*30);
- else
- m_trajectoire.rotate(-angleEcart/ANGLE_ECART_RQT*30);
- return true;
- }
- }
- //[2.3] Pas raquette... hors zone !
- camenbertPerdant(screen);
- m_position = m_centre;
- m_trajectoire = Vecteur(rand()-RAND_MAX/2, rand()-RAND_MAX/2).normalise();
- m_vitesse = (float)VITESSE_MAX/4;
- return false;
- }
- }///bouger
- void Balle::afficher(SDL_Surface* screen)
- {
- m_point.afficherPoint(screen,m_position.getX(),m_position.getY());
- }///afficher
- void Balle::camenbertPerdant(SDL_Surface* screen)
- {
- SDL_Surface *pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 32, 0, 0, 0, 0);
- SDL_FillRect(pixel,0,SDL_MapRGB(pixel->format, 255, 0, 0));
- SDL_Rect pos;
- for(int y = -RAYON_TERRAIN;y < RAYON_TERRAIN; y++)
- for(int x = -RAYON_TERRAIN;x < RAYON_TERRAIN; x++)
- {
- if(x*x+y*y<RAYON_TERRAIN*RAYON_TERRAIN &&
- ((m_nbRqt == 2 && y*((m_position.getY()-RAYON_TERRAIN<0)*2-1)<0) ||
- (m_nbRqt == 3 && ((x-(y*1.75)<0 && ((m_position.getX()-RAYON_TERRAIN)-(m_position.getY()-RAYON_TERRAIN)*1.75<0) && x+(y*1.75)>0 && ((m_position.getX()-RAYON_TERRAIN)+(m_position.getY()-RAYON_TERRAIN)*1.75>0)) ||
- (x*(m_position.getX()-RAYON_FENETRE)>0 && ((x-(y*1.75)>0 && ((m_position.getX()-RAYON_TERRAIN)-(m_position.getY()-RAYON_TERRAIN)*1.75>0) && m_position.getX()-RAYON_FENETRE>0) || (x+(y*1.75)<0 && ((m_position.getX()-RAYON_TERRAIN)+(m_position.getY()-RAYON_TERRAIN)*1.75<0) && m_position.getX()-RAYON_FENETRE<0))))) || // <- n'est pas fini
- (m_nbRqt == 4 && (x-y)*((((m_position.getX()-RAYON_TERRAIN)-(m_position.getY()-RAYON_TERRAIN))<0)*2-1)<0 && (x+y)*-((((m_position.getX()-RAYON_TERRAIN)+(m_position.getY()-RAYON_TERRAIN))<0)*2-1)>0)))
- {
- pos.x = x+RAYON_FENETRE;
- pos.y = y+RAYON_FENETRE;
- SDL_BlitSurface(pixel, 0, screen, &pos);
- }
- }
- SDL_Flip(screen);
- SDL_Delay(200);
- }
|