155 lines
5.4 KiB
C++
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());
|
|
}
|
|
}
|