martes, 26 de julio de 2011

GameEngine: Capitulo 25 . FoeManager

Hola a todos,

Bienvenidos a un nuevo capitulo de como crear tu propio game engine ...

Ya tenemos una estructura bastante solida donde se está asentando un videojuego más o menos serio: podemos movernos, disparar, pero, o vaya!! no tenemos a quien disparar!!. El capitulo de hoy se basa en la implementación básica del FoeManager (Gestor de enemigos).

Al ser una primera implementación que nos interesa que sea sencilla no pondremos ni movimiento de los enemigos ni que disparen, solamente que se estén quietos y reciban balazos (que más se les puede pedir? :D )

Aparte del FoeManager (.cpp y .h) se han modificado ligeramente el BulletManager (para que determine si un enemigo ha recibido un balazo) y el tilemanager para que lea la posición donde ha poner cada uno de los enemigos. El código del proyecto lo podeis pillar de la zona de descargas del megaupload (podeis encontrarlo en http://lordpakus.blogspot.com/2011/07/indice-del-lordpakusblog.html)...

FoeManager.h
/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/

/**************************************************************************************************/
// FoeManager.h : Código de la parte de enemigos del game engine
// Caracteristicas especiales: Esta clase implementa un singleton, es decir, solo podrá existir un objeto de esta clase en todo el proyecto
/**************************************************************************************************/

#ifndef __FoeManager__
#define __FoeManager__

#define MAX_FOES 100 //Número máximo de enemigos en escena

typedef struct
{
bool active; //Nos indica si el enemigo está activo o no.
int x,y; //Posición
char cad[32]; //Etiqueta de la animación a usar
}Foe;

class FoeManager
{
private:
// Constructor y destructor de la clase
static FoeManager instance;
FoeManager();
~FoeManager();
public:
static FoeManager& singleton();

public:
void Init(); //Initiliaze the bullet manager
void Draw();
void Spawn(int x, int y, char anim[]);
void KillAll();

private:
Foe foe_array[MAX_FOES];
};
#endif



FoeManager.cpp

/**************************************************************************************************/
// Código creado por F.Bordas (LordPakus) como ejemplo de creación de un game engine
// para el blog LordPakus (http://lordpakus.blogspot.com/).
// Prohibida la distribución fuera de este blog sin el permiso expreso del autor
/**************************************************************************************************/

/**************************************************************************************************/
// FoeManager.cpp : Código de la parte de enemigos del game engine
// Caracteristicas especiales: Esta clase implementa un singleton, es decir, solo podrá existir un objeto de esta clase en todo el proyecto
/**************************************************************************************************/
#include "FoeManager.h"
#include "MyGL.h"
#include "Core.h"
#include "BulletManager.h"
#include <iostream> //Usada para imprimir por consola

using namespace std;

#include <math.h> //Funciones de matematicas.

#define PI 3.14159265

//Instancia única del foe manager
FoeManager FoeManager::instance;

FoeManager::FoeManager()
{
}

FoeManager::~FoeManager()
{
}

//Devolvemos el puntero al singleton
FoeManager& FoeManager::singleton()
{
return instance;
}

void FoeManager::Init()
{
int i;

for(i = 0 ; i< MAX_FOES ; i++)
foe_array[i].active = false;
}

void FoeManager::Spawn(int x, int y, char anim[])
{
int i;

for( i = 0 ; i < MAX_FOES; ++i )
{
//Si este enemigo no está activado, lo activamos
if(foe_array[i].active == false )
{
cout << "Hacemos que salga un enemigo : " << x << " " << y << " " << anim << "\n";

//Seteamos los gráficos de la bala
foe_array[i].active = true;
foe_array[i].x = x;
foe_array[i].y = y;
sprintf( foe_array[i].cad , anim );
break;
}
}
}

void FoeManager::KillAll()
{
int i;
//Matamos a todos los enemigos
for( i = 0 ; i < MAX_FOES; ++i )
{
foe_array[i].active = false;
}
}

void FoeManager::Draw()
{
int i;

for( i = 0 ; i < MAX_FOES; ++i )
{
//Si la bala está activada
if(foe_array[i].active == true )
{
//Pintamos
LPE.DrawAnim(foe_array[i].x, foe_array[i].y, foe_array[i].cad);

//Colisión con las tiles
foe_array[i].y-=5;
if (LPE.CollideAnimWithMap2D(foe_array[i].x, foe_array[i].y, foe_array[i].cad))
{
foe_array[i].y+=5;
}
//En pruebas, si recibe un disparo, se muere.
if (BulletManager::singleton().Shooted(foe_array[i].x, foe_array[i].y, foe_array[i].cad))
{
foe_array[i].active = false;
}
}
}
}


El video de nuestro personaje matando enemigos lo podeis ver aquí:



Sin más, aquí me despido, espero que os lo hayáis pasado tan bien como yo y que os vayáis preparando para el siguiente capítulo.

LordPakusBlog
Nos vemos.

0 comentarios :

Publicar un comentario

Entradas populares