#define IZQUIERDA 1
#define DERECHA 2
#define ARRIBA 3
#define ABAJO 4
#include <allegro.h>
using namespace std;
class ClaseMusica{
    public:
        int MusicaSonar(char *archivo){
            if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT,NULL)!=0){
                allegro_message("Error inicializando el sistema de sonido\n%s\n",allegro_error);
                return 1;
            }
            sonido= load_wav(archivo);
            play_sample(sonido,100,0,1000,TRUE);
        }
        void destruir(){
            destroy_sample(sonido);
        }
    private:
        SAMPLE * sonido;
};
class Nave{

public:
       Nave();
       ~Nave();
       // The following 4 methods will be used to set the images for the different
       //stages of movement
       void ImagenDerecha( char imagen1[]);
       void ImagenIzquierda( char imagen1[]);
       void ImagenArriba( char imagen1[]);
       void ImagenAbajo( char imagen1[]);
      // void ImagenDisparo(char imagen1[]);
       void disparoAbajo(char imagen1[]);
       void disparoArriba(char imagen1[]);
       void disparoIzquierda(char imagen1[]);
       void disparoDerecha(char imagen1[]);
       //To keep the program from crashing, this function will be used before
       //calling any movement methods
       int GetXDisparo();
       int GetYDisparo();
       void SetXDisparo(int nuevaX);
       void SetYDisparo(int nuevaY);
       void DibujarDisparo(BITMAP* tempBitmap, BITMAP* Mostrar);
       void BorrarDisparo();
       void DestruirDisparo();
       void MoverXdisparo(int nDireccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap);
       void MoverYdisparo(int nDIreccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap);
       void BorrarDisparo( BITMAP* tempBitmap);
       int GetX();
       void SetX( int newValue);
       void MoverX(int nDireccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap);
       int GetY();
       void SetY( int newValue);
       void MoverY(int nDIreccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap);
       void Borrar( BITMAP* tempBitmap);
       void Dibujar( BITMAP* tempBitmap, BITMAP* Mostrar);
       void Mostrar(BITMAP* PrincipalBitmap);

private:
        int direccion;
        int x;
        int y;
        int xDisparo;
        int yDisparo;
        //This will contain all the images,
        BITMAP *imagenes[9];


};


Nave::Nave(){
        direccion=ARRIBA;
        x= 400/*(SCREEN_W/2)*/ ;
        y= 300/* (SCREEN_H/2)*/;
}
Nave::~Nave(){
    delete [] imagenes;

};

void Nave::ImagenAbajo(char imagen1[]){
    imagenes[0]=load_bitmap(imagen1,NULL);
}
void Nave::ImagenArriba(char imagen1[]){
    imagenes[1]=load_bitmap(imagen1,NULL);
}
void Nave::ImagenDerecha(char imagen1[]){
    imagenes[2]=load_bitmap(imagen1,NULL);
}
void Nave::ImagenIzquierda(char imagen1[]){
    imagenes[3]=load_bitmap(imagen1,NULL);
}
void Nave::disparoAbajo(char imagen1[]){
    imagenes[4]=load_bitmap(imagen1,NULL);
}
void Nave::disparoArriba(char imagen1[]){
    imagenes[5]=load_bitmap(imagen1,NULL);
}
void Nave::disparoDerecha(char imagen1[]){
    imagenes[6]=load_bitmap(imagen1,NULL);
}
void Nave::disparoIzquierda(char imagen1[]){
    imagenes[7]=load_bitmap(imagen1,NULL);
}
int Nave::GetXDisparo(){
    return xDisparo;
}
int Nave::GetYDisparo(){
    return yDisparo;
}
int Nave::GetX(){
    return x;
}

int Nave::GetY(){
    return y;
}
void Nave::SetXDisparo(int newxDis){
    xDisparo=newxDis;
}
void Nave::SetYDisparo(int newyDis){
    yDisparo=newyDis;
}
void Nave::SetX( int valor){
    x = valor;
}

void Nave::SetY( int valor){
    y = valor;
}

void Nave::MoverX(int nDireccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap){
    direccion = nDireccion;
    if( direccion == IZQUIERDA){
        if(x==0){rest(50);}
        else{
            Borrar( tempBitmap);
            x -= 20;
            Dibujar( tempBitmap, imagenes[3]);
            draw_sprite( PrincipalBitmap, tempBitmap, 0, 0);
            rest(50);
        }
    }
    else {
        if(x>=SCREEN_W-26){rest(50);}
        else{
            Borrar( tempBitmap);
            x += 20;
            Dibujar( tempBitmap, imagenes[2]);
            draw_sprite( PrincipalBitmap, tempBitmap, 0, 0);
            rest(50);
        }
    }
}




