Perso.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "Perso.h"
  2. Perso::Perso(SDL_Surface* srcImg, SDL_Surface* deathImg, Controler* ctrl, Tirs_Gest* tirsGest, bool allie, Armes_Gest* armGest)
  3. :Affichable(rotozoomSurface(srcImg, 90.0, 1.0, 0)),
  4. /** Vie*/ m_vieMax(100), m_vie(m_vieMax), m_disHP( m_vieMax ),
  5. /** Etat*/ m_vitesse(4.0f), m_vivant(true), m_allie(allie),
  6. /** Interactions*/ m_srcImg(srcImg), m_deathImg(deathImg), m_fullImg(0x0), m_visee(1.0f, 0.0f), m_ortho(0.0f, 17.0f), m_ctrl(ctrl), m_tirsGest(tirsGest),
  7. /** Arme*/ m_armGest( armGest ), m_arme()
  8. {
  9. // Création de l'image stockant l'apparence
  10. m_fullImg = SDL_CreateRGBSurface( SDL_HWSURFACE, m_srcImg->w, m_srcImg->h, 32, 0, 0, 0, 0);
  11. // On récupère une arme de départ
  12. m_arme[ L_HAND ] = m_armGest->startWeapon( tirsGest );
  13. m_arme[ R_HAND ] = 0x0;
  14. majFullImg();
  15. }
  16. Perso::Perso(SDL_Surface* srcImg, SDL_Surface* deathImg, Controler* ctrl, Tirs_Gest* tirsGest, bool allie, Armes_Gest* armGest, float x, float y)
  17. :Affichable(rotozoomSurface(srcImg, 90.0, 1.0, 0)),
  18. /** Vie*/ m_vieMax(100), m_vie(m_vieMax), m_disHP( m_vieMax ),
  19. /** Etat*/ m_vitesse(4.0f), m_vivant(true), m_allie(allie),
  20. /** Interactions*/ m_srcImg(srcImg), m_deathImg(deathImg), m_visee(0.0f, 0.0f), m_ctrl(ctrl), m_tirsGest(tirsGest),
  21. /** Arme*/ m_armGest( armGest ), m_arme()
  22. {
  23. // Création de l'image stockant l'apparence
  24. m_fullImg = SDL_CreateRGBSurface( SDL_HWSURFACE, m_srcImg->w, m_srcImg->h, 32, 0, 0, 0, 0);
  25. // Attribution des coordonnées du spawn
  26. m_pos.setVecteur(x, y);
  27. // On récupère une arme de départ
  28. m_arme[ L_HAND ] = m_armGest->startWeapon( tirsGest );
  29. m_arme[ R_HAND ] = 0x0;
  30. majFullImg();
  31. }
  32. Perso::~Perso()
  33. {
  34. SDL_FreeSurface(m_img);
  35. SDL_FreeSurface(m_fullImg);
  36. delete m_ctrl;
  37. if ( m_arme[ L_HAND ] != 0x0 ) delete m_arme[ L_HAND ];
  38. if ( m_arme[ R_HAND ] != 0x0 ) delete m_arme[ R_HAND ];
  39. }
  40. void Perso::bouger()
  41. {
  42. if ( !m_vivant ) return;
  43. m_ctrl->update();
  44. bool change( false );
  45. ///Deplacement
  46. // Mouvement
  47. Vec dir = m_ctrl->getMvt();
  48. m_pos += dir * m_vitesse;
  49. // Collision
  50. if ( m_pos.getX() > 4500.0f ) m_pos.setX( 4500.0f );
  51. else if ( m_pos.getX() < -1500.0f ) m_pos.setX( -1500.0f );
  52. if ( m_pos.getY() > 1500.0f ) m_pos.setY( 1500.0f );
  53. else if ( m_pos.getY() < -1500.0f ) m_pos.setY( -1500.0f );
  54. // Placement
  55. m_disHP.IAmHere( m_pos );
  56. ///Craft
  57. if ( m_ctrl->getCraft() && m_arme[0] && m_arme[1] ) {
  58. Arme* prod = m_armGest->crafting( m_arme, m_tirsGest );
  59. if ( prod != 0x0 ) {
  60. m_arme[0] = prod;
  61. m_arme[1] = 0x0;
  62. change = true;
  63. }
  64. }
  65. ///Recherche
  66. for ( short i(0); i<2; i++ )
  67. {
  68. if ( m_ctrl->getSearch(i) )
  69. {
  70. if ( m_arme[ i ] == 0x0 )
  71. {
  72. // On saisit une arme
  73. m_arme[ i ] = m_armGest->saisir( m_pos );
  74. }
  75. else
  76. {
  77. // On lache l'arme
  78. m_armGest->drop( m_pos, m_arme[ i ] );
  79. m_arme[ i ] = 0x0;
  80. }
  81. // On modifie l'apparence
  82. change = true;
  83. }
  84. }
  85. // Et on réinitialise l'apparence
  86. if ( change && m_vivant ) majFullImg();
  87. ///Collision avec les tirs
  88. int aie( m_tirsGest->encaisser(m_pos, m_allie) );
  89. if ( aie > 0 ) {
  90. m_vie -= aie;
  91. if (m_vie < 0) {
  92. // Le perso est mort
  93. m_vie = 0;
  94. m_vivant = false;
  95. SDL_BlitSurface( m_deathImg, 0, m_fullImg, 0 );
  96. m_visee.normaliser(); // Pour orienter l'image de mort : force le test
  97. // Et lache ses armes
  98. for ( short i(0); i<2; i++ ) {
  99. if ( m_arme[ i ] != 0x0 ) {
  100. m_armGest->drop( (i==0)? m_pos + m_ortho*2.0f : m_pos - m_ortho*2.0f, m_arme[ i ] );
  101. m_arme[ i ] = 0x0;
  102. }
  103. }
  104. }
  105. m_disHP.updateImg( m_vie );
  106. }
  107. ///Orientation
  108. // On récupère
  109. Vec visee( m_ctrl->getVisee() );
  110. // Si entre deux on a tourné ...
  111. if ( m_visee != visee )
  112. {
  113. // ... on tourne
  114. m_visee = visee;
  115. m_ortho.setVecteur( visee.getY(), -visee.getX() ); // Vecteur normal
  116. m_ortho.normaliser();
  117. m_ortho *= 17.0f;
  118. // Calcul de l'angle en radians
  119. float angle;
  120. if (m_visee.getX() != 0.0f) angle = atan((double)( m_visee.getY()) / m_visee.getX() ); // Angle en radians
  121. else if (m_visee.getY() < 0.0f) angle = -M_PI_2;
  122. else angle = M_PI_2;
  123. // Conversion
  124. angle = angle * 180.0f / M_PI; // Angle en °
  125. if ( m_visee.getX() < 0 ) angle += 180.0f;
  126. // Rotation de l'image
  127. SDL_FreeSurface(m_img);
  128. m_img = rotozoomSurface(m_fullImg, angle, 1.0f, SMOOTHING_OFF );
  129. }
  130. ///Fine gachette
  131. for ( short i(0); i<2; i++ ) {
  132. if ( m_ctrl->getTir( i ) && m_arme[ i ] != 0x0 ) {
  133. m_arme[ i ]->gachette( (i==0)? m_pos - m_ortho : m_pos + m_ortho, m_visee, m_allie );
  134. }
  135. }
  136. }
  137. bool Perso::estVivant() const
  138. {
  139. return m_vivant;
  140. }
  141. Vec Perso::getPos() const
  142. {
  143. return m_pos;
  144. }
  145. Vec Perso::getVisee() const
  146. {
  147. return m_visee;
  148. }
  149. void Perso::regen()
  150. {
  151. if ( !m_vivant ) {
  152. m_vivant = true;
  153. majFullImg();
  154. }
  155. m_vieMax += 6;
  156. m_vie = m_vieMax;
  157. m_disHP.setMax( m_vieMax );
  158. m_disHP.updateImg( m_vie );
  159. }
  160. void Perso::afficher( const Vec &lookAt, SDL_Surface* screen )
  161. {
  162. /// Afficher perso
  163. Affichable::afficher( lookAt, screen );
  164. /// Afficher barre de vie
  165. m_disHP.afficher( lookAt, screen );
  166. }
  167. void Perso::majFullImg()
  168. {
  169. // Réinitialise l'apparance
  170. SDL_BlitSurface( m_srcImg, 0, m_fullImg, 0);
  171. // Rajoute l'arme
  172. SDL_Rect cadrage = { 24, 0, 0, 0 };
  173. for ( short i(0); i<2; i++ )
  174. {
  175. if ( m_arme[ i ] != 0x0 )
  176. {
  177. SDL_Surface* weapon( m_armGest->getImg( m_arme[i]->getModel() ) );
  178. SDL_BlitSurface( weapon, 0, m_fullImg, &cadrage );
  179. }
  180. cadrage.y += 30;
  181. }
  182. // Force le rafraichissement de l'image
  183. m_visee.normaliser();
  184. }
  185. ///FICHIER END