166 lines
4.8 KiB
C++
166 lines
4.8 KiB
C++
#include "..\C-Engine\CHeader.hpp"
|
|
#include"BoatControl.hpp"
|
|
#include "BoatControlPirate.hpp"
|
|
|
|
extern "C"
|
|
{
|
|
#include <math.h>
|
|
}
|
|
|
|
|
|
void BoatControlPirate::Start()
|
|
{
|
|
StartBoat();
|
|
|
|
GetObject()->ORigibody = new Rigibody(GetObject());
|
|
|
|
GetObject()->AffectTag("Pirate"); //On écrit que c'est un pirate
|
|
GetObject()->ORigibody->SetMass(500);
|
|
|
|
BateauActuelle->VoilesLongitudinal.Pourcentage = 0;//On met ces voiles à 0
|
|
BateauActuelle->VoilesLateralle.Pourcentage = 0;
|
|
|
|
BateauActuelle->viemax = 3;//Les pirates ont 3 de vies.
|
|
BateauActuelle->vie = BateauActuelle->viemax ;
|
|
|
|
BateauActuelle->CanonDroit.couldown = 0;
|
|
BateauActuelle->CanonGauche.couldown = 0;
|
|
}
|
|
|
|
|
|
void BoatControlPirate::Update()
|
|
{
|
|
UpdateBoat();
|
|
|
|
int difx , dify ;
|
|
int distance;
|
|
float angle , difangle;
|
|
|
|
difx = GetX() - GetEngine()->ListeObject[0]->OTransforms->GetX();
|
|
dify = GetY() - GetEngine()->ListeObject[0]->OTransforms->GetY();
|
|
|
|
distance = sqrt( difx * difx + dify * dify); //On calcul la distance entre le joueur et le bateau pirate.
|
|
|
|
angle = 360 - 90 - radtodegre(atan2( difx , dify));
|
|
|
|
if(angle > 360) angle -= 360;
|
|
if(angle < 0) angle += 360;
|
|
|
|
difangle = angle - direction;
|
|
|
|
if(distance < 50 || distance > 350)
|
|
{
|
|
difangle = angle - direction + 90;
|
|
|
|
BateauActuelle->VoilesLateralle.Pourcentage = BateauActuelle->VoilesLateralle.Pourcentage - 3;
|
|
BateauActuelle->VoilesLongitudinal.Pourcentage = BateauActuelle->VoilesLongitudinal.Pourcentage - 3;
|
|
}
|
|
else
|
|
{
|
|
if(BateauActuelle->VoilesLateralle.Pourcentage < 70)BateauActuelle->VoilesLateralle.Pourcentage = BateauActuelle->VoilesLateralle.Pourcentage + 2;
|
|
if(BateauActuelle->VoilesLateralle.Pourcentage < 70)BateauActuelle->VoilesLongitudinal.Pourcentage = BateauActuelle->VoilesLongitudinal.Pourcentage + 2;
|
|
}
|
|
|
|
if(difangle > 360) difangle -= 360;
|
|
if(difangle < 0) difangle += 360;
|
|
|
|
if(difangle < 180 && difangle > 2)Turn(2);//On aligne le bateau dans la bonne direction
|
|
if(difangle > 180 && difangle < 358) Turn(-2);
|
|
|
|
if(distance < 50)
|
|
{
|
|
Fire(90);
|
|
Fire(-90);
|
|
|
|
}
|
|
|
|
int affichage = BateauActuelle->vie * 15 / BateauActuelle->viemax;//On affiche la vie du pirate à sa gauche.
|
|
PrintMini( GetObject()->OTransforms->GetRelativeX() + 18 , 63 - GetObject()->OTransforms->GetRelativeY() - 10 , "P" , 0);
|
|
ML_line( GetObject()->OTransforms->GetRelativeX() - 2 , 62 - GetObject()->OTransforms->GetRelativeY() , GetObject()->OTransforms->GetRelativeX() - 2 , 62 - GetObject()->OTransforms->GetRelativeY() - affichage, ML_BLACK);
|
|
|
|
|
|
Object * Buffer = NULL;
|
|
|
|
Buffer = GetObject()->CollisionTagO("Boulet");
|
|
|
|
if(Buffer != NULL)//Si il est touché par un boulet de canon il perd une vie.
|
|
{
|
|
GetEngine()->DelObject(Buffer);
|
|
|
|
BateauActuelle->vie --;
|
|
}
|
|
|
|
if( BateauActuelle->vie <= 0)//Si il n'a plus de vie il meurt.
|
|
{
|
|
GetEngine()->DelObject(GetObject());
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void BoatControlPirate::Fire( float angle)//Pareil que pour le BoatControl , seul le tag change.
|
|
{
|
|
if(angle == 90)
|
|
{
|
|
if(BateauActuelle->CanonDroit.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("BouletP");
|
|
|
|
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->CanonDroit.couldown = 100;
|
|
}
|
|
}
|
|
|
|
if(angle == -90)
|
|
{
|
|
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("BouletP");
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|