jueves, 9 de abril de 2015

Pelota Rebotando 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 video;

#if defined(_MSC_VER)
#pragma comment(lib, "Irrlicht.lib")
#endif

//Variables Globales
ITexture *image;

vector2d<f32> position; //posicion actual
vector2d<f32> target; // la posicion donde se le dio clic
vector2d<f32> direction;

f32 speed = 0.2f;
s32 screenWidth = 640;
s32 screenHeight = 480;

//Creo una clase para definir los eventos y sus acciones al presionar los botones
//NOTA: Si le damos clic en la pantalla podremos hacer que siga la posicion donde dimos clic
class MyEventReceiver : public IEventReceiver
{
public:

 //Creo una funcion virtual para manejar el evento
 virtual bool OnEvent( const SEvent &event )
 {
  //Si es un evento de mouse
  if (event.EventType == EET_MOUSE_INPUT_EVENT)
  {
   //al presionar el boton izquierdo del mouse
   if (event.MouseInput.isLeftPressed())
   {
    target.X = (f32)event.MouseInput.X; //posicion x donde se dio clic
    target.Y = (f32)event.MouseInput.Y; //posicion y donde se dio clic

    //Calculamos la direccion y normalizamos el vector
    direction = target - position;
    direction.normalize();
   }
  }

  return false;
 }
};

//Se crea una funcion update para ir dibujando y actualizando la posicion de la pelota
void update( f32 deltaTime )
{
 position += (speed * deltaTime) * direction;

 //hace que retroceda para que no se salga de la pantalla del lado horizontal
 if (position.X > screenWidth - image->getSize().Width || position.X < 0)
 {
  direction.X *= -1;
 }

 //hace que retroceda para que no se salga de la pantalla del lado vertical
 if (position.Y > screenHeight - image->getSize().Height || position.Y < 0)
 {
  direction.Y *= -1;
 }
}

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;

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

 //Creo un objeto de mi clase
 MyEventReceiver receiver;

 device->setEventReceiver( &receiver );

 //Asigno la textura
 image = driver->getTexture("pelota.png");

 //Establesco su posicion y direccion
 position.set(0, 0);
 direction.set(1, 1);

 //asigno un tiempo
 u32 timeSinceElapsed = device->getTimer()->getTime();

 //Gameloop
 while (device->run())
 {
  //Asigno otro tiempo
  const u32 currentTime = device->getTimer()->getTime();
  const f32 deltaTime = (f32)(currentTime - timeSinceElapsed);

  timeSinceElapsed = currentTime;

  //mando a llamar a mi funcion
  update(deltaTime);

  driver->beginScene(true, true, SColor(255,255,255,255));
 
  //dibujo mi imagen 2D
  driver->draw2DImage(image, position2d<s32>((s32)position.X, (s32)position.Y),
   rect<s32>(0, 0, 50, 50), 0, SColor(255, 255, 255, 255), true);
  //NOTA: los dos ultimos parametros de rect, son las medidas de la imagen en pixeles

  driver->endScene();
 }

 //cerrar device
 device->drop();

 return 0;
}


No hay comentarios:

Publicar un comentario