Ayuda con Juego

Iniciado por Xenomorfo77, 2 Diciembre 2012, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

Xenomorfo77

Hola que tal? Pues miren resulta que estoy haciendo un juego en c++ con allegro y esto es lo que llevo hecho, lo que me gustaría es que le echaran un vistazo al codigo para ver si se puede depurar y si hay algo que pueda mejorarse, tambien tengo que hacer unas rutinas para que las balas que se disparen colisionen con algun objeto y se reduzca la vida de este. ¿Como y donde seria correcto hacer esto? Si quieren las imagenes y eso puedo subir el proyecto a algun lado solo avisen. Gracias.



Código (cpp) [Seleccionar]
#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();