#include <irrlicht.h>
#include "CShieldManager.h"
#include "Following_Camera.h"
#include "CEventManager.h"
using namespace irr;
using namespace core;
using namespace gui;
using namespace video;
using namespace scene;
// VARIABLE GLOBAL QUI TROUVERAIS BIEN MIEUX LEURS PLACES DANS UNE CLASS
f32 vitesse_avance = 100;
f32 vitesse_monte = 50;
f32 vitesse_tourne = 10;
f32 angle_rot = 30;
f32 frameDeltaTime; //le temps ecouler entre chaque frame
/// ////////////////////////////////////////////////
/// LA FONCTIONS BOUGER
/// ////////////////////////////////////////////////
//une fonction qui sert a deplacer un objet dans un axe suivant sa rotation
//PS: remerciment a TUpac qui me la fait decouvrir
void bouger(irr::scene::ISceneNode *node, vector3df unite)
{
matrix4 m;
m.setRotationDegrees(node->getRotation());
m.transformVect(unite);
node->setPosition(node->getPosition() + unite);
node->updateAbsolutePosition();
}
/// ////////////////////////////////////////////////
/// LA FONCTIONS event_manager
/// ////////////////////////////////////////////////
void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* inode)
{
if(receiver->IsKeyDown(KEY_KEY_Z)) //on avance
{
//on fait avancer inode tout droit
f32 unit = vitesse_avance*frameDeltaTime;
bouger(inode, vector3df(0.0,0.0,unit));
}
if(receiver->IsKeyDown(KEY_KEY_Q))//on tourne en a gauche
{
//on fait tourner inode sur l'axe Y
vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
inode->setRotation(inode->getRotation() - rota);
//on verifie la rotation de battle_turtle1
//pour lui faire une rotation si il ne la fait pas deja
if(battle_turtle1->getRotation().Z < 1)
{
battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
0.0,
angle_rot));
}
}
if(receiver->IsKeyDown(KEY_KEY_D))//on tourne en a droite
{
//on fait tourner inode sur l'axe Y
vector3df rota(0.0,vitesse_tourne*frameDeltaTime,0.0);
inode->setRotation(inode->getRotation() + rota);
//on verifie la rotation de battle_turtle1
//pour lui faire une rotation si il ne la fait pas deja
if(battle_turtle1->getRotation().Z > -1)
{
battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
0.0,
0.0 - angle_rot));
}
}
if(receiver->IsKeyDown(KEY_KEY_A))//on monte
{
//on fait monter inode
f32 unit = vitesse_monte*frameDeltaTime;
bouger(inode, vector3df(0.0,unit,0.0));
//on verifie la rotation de battle_turtle1
//pour lui faire une rotation si il ne la fait pas deja
if(battle_turtle1->getRotation().X > -1)
{
battle_turtle1->setRotation(vector3df(0.0 - angle_rot,
0.0,
battle_turtle1->getRotation().Z));//on garde la rotation en Z
}
}
if(receiver->IsKeyDown(KEY_KEY_E))//on descend
{
//on fait descendre inode
f32 unit = vitesse_monte*frameDeltaTime;
bouger(inode, vector3df(0.0, 0.0-unit,0.0));
//on verifie la rotation de battle_turtle1
//pour lui faire une rotation si il ne la fait pas deja
if(battle_turtle1->getRotation().X < 1)
{
battle_turtle1->setRotation(vector3df(angle_rot,
0.0,
battle_turtle1->getRotation().Z));//on garde la rotation en Z
}
}
if(!receiver->IsKeyDown(KEY_KEY_E) && !receiver->IsKeyDown(KEY_KEY_A))
{ //si on n'appuis ni sur A ou E on remet le vaisseau droit sur l'axe X
battle_turtle1->setRotation(vector3df(0.0,
0.0,
battle_turtle1->getRotation().Z));//on garde la rotation en Z
}
if(!receiver->IsKeyDown(KEY_KEY_Q) && !receiver->IsKeyDown(KEY_KEY_D))
{ //si on n'appuis ni sur Q ou D on remet le vaisseau droit sur l'axe X
battle_turtle1->setRotation(vector3df(battle_turtle1->getRotation().X,//on garde la rotation en X
0.0,
0.0));
}
}
/// ////////////////////////////////////////////////
/// LA FONCTIONS MAIN
/// ////////////////////////////////////////////////
int main(void)
{
IrrlichtDevice* device = irr::createDevice(EDT_OPENGL,dimension2d<irr::u32>(1024,768),32,false,false,true);
IVideoDriver* driver = device->getVideoDriver ();
ISceneManager *sceneManager = device->getSceneManager ();
MyEventReceiver receiver;
device->setEventReceiver(&receiver);
// on creer un noeud de scene vierge
ISceneNode* inode = sceneManager->addEmptySceneNode();
// on creer un noeud de scene au quel on charge me vaisseaux en mesh
//on le met fils de inode
scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), inode);
//la camera qui va suivre inode
FollowingCamera* MaCamera = new FollowingCamera(inode, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0)); // Position initiale.
u32 tempsPasser = device->getTimer()->getTime();
u32 tempsAcutel = device->getTimer()->getTime();
while (device->run())
{
//recuperation du temps passer depuis la derniere frame
tempsAcutel = device->getTimer()->getTime();
frameDeltaTime = (f32)(tempsAcutel - tempsPasser) / 1000.f; // Time in seconds
tempsPasser = tempsAcutel;
event_manager(&receiver,battle_turtle1,inode);
driver->beginScene(true,true,SColor(0,200,200,200));
MaCamera->Update();
sceneManager->drawAll ();
driver->endScene ();
}
device->drop ();
delete MaCamera;
return 0;
}