#include <SDL/SDL.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

short sizeVideoMode[] = {640,480};

short sizeSurface[] = {1024,768};

 

SDL_Surface *screen;                    //SURFACE PRINCIPAL

SDL_Surface *screen2;                   //SURFACE SECUNDARIO

   

/**METODO DE INICIALIZACION SDL Y CREACION PANTALLA PRINCIPAL**/

int init(void){

     

    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) == -1){

        printf("Error en SDL_Init: %s\n", SDL_GetError());

        return 1;

    }

 

    atexit(SDL_Quit);

    screen = SDL_SetVideoMode(sizeVideoMode[0],sizeVideoMode[1], 32, SDL_ANYFORMAT | SDL_DOUBLEBUF);

    screen2 = SDL_CreateRGBSurface(0,sizeSurface[0],sizeSurface[1],32,0xff000000,0x00ff0000,0x0000ff00,0x000000ff);

     

    if (screen2 == NULL){

        printf("Error en SDL_SetVideoMode: %s\n", SDL_GetError());

        return 1;

    }

 

    SDL_WM_SetCaption("Simulador", NULL);

}

 

/**METODO QUE CARGARA LOS SPRITES AL MAPA**/

SDL_Surface *cargarSprite(char *Rutaimagen,SDL_Surface *imagen,short COLOR[]){

     

    imagen= SDL_LoadBMP(Rutaimagen);//CARGA UNA IMAGEN

    SDL_SetColorKey(imagen,SDL_SRCCOLORKEY,SDL_MapRGB(imagen->format,COLOR[0],COLOR[1],COLOR[2]));

     

    return imagen;

}

/**METODO QUE SE ENCARGA DE SCROLLERAR ENTRE LOS LIMITES DE PANTALLA**/

SDL_Rect scroll(short speed,SDL_Rect vistaCamara,SDL_Rect motion){

 

    //SI LA POS EN X DE MOUSE ES NAYOR A WIDTH DE SURFACE PRINCIPAL

    if(motion.x >= sizeSurface[0]-(sizeVideoMode[0]-32)){

        motion.x += speed;  //SE DESPLAZA A LA DERECHA

        vistaCamara.x += speed;//VISTA CAMARA SE DESPLAZA A LA DERECHA

        //SI SE SALE DE LA PANTALLA

        if(vistaCamara.x >=sizeSurface[0]-sizeVideoMode[0])

            vistaCamara.x =sizeSurface[0]-sizeVideoMode[0];//NO AVANZA

         

    }else if(motion.x <= sizeSurface[0]-(sizeVideoMode[0]-32)){

 

        motion.x -= speed;

        vistaCamara.x -= speed;

 

        if(vistaCamara.x <=0)

            vistaCamara.x =0;

    }

 

    if(motion.y >= sizeSurface[1]-(sizeVideoMode[1]-32)){

 

        motion.y += speed;

        vistaCamara.y += speed;

 

        if(vistaCamara.y >= sizeSurface[1]-sizeVideoMode[1])

            vistaCamara.y = sizeSurface[1]-sizeVideoMode[1];

 

    }else if(motion.y <= sizeSurface[1]-(sizeVideoMode[0]-32)){

 

        motion.y -= speed;

        vistaCamara.y -= speed;

 

        if(vistaCamara.y <=0)

            vistaCamara.y =0;

 

    }        

 

    return vistaCamara;

}

/**MAIN*/

int main (int argc, char * argv []){

 

    short speed = 1;//SE DECLARA UNA VELOCIDAD DE DESPLAZAMIENTO

    SDL_Event event;//VARIABLE TIOPO EVENTO

    short color [] = {0,0,0};//COLOR TRANSPARENCIA IMAGEN

    /**inicializa SDL, crea mapa y  da coordenadas aleatorias a las sondas**/  

    init();

    SDL_Rect motion = {0,0};//GUARDARA LAS POSION DEL MOUSE

    SDL_Rect vistaCamara = {0,0,sizeVideoMode[0],sizeVideoMode[1]}; //RECTANGULO DEL TAMANO DE LA SURFACE SECUNDARIA

    screen2 =cargarSprite("img.bmp",screen2,color);//SE CARGA LA IMAGEN A LA SURFACE SECUNDARIA

 

    while (1){  //BUCLE INFINITO

 

        while (SDL_PollEvent(& event)){//CAPTURA EVENTOS                 

            if (event.type == SDL_QUIT){//SI SE PRESIONO X DE VENTANA

               return 0;//SALIR

            }            

           if(event.type == SDL_MOUSEMOTION){//SIEL TIPO ES DE MOVIMIENTO RATOS

                    motion.x = event.motion.x;//CAPTURAR X DEL MOUSE

                    motion.y = event.motion.y;//CAPTURAR Y DEL MOUSE

                }

            }

 

        vistaCamara = scroll(speed,vistaCamara,motion); //REALIZA EL SCROLLIN

 

        SDL_BlitSurface(screen2,&vistaCamara,screen,NULL);//PINTA LA SURFACE SECUNDARIA EN LA PRIMARIA

        SDL_Flip(screen);//MUESTRA LA SURFACE PRINCIPAL

        SDL_FreeSurface(screen);//LIMPIA LA SURFACE

        SDL_Delay(10);//TIEMPO DE RETARDO DE 10 MILISEGUNDOS

    }//fin while(true)

    SQL_Quit();//DESINIALIZA SDL

    return 0;

}