Balle.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "Balle.h"
  2. Balle::Balle(int nbRqt)
  3. :m_nbRqt(nbRqt),
  4. m_point(RAYON_BALLE,BLEU), m_position(RAYON_FENETRE, RAYON_FENETRE),
  5. m_trajectoire(rand()-RAND_MAX/2, rand()-RAND_MAX/2), m_vitesse((float)VITESSE_MAX/4), m_centre(RAYON_FENETRE, RAYON_FENETRE)
  6. {
  7. //[1] Renplit le tableau de pointeurs
  8. for (int i(0); i<NB_JOUEURS_MAX; i++)
  9. m_tableauRqt[i]=0;
  10. //[2] Met la valeur de la trajectoire à 1
  11. m_trajectoire.normaliser();
  12. }///Constructeur
  13. void Balle::ajouterRaquette(unsigned int slot, Raquette *ajoutRqt)
  14. {
  15. if (slot >= 0 && slot<NB_JOUEURS_MAX)
  16. m_tableauRqt[slot] = ajoutRqt;
  17. }///ajouterRaquette
  18. bool Balle::bouger(SDL_Surface* screen)
  19. {
  20. //[1] On bouge
  21. m_position += m_trajectoire*m_vitesse;
  22. if((m_position-m_centre).norme()<=RAYON_TERRAIN)//(m_position-m_centre).norme() est égal à la distance par rapport au centre
  23. return true;
  24. else
  25. //[2] ça sort ou pas ?
  26. {
  27. //[2.1] Position sur limite
  28. m_position = m_centre+(m_position-m_centre).normalise()*(RAYON_TERRAIN-RAYON_BALLE);
  29. float angleEcart;
  30. bool droite;
  31. //[2.2] Hum... y a t'il une raquette ?
  32. for (int i(0); i<NB_JOUEURS_MAX; i++)
  33. if (m_tableauRqt[i]!=0)
  34. {
  35. angleEcart = (m_position-m_centre).scalair(m_tableauRqt[i]->getAngleActuel());
  36. Vecteur tmp(m_position-m_centre);
  37. tmp.rotate(5);
  38. droite = (tmp.scalair(m_tableauRqt[i]->getAngleActuel())<angleEcart);
  39. if (angleEcart<=ANGLE_ECART_RQT)
  40. {
  41. m_trajectoire = (m_centre-m_position).normalise();
  42. if (m_vitesse<VITESSE_MAX)
  43. m_vitesse *= ACCELERATEUR;
  44. if(droite)
  45. m_trajectoire.rotate(angleEcart/ANGLE_ECART_RQT*30);
  46. else
  47. m_trajectoire.rotate(-angleEcart/ANGLE_ECART_RQT*30);
  48. return true;
  49. }
  50. }
  51. //[2.3] Pas raquette... hors zone !
  52. camenbertPerdant(screen);
  53. m_position = m_centre;
  54. m_trajectoire = Vecteur(rand()-RAND_MAX/2, rand()-RAND_MAX/2).normalise();
  55. m_vitesse = (float)VITESSE_MAX/4;
  56. return false;
  57. }
  58. }///bouger
  59. void Balle::afficher(SDL_Surface* screen)
  60. {
  61. m_point.afficherPoint(screen,m_position.getX(),m_position.getY());
  62. }///afficher
  63. void Balle::camenbertPerdant(SDL_Surface* screen)
  64. {
  65. SDL_Surface *pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 32, 0, 0, 0, 0);
  66. SDL_FillRect(pixel,0,SDL_MapRGB(pixel->format, 255, 0, 0));
  67. SDL_Rect pos;
  68. for(int y = -RAYON_TERRAIN;y < RAYON_TERRAIN; y++)
  69. for(int x = -RAYON_TERRAIN;x < RAYON_TERRAIN; x++)
  70. {
  71. if(x*x+y*y<RAYON_TERRAIN*RAYON_TERRAIN &&
  72. ((m_nbRqt == 2 && y*((m_position.getY()-RAYON_TERRAIN<0)*2-1)<0) ||
  73. (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)) ||
  74. (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
  75. (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)))
  76. {
  77. pos.x = x+RAYON_FENETRE;
  78. pos.y = y+RAYON_FENETRE;
  79. SDL_BlitSurface(pixel, 0, screen, &pos);
  80. }
  81. }
  82. SDL_Flip(screen);
  83. SDL_Delay(200);
  84. }