#include "..\C-Engine\CHeader.hpp" #include"BoatControl.hpp" extern "C" { #include } void BoatControl::StartBoat() { direction = 180; // Direction des bateaux au départ } void BoatControl::UpdateBoat() { if(BateauActuelle->VoilesLateralle.Pourcentage < 0)BateauActuelle->VoilesLateralle.Pourcentage = 0; // Pourcentage des voiles if(BateauActuelle->VoilesLateralle.Pourcentage > 100)BateauActuelle->VoilesLateralle.Pourcentage = 100; if(BateauActuelle->VoilesLongitudinal.Pourcentage < 0)BateauActuelle->VoilesLongitudinal.Pourcentage = 0; if(BateauActuelle->VoilesLongitudinal.Pourcentage > 100)BateauActuelle->VoilesLongitudinal.Pourcentage = 100; if(BateauActuelle->CanonDroit.couldown > 0)BateauActuelle->CanonDroit.couldown = BateauActuelle->CanonDroit.couldown - 4; // Diminution du couldown pour les canons. if(BateauActuelle->CanonGauche.couldown > 0)BateauActuelle->CanonGauche.couldown = BateauActuelle->CanonGauche.couldown - 4; float anglelong , anglelat; float priseventlong; float priseventlat; float forceventapplique , forceapplique; float forceappliquex , forceappliquey; GetObject()->GetRender()->SetDirection(direction - 90); //Set de la direction pour l'affichage anglelong = direction + 135; if(anglelong < 0)anglelong += 360; if(anglelong > 360) anglelong -= 360; // Calcul de l'angle des voiles. anglelat = direction + 90; if(anglelat < 0)anglelat += 360; if(anglelat > 360) anglelat -= 360; priseventlat = sin( degretorad( anglelat - VentActuelle->direction ) ) * BateauActuelle->VoilesLateralle.Pourcentage / 100;// Entre 0 et 1 // Pourcentage de la prise au vent des voiles. priseventlong = sin( degretorad( anglelong - VentActuelle->direction ) * BateauActuelle->VoilesLongitudinal.Pourcentage / 100);// Entre -1 et 1 if(priseventlat < 0)priseventlat = 0; forceventapplique = (( ABS(priseventlat) * VentActuelle->force ) + (ABS(priseventlong * VentActuelle->force)) ); // Force que le vent applique sur le bateau. forceapplique = cos(degretorad(direction - VentActuelle->direction)) * forceventapplique * 10; if(forceapplique < 0)forceapplique = 0; forceappliquex = cos(degretorad(direction)) * forceapplique; // Passage de forme polaire à carthésienne. forceappliquey = sin(degretorad(direction)) * forceapplique; if(forceappliquex > -10 && forceappliquex < 0)forceappliquex = -10; // On cap les forces if(forceappliquey > -10 && forceappliquey < 0)forceappliquey = -10; if(forceappliquex > 20)forceappliquex = 20; if(forceappliquey > 20)forceappliquey = 20; GetObject()->GetRigibody()->GetBody()->velocity.x = forceappliquex; // On applique les forces. GetObject()->GetRigibody()->GetBody()->velocity.y = forceappliquey; } void BoatControl::Initialisation( Vent * v , Boat * b , Animation * r) { this->VentActuelle = v; // On initialise les différens pointeurs. this->BateauActuelle = b; this->RenderBoulet = r; } void BoatControl::Turn(float v) { direction += v; // On fait tourner le bateau. if(direction < 0)direction += 360; if(direction > 360) direction -= 360; } void BoatControl::Fire( float angle) { if(angle == 90) // Tire du canon droit { if(BateauActuelle->CanonDroit.couldown <= 0) { float angletire; angletire = direction - angle; // Angle de tire Object * Buffer = new Object; // Création du boulet Buffer->GetTransforms()->SetXY( GetX() + 8 , GetY() + 8); //On place le boulet sur la map Buffer->GetRender()->SetRender(RenderBoulet , 1); //On set le rendu du boulet Buffer->AddRigibody(); // On donne un Rigibody Buffer->GetRigibody()->SetMass(5); //On dit qu'il pèse 5 kilo Buffer->AffectTag("Boulet"); SBoulet * Script_Boulet = new SBoulet; // On créait le script du boulet Buffer->AffectScript(Script_Boulet); Script_Boulet->time = 20; Buffer->GetRigibody()->GetBody()->velocity.x = cos(degretorad(angletire)) * 40; //On calcul la trajectoire du boule puis on set sa vitesse. Buffer->GetRigibody()->GetBody()->velocity.y = sin(degretorad(angletire)) * 40; GetEngine()->AddObject(Buffer); // On ajoute le boulet au jeu BateauActuelle->CanonDroit.couldown = 100; // On place le compteur à 100. } } if(angle == -90) // Tire du canon gauche { if(BateauActuelle->CanonGauche.couldown <= 0) { float angletire; angletire = direction - angle; Object * Buffer = new Object; Buffer->GetTransforms()->SetXY( GetX() + 8 , GetY() + 8); Buffer->GetRender()->SetRender(RenderBoulet , 1); Buffer->AddRigibody(); Buffer->GetRigibody()->SetMass(5); Buffer->AffectTag("Boulet"); SBoulet * Script_Boulet = new SBoulet; Buffer->AffectScript(Script_Boulet); Script_Boulet->time = 20; Buffer->GetRigibody()->GetBody()->velocity.x = cos(degretorad(angletire)) * 40; Buffer->GetRigibody()->GetBody()->velocity.y = sin(degretorad(angletire)) * 40; GetEngine()->AddObject(Buffer); BateauActuelle->CanonGauche.couldown = 100; } } } void SBoulet::Update() { time--; //On diminue sa durée de vie if(time < 0) //Si la durée de vie est écoulé alors on le détruit. { GetEngine()->DelObject(GetObject()); } }