void Nave::MoverY( int nDireccion, BITMAP* tempBitmap, BITMAP* PrincipalBitmap){
    direccion = nDireccion;
    if( direccion == ARRIBA){
        if(y==0)rest(50);
        else{
            Borrar( tempBitmap);
            y -= 20;
            Dibujar( tempBitmap, imagenes[1]);
            draw_sprite( PrincipalBitmap, tempBitmap, 0, 0);
            rest(50);
        }
    }
    else {
        if(y>=SCREEN_H-26)rest(50);
        else{
            Borrar( tempBitmap);
            y += 20;
            Dibujar( tempBitmap, imagenes[0]);
            draw_sprite( PrincipalBitmap, tempBitmap, 0, 0);
            rest(50);
        }
    }
}

void Nave::Borrar( BITMAP* tempBitmap){

    rectfill( tempBitmap, GetX(), GetY(), GetX() + 25, GetY() + 25, makecol ( 0, 0, 0));

}

void Nave::DibujarDisparo( BITMAP* tempBitmap, BITMAP* spriteToDraw){
    draw_sprite( tempBitmap, spriteToDraw, GetXDisparo(), GetYDisparo());
}
void Nave::Dibujar( BITMAP* tempBitmap, BITMAP* spriteToDraw){
    draw_sprite( tempBitmap, spriteToDraw, GetX(), GetY());
}

void Nave::Mostrar(BITMAP* PrincipalBitmap){
    draw_sprite( screen, imagenes[1],400/*(SCREEN_W/2)*/ ,300/* (SCREEN_H/2)*/);

}
BITMAP* buffer;
//BITMAP *fondo;
Nave NavePrincipal;
ClaseMusica music;
void Setup(){
     //fondo=create_bitmap(1280,800);
     //clear_to_color( fondo, makecol( 255, 255, 255));

     buffer= create_bitmap(SCREEN_W, SCREEN_H);

     NavePrincipal.ImagenIzquierda( "izquierdaAlleg.bmp");
     NavePrincipal.ImagenDerecha( "derechaAlleg.bmp");
     NavePrincipal.ImagenArriba("arribaAlleg.bmp");
     NavePrincipal.ImagenAbajo("abajoAlleg.bmp");

     NavePrincipal.Mostrar( screen);

}

void movePlayer(){

    if(key[KEY_DOWN]){ //If we have pressed the "down" key
            NavePrincipal.MoverY( ABAJO, buffer, screen);
     //then move down
    }
    else{
        if(key[KEY_UP]){ //If we have pressed the "up" key (and not pressed the "down" key)
            NavePrincipal.MoverY( ARRIBA, buffer, screen);//Then move up
        }
    }

    if(key[KEY_LEFT]){ //If we have pressed the "left" key (regarding less of any other key)
        NavePrincipal.MoverX(IZQUIERDA, buffer, screen); //Then move left
    }
    else{
        if(key[KEY_RIGHT]){ //If we have pressed the right key (and not pressed the left key)
             NavePrincipal.MoverX( DERECHA, buffer, screen); //Then move right
        }
    }
    if( key[KEY_A]){
       ;
    } else if( key[KEY_D]){
        NavePrincipal.MoverX( DERECHA, buffer, screen);
    } else if( key[KEY_W]){
        NavePrincipal.MoverY( ARRIBA, buffer, screen);
    } else if( key[KEY_S]){
        NavePrincipal.MoverY( ABAJO, buffer, screen);
    } else if(key[KEY_A]&&key[KEY_W]){
        NavePrincipal.MoverX(IZQUIERDA, buffer, screen);
        NavePrincipal.MoverY( ARRIBA, buffer, screen);
    }


}

int main(int argc, char *argv[])
{
    int depth, res;
    allegro_init();
    install_mouse();
    install_keyboard();
    depth=desktop_color_depth();
    if(depth==0)depth=32;
    set_color_depth(depth);
    res=set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 800, 600, 0, 0);
    if(res!=0){
        allegro_message(allegro_error);
        exit(-1);
    }
    music.MusicaSonar("t.wav");
    //readkey();
    Setup();

    while( !key[KEY_ESC]){
        movePlayer();
        rect( buffer, 0, 0, SCREEN_W-1,SCREEN_H-1, makecol ( 255, 255, 255));
    }
    music.destruir();
    NavePrincipal.~Nave();
    clear_keybuf();
    /* aņadir otras desintalaciones */
    allegro_exit();
    return 0;
}
END_OF_MAIN();
