sábado, 18 de abril de 2015

Manejando Camara FPS en Irrlicht


Descargar Assets para este proyecto


#include <irrlicht.h>

//los namespace para definir funciones de irrlicht
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif


int main()
{
 //define un device para la pantalla
 IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<u32>(640, 480), 16, false,
  false, false, 0);

 //en caso de error
 if (!device)
  return 1;

 //Para ponerle un titulo a la ventana
 device->setWindowCaption(L"Manejando Camara FPS en irrlicht");

 //Creo un driver de video
 IVideoDriver *driver = device->getVideoDriver();

 //Creo un nodo para manejar la escena
 ISceneManager *sceneManager = device->getSceneManager();

 //Agrego un cubo a la escena
 IMeshSceneNode *cube = sceneManager->addCubeSceneNode();

 //En caso de error
 if (!cube)
 {
  return 1;
 }

 //Si es correcto le agrego la textura y un material
 if (cube)
 {
  cube->setMaterialFlag(EMF_LIGHTING, false);
  cube->setMaterialTexture(0, driver->getTexture("wall.bmp"));
 }

 //Creo una camara FPS se maneja con el mouse y las flechas de direccion, alt f4 para salir
 ICameraSceneNode *fpsCamera = sceneManager->addCameraSceneNodeFPS(0, 80.f, 0.3f);
 
 //Establesco las propiedades
 fpsCamera->setPosition(vector3df(0, 15, -25));
 fpsCamera->setTarget(vector3df(0, 0, 0));

 //Creo un pointLight y su posicion
 ILightSceneNode *myPointLight = sceneManager->addLightSceneNode();
 myPointLight->setPosition(vector3df(0.0f, 20.0f, 0.0f));

 //Creo un nodo de animacion
 ISceneNodeAnimator *animator = sceneManager->createFlyCircleAnimator(vector3df(0, 0, 0), 50.f, 0.005f);

 //Le agrego la animacion a la pointLight
 myPointLight->addAnimator(animator);
 animator->drop();

 //Agregamos un billboard para pasarle la pointlight a la escena
 ISceneNode *pointLightBillboard = sceneManager->addBillboardSceneNode(myPointLight,
  dimension2d<f32>(20, 20));

 //Agrego algunas propiedades al billboard como material, tipo y textura
 pointLightBillboard->setMaterialFlag(EMF_LIGHTING, false);
 pointLightBillboard->setMaterialType(EMT_TRANSPARENT_ADD_COLOR);
 pointLightBillboard->setMaterialTexture(0, driver->getTexture("portal1.bmp"));
 
 //Agrego algunas propiedades de luz, difusse color y specular color
 SLight pointLightData;
 pointLightData.DiffuseColor = SColor(255, 0, 255, 0);
 pointLightData.SpecularColor = SColor(255, 0, 0, 255);

 //Le agrego las propiedades a mi pointLight
 myPointLight->setLightData(pointLightData);

 //Ahora agrego un spotLight a la escena y su posicion
 ILightSceneNode *mySpotLight = sceneManager->addLightSceneNode();
 mySpotLight->setPosition(vector3df(0.0f, 10.0f, 0.0f));

 //Agrego propiedades de spotLight
 SLight spotLightData;
 spotLightData.Type = ELT_SPOT;
 spotLightData.DiffuseColor = SColor(255, 255, 0, 0);
 spotLightData.OuterCone = 100;
 spotLightData.InnerCone = 10;

 //Le paso las propiedades a mi spotLight
 mySpotLight->setLightData(spotLightData);

 //Agrego una rotacion a mi cubo
 vector3df cubeRotation = vector3df(0.0f, 0.0f, 0.0f);

 //Gameloop
 while (device->run())
 {
  //Aplico la rotacion y que se incremente
  cube->setRotation( cubeRotation );
  cubeRotation += 0.2f;

  //Pasando cierto limite en la rotacion en x se reinician los valores
  if (cubeRotation.X >= 360.0f)
  {
   cubeRotation.X = 0.0f;
   cubeRotation.Y = 0.0f;
   cubeRotation.Z = 0.0f;
  }

  //Le paso mi rotacion a mi spotLight
  mySpotLight->setRotation(cubeRotation);

   driver->beginScene(true, true, SColor(255, 100, 101, 140));

   //Dibujo todo del sceneManager
   sceneManager->drawAll();

   driver->endScene();
 }

 //cerrar device
 device->drop();

 return 0;
}


No hay comentarios:

Publicar un comentario