You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 line
5.5KB

  1. #include "..\C-Engine\CHeader.hpp"
  2. #include"BoatControl.hpp"
  3. extern "C"
  4. {
  5. #include <math.h>
  6. }
  7. void BoatControl::StartBoat()
  8. {
  9. direction = 180; // Direction des bateaux au départ
  10. }
  11. void BoatControl::UpdateBoat()
  12. {
  13. if(BateauActuelle->VoilesLateralle.Pourcentage < 0)BateauActuelle->VoilesLateralle.Pourcentage = 0; // Pourcentage des voiles
  14. if(BateauActuelle->VoilesLateralle.Pourcentage > 100)BateauActuelle->VoilesLateralle.Pourcentage = 100;
  15. if(BateauActuelle->VoilesLongitudinal.Pourcentage < 0)BateauActuelle->VoilesLongitudinal.Pourcentage = 0;
  16. if(BateauActuelle->VoilesLongitudinal.Pourcentage > 100)BateauActuelle->VoilesLongitudinal.Pourcentage = 100;
  17. if(BateauActuelle->CanonDroit.couldown > 0)BateauActuelle->CanonDroit.couldown = BateauActuelle->CanonDroit.couldown - 4; // Diminution du couldown pour les canons.
  18. if(BateauActuelle->CanonGauche.couldown > 0)BateauActuelle->CanonGauche.couldown = BateauActuelle->CanonGauche.couldown - 4;
  19. float anglelong , anglelat;
  20. float priseventlong;
  21. float priseventlat;
  22. float forceventapplique , forceapplique;
  23. float forceappliquex , forceappliquey;
  24. GetObject()->GetRender()->SetDirection(direction - 90); //Set de la direction pour l'affichage
  25. anglelong = direction + 135; if(anglelong < 0)anglelong += 360; if(anglelong > 360) anglelong -= 360; // Calcul de l'angle des voiles.
  26. anglelat = direction + 90; if(anglelat < 0)anglelat += 360; if(anglelat > 360) anglelat -= 360;
  27. priseventlat = sin( degretorad( anglelat - VentActuelle->direction ) ) * BateauActuelle->VoilesLateralle.Pourcentage / 100;// Entre 0 et 1 // Pourcentage de la prise au vent des voiles.
  28. priseventlong = sin( degretorad( anglelong - VentActuelle->direction ) * BateauActuelle->VoilesLongitudinal.Pourcentage / 100);// Entre -1 et 1
  29. if(priseventlat < 0)priseventlat = 0;
  30. forceventapplique = (( ABS(priseventlat) * VentActuelle->force ) + (ABS(priseventlong * VentActuelle->force)) ); // Force que le vent applique sur le bateau.
  31. forceapplique = cos(degretorad(direction - VentActuelle->direction)) * forceventapplique * 10;
  32. if(forceapplique < 0)forceapplique = 0;
  33. forceappliquex = cos(degretorad(direction)) * forceapplique; // Passage de forme polaire à carthésienne.
  34. forceappliquey = sin(degretorad(direction)) * forceapplique;
  35. if(forceappliquex > -10 && forceappliquex < 0)forceappliquex = -10; // On cap les forces
  36. if(forceappliquey > -10 && forceappliquey < 0)forceappliquey = -10;
  37. if(forceappliquex > 20)forceappliquex = 20;
  38. if(forceappliquey > 20)forceappliquey = 20;
  39. GetObject()->GetRigibody()->GetBody()->velocity.x = forceappliquex; // On applique les forces.
  40. GetObject()->GetRigibody()->GetBody()->velocity.y = forceappliquey;
  41. }
  42. void BoatControl::Initialisation( Vent * v , Boat * b , Animation * r)
  43. {
  44. this->VentActuelle = v; // On initialise les différens pointeurs.
  45. this->BateauActuelle = b;
  46. this->RenderBoulet = r;
  47. }
  48. void BoatControl::Turn(float v)
  49. {
  50. direction += v; // On fait tourner le bateau.
  51. if(direction < 0)direction += 360;
  52. if(direction > 360) direction -= 360;
  53. }
  54. void BoatControl::Fire( float angle)
  55. {
  56. if(angle == 90) // Tire du canon droit
  57. {
  58. if(BateauActuelle->CanonDroit.couldown <= 0)
  59. {
  60. float angletire;
  61. angletire = direction - angle; // Angle de tire
  62. Object * Buffer = new Object; // Création du boulet
  63. Buffer->GetTransforms()->SetXY( GetX() + 8 , GetY() + 8); //On place le boulet sur la map
  64. Buffer->GetRender()->SetRender(RenderBoulet , 1); //On set le rendu du boulet
  65. Buffer->AddRigibody(); // On donne un Rigibody
  66. Buffer->GetRigibody()->SetMass(5); //On dit qu'il pèse 5 kilo
  67. Buffer->AffectTag("Boulet");
  68. SBoulet * Script_Boulet = new SBoulet; // On créait le script du boulet
  69. Buffer->AffectScript(Script_Boulet);
  70. Script_Boulet->time = 20;
  71. Buffer->GetRigibody()->GetBody()->velocity.x = cos(degretorad(angletire)) * 40; //On calcul la trajectoire du boule puis on set sa vitesse.
  72. Buffer->GetRigibody()->GetBody()->velocity.y = sin(degretorad(angletire)) * 40;
  73. GetEngine()->AddObject(Buffer); // On ajoute le boulet au jeu
  74. BateauActuelle->CanonDroit.couldown = 100; // On place le compteur à 100.
  75. }
  76. }
  77. if(angle == -90) // Tire du canon gauche
  78. {
  79. if(BateauActuelle->CanonGauche.couldown <= 0)
  80. {
  81. float angletire;
  82. angletire = direction - angle;
  83. Object * Buffer = new Object;
  84. Buffer->GetTransforms()->SetXY( GetX() + 8 , GetY() + 8);
  85. Buffer->GetRender()->SetRender(RenderBoulet , 1);
  86. Buffer->AddRigibody();
  87. Buffer->GetRigibody()->SetMass(5);
  88. Buffer->AffectTag("Boulet");
  89. SBoulet * Script_Boulet = new SBoulet;
  90. Buffer->AffectScript(Script_Boulet);
  91. Script_Boulet->time = 20;
  92. Buffer->GetRigibody()->GetBody()->velocity.x = cos(degretorad(angletire)) * 40;
  93. Buffer->GetRigibody()->GetBody()->velocity.y = sin(degretorad(angletire)) * 40;
  94. GetEngine()->AddObject(Buffer);
  95. BateauActuelle->CanonGauche.couldown = 100;
  96. }
  97. }
  98. }
  99. void SBoulet::Update()
  100. {
  101. time--; //On diminue sa durée de vie
  102. if(time < 0) //Si la durée de vie est écoulé alors on le détruit.
  103. {
  104. GetEngine()->DelObject(GetObject());
  105. }
  106. }