LaunchCircle.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "LaunchCircle.h"
  2. #include <cmath>
  3. LaunchCircle::LaunchCircle(int const rayon, Uint32 const couleur, int const stock)
  4. :m_rayon(rayon),m_epaisseur(40),m_stock(stock)
  5. {
  6. m_pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 16,0,0,0,0);
  7. SDL_FillRect(m_pixel,NULL,couleur);
  8. }
  9. LaunchCircle::LaunchCircle(int const rayon, Uint32 const couleur, int const stock, int const epaisseur)
  10. :m_rayon(rayon),m_epaisseur(epaisseur),m_stock(stock)
  11. {
  12. m_pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 16,0,0,0,0);
  13. SDL_FillRect(m_pixel,NULL,couleur);
  14. }
  15. LaunchCircle::~LaunchCircle()
  16. {
  17. SDL_FreeSurface(m_pixel);
  18. }
  19. void LaunchCircle::afficher(int const x, int const y, int const valeur, SDL_Surface *screen)
  20. {
  21. // [1] Création du % puis transformation en radians
  22. double radian((double)valeur/m_stock*2*M_PI);//Entre 0 et 2PI
  23. radian -= M_PI_2;//Entre -PI/2 et 3PI/2
  24. // [2] Création de l'équation de droite
  25. double m(0);
  26. double p(0);
  27. m = (sin(radian))/(cos(radian));//En gros c'est ça
  28. p = -(m*x)+y;//ça c'est fait
  29. // [3] Trace
  30. SDL_Rect position;
  31. for (int i(x-m_rayon); i<=x+m_rayon; i++)
  32. {
  33. for (int j(y-m_rayon); j<=y+m_rayon; j++)
  34. {
  35. if ((i-x)*(i-x)+(j-y)*(j-y)<m_rayon*m_rayon &&
  36. (i-x)*(i-x)+(j-y)*(j-y)>m_rayon*m_rayon-m_epaisseur*m_epaisseur)
  37. {
  38. position.x=i;
  39. position.y=j;
  40. if (radian <=-M_PI_2)
  41. {}
  42. else if (radian >= 3*M_PI_2)//Cercle entier
  43. {
  44. SDL_BlitSurface(m_pixel, 0, screen, &position);
  45. }
  46. else if (radian == M_PI_2)//Demi cercle
  47. {
  48. if (i<=x)
  49. SDL_BlitSurface(m_pixel, 0, screen, &position);
  50. }
  51. else if (radian < M_PI_2)//Moins d'une moitié
  52. {
  53. if (i<=x && j>m*i+p)
  54. {
  55. SDL_BlitSurface(m_pixel, 0, screen, &position);
  56. }
  57. }
  58. else if (radian > M_PI_2)//Plus d'une moitié
  59. {
  60. if (i<=x)
  61. {
  62. SDL_BlitSurface(m_pixel, 0, screen, &position);
  63. }
  64. else if (j<m*i+p)
  65. {
  66. SDL_BlitSurface(m_pixel, 0, screen, &position);
  67. }
  68. }
  69. }
  70. }
  71. }
  72. }