#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;
void event_manager(MyEventReceiver *receiver, IAnimatedMeshSceneNode *battle_turtle1, ISceneNode* plane)
{
int rot1 = 0, rot2 = 0;
vector3df rot, rrot;
rot.Y += 0.7;
if(receiver->IsKeyDown(KEY_KEY_Z)) //la touche Z fait avancer le vaiseau
{
vector3df facing(cos(battle_turtle1->getRotation().Y * PI/180.0f), -sin(battle_turtle1->getRotation().Z * PI/180.0f), -sin(battle_turtle1->getRotation().Y * PI/180.0f));
facing.normalize();
vector3df newPos = plane->getPosition() - (facing + (facing * (f32)0.5f));
plane->setPosition(newPos);
if(receiver->IsKeyDown(KEY_KEY_Q))//si on appuis sur Z et Q on avance et on tourne en a gauche en meme temps
{
if (battle_turtle1->getRotation().X <= -30)
{
rot1 = 0;
}
else
{
rot1 = rot1 + 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(-rot1,-rot.Y,0));
}
else if(receiver->IsKeyDown(KEY_KEY_D))//si on appuis sur Z et D on avance et on tourne en a droite en meme temps
{
if (battle_turtle1->getRotation().X >= 30)
{
rot2 = 0;
}
else
{
rot2 = rot2 + 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
}
else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)//remise a plomb du vaisseau si il y a que Z appuier
{
if (battle_turtle1->getRotation().X < 0)
{
rot1 = rot1 + 1;
}
else if (battle_turtle1->getRotation().X == 0)
{
rot1 = 0;
rot2 = 0;
}
else if (battle_turtle1->getRotation().X > 0)
{
rot2 = rot2 - 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
}
}
else if(receiver->IsKeyDown(KEY_KEY_Q))//si on appuis que sur Q on vire a gauche
{
if (battle_turtle1->getRotation().X <= -30)
{
rot1 = 0;
}
else
{
rot1 = rot1 + 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(-rot1,-rot.Y,0));
}
else if(receiver->IsKeyDown(KEY_KEY_A))//si on appuis sur A on monte
{
battle_turtle1->setRotation(battle_turtle1->getRotation()+vector3df(0,0,1));
}
else if(receiver->IsKeyDown(KEY_KEY_E))//si on appuis que sur E on descend
{
battle_turtle1->setRotation(battle_turtle1->getRotation()-vector3df(0,0,1));
}
else if(receiver->IsKeyDown(KEY_KEY_D))//si on appuis que sur D on vire a droite
{
if (battle_turtle1->getRotation().X >= 30)
{
rot2 = 0;
}
else
{
rot2 = rot2 + 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation()+ vector3df(rot2,rot.Y,0));
}
else if(receiver->IsKeyDown(KEY_KEY_Q) == false && receiver->IsKeyDown(KEY_KEY_D) == false)//remise a plomb du vaisseau
{
if (battle_turtle1->getRotation().X < 0)
{
rot1 = rot1 + 1;
}
else if (battle_turtle1->getRotation().X == 0)
{
rot1 = 0;
rot2 = 0;
}
else if (battle_turtle1->getRotation().X > 0)
{
rot2 = rot2 - 1;
}
battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot1,0,0));
battle_turtle1->setRotation(battle_turtle1->getRotation() + vector3df(rot2,0,0));
}
}
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 ();
scene::IAnimatedMeshSceneNode *shield_node;
sceneManager->addSkyBoxSceneNode(
driver->getTexture("Data/skybox/irrlicht2_up.jpg"),
driver->getTexture("Data/skybox/irrlicht2_dn.jpg"),
driver->getTexture("Data/skybox/irrlicht2_lf.jpg"),
driver->getTexture("Data/skybox/irrlicht2_rt.jpg"),
driver->getTexture("Data/skybox/irrlicht2_ft.jpg"),
driver->getTexture("Data/skybox/irrlicht2_bk.jpg"));
scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(0,vector3df(500000,0,10000),SColorf(255, 255, 255),5000000.0f);
lumiere->getLightData().Type = ELT_POINT;
f32 radius = 0.1;
u32 duration = 500;
video::SColorf impact_color(1,1,1,1);
device->getCursorControl ()-> setVisible (true); // curseur invisible
scene::IMeshManipulator *manipulator = sceneManager->getMeshManipulator();
CShieldManager *shieldmanager = new CShieldManager(sceneManager,device->getTimer());
scene::ISceneNode * plane = sceneManager->addCubeSceneNode(0.001);
scene::IAnimatedMeshSceneNode *battle_turtle1 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/dedale.b3d"), plane);
scene::ISceneNode * planet = sceneManager->addSphereSceneNode(5,96);
scene::ISceneNode * soleil = sceneManager->addSphereSceneNode(5,96);
planet->setScale(vector3df(20,20,20));
planet->setPosition(vector3df(20000,0,0));
plane->setPosition(vector3df(20000,0,100));
soleil->setScale(vector3df(20*18,20*18,20*18));
soleil->setPosition(vector3df(0,0,0));
soleil->setMaterialFlag(EMF_LIGHTING, false);
lumiere->setPosition(soleil->getPosition());
battle_turtle1->setScale(core::vector3df(1,1,1));
battle_turtle1->setMaterialFlag(EMF_LIGHTING, true);
shield_node = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("Data/model/dedale/shield_dedale.b3d"),battle_turtle1);
shield_node->setMaterialTexture(0,driver->getTexture("Data/textures/water.jpg"));
shield_node->setMaterialTexture(1,driver->getTexture("Data/textures/gradient_blinds.png"));
planet->setMaterialTexture(0,driver->getTexture("Data/textures/terre.jpg"));
soleil->setMaterialTexture(0,driver->getTexture("Data/textures/soleil.png"));
manipulator->scaleTCoords(shield_node->getMesh(),core::vector2df(6,6),1);
shield_node->setMaterialFlag(video::EMF_BACK_FACE_CULLING,false);
shield_node->setScale(core::vector3df(1,1,1));
shield_node->setVisible(false);
scene::ITriangleSelector *selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
selector = sceneManager->createTriangleSelector(shield_node->getMesh(),shield_node);
shield_node->setTriangleSelector(selector);
selector->drop();
scene::ITriangleSelector *selector1;
shieldmanager->addShield(shield_node);
FollowingCamera* MaCamera = new FollowingCamera(plane, sceneManager,false, 50000,selector1,-3,0.5f,0,vector3df(7,2,0)); // Position initiale.
MyEventReceiver receiver;
device->setEventReceiver(&receiver);
int lastFPS = -1;
u32 lastMS = device->getTimer()->getRealTime();
while (device->run()) // la boucle de rendu
{
u32 difMs = device->getTimer()->getRealTime()-lastMS;
lastMS = device->getTimer()->getRealTime();
f32 alignSpeed = difMs/16.0;
if(lastMS%(rand()%20+30)==0)
{
core::vector3df source = vector3df(50,10,50);
core::vector3df target = battle_turtle1->getPosition();
const core::line3df ray(source,target);
core::vector3df result = shieldmanager->addImpact(shield_node, ray,radius*250,duration,impact_color);
core::matrix4 trans = shield_node->getAbsoluteTransformation();
trans.makeInverse();
trans.transformVect(result);
}
event_manager(&receiver,battle_turtle1,plane );
driver->beginScene(true,true,SColor(0,200,200,200));
MaCamera->Update();
sceneManager->drawAll ();
shieldmanager->drawAll();
driver->endScene ();
}
device->drop ();
delete shieldmanager;
delete MaCamera;
return 0;
}