Código
#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();