#include <allegro.h>
#include "inicia.h"
#include <iostream>
#include <vector>
BITMAP *buffer;
//BITMAP *nave;
const int ANCHO = 500;
const int ALTO = 450;
int i = 900/2;
using namespace std;
class DISPARO
{
private:
BITMAP *bala;
int x;
int y;
int dx;
int dy;
public:
DISPARO(int _x,int _y,int _dx,int _dy);
int getx(void) const {return x;}
int gety(void) const {return y;}
void mover(void);
void pintar(void);
};
DISPARO::DISPARO(int _x,int _y,int _dx,int _dy)//CONSTRUCTOR
{
x = _x;
y = _y;
dx = _dx;
dy = _dy;
if(dy > 0) bala = load_bitmap(".\\imagenes\\bala2.bmp",NULL);
else bala = load_bitmap(".\\imagenes\\bala3.bmp",NULL);
}
void DISPARO::pintar(void)
{
masked_blit( bala, buffer, 0, 0, x, y, 42, 43);
}
void DISPARO::mover(void)
{
y-=dy;
}
/**************************************CLASE NAVE**********************************/
class NAVE
{
private:
BITMAP *nave;
int x;
int y;
int direccion;
int vida;
int ndisparos;
int maxdisp;
int dsw;
int cont;
public:
NAVE(int _x=0,int _y=0,int _direccion=0,int _vida=50,int _maxdisp=5);
int getx(void) const {return x;}
int gety(void) const {return y;}
int getdireccion(void) const {return direccion;}
int getvida(void) const {return vida;}
void setx(int _x){x = _x;}
void sety(int _y){y = _y;}
void setdireccion(int _direccion){direccion = _direccion;}
void setvida(int _vida){vida = _vida;}
void mover(void);
void pintar(void);
DISPARO *disparar(void);
};
NAVE::NAVE(int _x,int _y,int _direccion,int _vida,int _maxdisp) //CONSTRUCTOR
{
x = _x;
y = _y;
direccion = _direccion;
vida = _vida;
nave = load_bitmap(".\\imagenes\\nave.bmp",NULL);
maxdisp = _maxdisp;
cont = 20;
}
void NAVE::mover(void)
{
if(key[KEY_RIGHT]){ direccion = 2; x += 2; }
else if(key[KEY_LEFT]) { direccion = 0; x -= 2; }
if(key[KEY_UP]) { direccion = 3; y -= 2; }
else if(key[KEY_DOWN]) { direccion = 1; y += 2; }
if(x-2 < 0) x +=2;
else if(x+2 > ANCHO-44) x -=2;
if(y-2 < 0) y +=2;
else if(y+2 > ALTO-44) y -=2;
if(cont > 0) cont--;
}
void NAVE::pintar(void)
{
masked_blit(nave, buffer, 40*direccion, 0, x, y, 40, 47);
direccion = 1;
}
DISPARO *NAVE::disparar()
{
if(cont <= 0){ cont = 20; return new DISPARO(x+20,y,0,3); }
else return new DISPARO(5000,5000,0,3);
}
/****************************************CLASE ENEMIGO********************************/
class ENEMIGO
{
private:
BITMAP *nave;
int x;
int y;
int direccion;
int vida;
int cont;
public:
ENEMIGO(int _x,int _y,int _direccion,int _vida);
int getx(void) const {return x;}
int gety(void) const {return y;}
int getdireccion(void) const {return direccion;}
int getvida(void) const {return vida;}
void setx(int _x){x = _x;}
void sety(int _y){y = _y;}
void setdireccion(int _direccion){direccion = _direccion;}
void setvida(int _vida){vida = _vida;}
void mover(void);
void pintar(void);
DISPARO *disparar();
};
ENEMIGO::ENEMIGO(int _x,int _y,int _direccion,int _vida)// CONSTRUCTOR
{
x = _x;
y = _y;
direccion = _direccion;
vida = _vida;
nave = load_bitmap(".\\imagenes\\enemigo.bmp",NULL);
cont = 2;
}
DISPARO *ENEMIGO::disparar()
{
if(cont <= 0){ cont = 20; return new DISPARO(x+20,y+40,0,-3); }
else return new DISPARO(5000,5000,0,3);
}
void ENEMIGO::mover(void)
{
if(direccion == 0 && x >= 8){ x -= 2; /*nav->y -= 2;*/}else direccion = 1;
if(direccion == 1 && x <=450){ x += 2;/*nav->y += 2;*/} else direccion = 0;
if(x-2 < 0) x +=2;
else if(x+2 > ANCHO-44) x -=2;
if(y-2 < 0) y +=2;
else if(y+2 > ALTO-44) y -=2;
if(cont > 0) cont--;
}
void ENEMIGO::pintar(void)
{
masked_blit( nave, buffer, 0, 0, x, y, 42, 43);
}
vector<DISPARO*> disparos;
vector<DISPARO*> disparos2;
void limpia_disparos()
{
unsigned int i;
vector<DISPARO*> vd; // vector temporal
/* eliminamos los disparos que se encuentren fuera de la pantalla*/
for(i = 0; i < disparos.size(); i++)
if((disparos[i]->getx() > 0) && (disparos[i]->getx() < ANCHO) &&
(disparos[i]->gety() > 0) && (disparos[i]->gety() < ALTO))
vd.push_back(disparos[i]);
else
// liberamos la memoria
delete disparos[i];
disparos.clear();
for(i = 0; i < vd.size(); i++)
disparos.push_back(vd[i]);
vd.clear();
}
void limpia_disparos2()
{
unsigned int i;
vector<DISPARO*> vd; // vector temporal
/* eliminamos los disparos que se encuentren fuera de la pantalla*/
for(i = 0; i < disparos2.size(); i++)
if((disparos2[i]->getx() > 0) && (disparos2[i]->getx() < ANCHO) &&
(disparos2[i]->gety() > 0) && (disparos2[i]->gety() < ALTO))
vd.push_back(disparos2[i]);
else
// liberamos la memoria
delete disparos2[i];
disparos2.clear();
for(i = 0; i < vd.size(); i++)
disparos2.push_back(vd[i]);
vd.clear();
}
int main()
{
inicia_allegro(ANCHO,ALTO);
inicia_audio(70,70);
BITMAP *nube = load_bitmap(".\\imagenes\\nube.bmp",NULL);
buffer = create_bitmap(ANCHO, ALTO);
NAVE jugador(232,404,2,50);
ENEMIGO enemigo1(0,0,0,12);
while(!key[KEY_ESC])
{
blit(nube,buffer,0,i--,0,0,ANCHO,ALTO);
if(i <= 0) i=450;
jugador.mover();
jugador.pintar();
enemigo1.mover();
enemigo1.pintar();
disparos2.push_back(enemigo1.disparar());
if(key[KEY_SPACE]){ disparos.push_back(jugador.disparar()); }
for(unsigned int c = 0; c < disparos.size(); c++)
{
disparos.at(c)->mover();
disparos.at(c)->pintar();
}
for(unsigned int c = 0; c < disparos2.size(); c++)
{
disparos2.at(c)->mover();
disparos2.at(c)->pintar();
}
limpia_disparos();
limpia_disparos2();
blit(buffer,screen,0,0,0,0,ANCHO,ALTO);
rest(5);
clear(buffer);
}
destroy_bitmap(buffer);
return 0;
}
END_OF_MAIN();