InvasionSeanchans/BoatControl.cpp

155 lines
5.4 KiB
C++

#include "..\C-Engine\CHeader.hpp"
#include"BoatControl.hpp"
extern "C"
{
#include <math.h>
}
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()->ORender->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()->ORigibody->R_body.velocity.x = forceappliquex; // On applique les forces.
GetObject()->ORigibody->R_body.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->OTransforms->SetXY( GetX() + 8 , GetY() + 8); //On place le boulet sur la map
Buffer->ORender->SetRender(RenderBoulet , 1); //On set le rendu du boulet
Buffer->ORigibody = new Rigibody(Buffer); // On donne un Rigibody
Buffer->ORigibody->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->ORigibody->R_body.velocity.x = cos(degretorad(angletire)) * 40; //On calcul la trajectoire du boule puis on set sa vitesse.
Buffer->ORigibody->R_body.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->OTransforms->SetXY( GetX() + 8 , GetY() + 8);
Buffer->ORender->SetRender(RenderBoulet , 1);
Buffer->ORigibody = new Rigibody(Buffer);
Buffer->ORigibody->SetMass(5);
Buffer->AffectTag("Boulet");
SBoulet * Script_Boulet = new SBoulet;
Buffer->AffectScript(Script_Boulet);
Script_Boulet->time = 20;
Buffer->ORigibody->R_body.velocity.x = cos(degretorad(angletire)) * 40;
Buffer->ORigibody->R_body.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());
}
}