Estaciones del año.


Este programa muestra una imagen a la cual le va aplicando unos cambios de colores para simular las estaciones del año.

A la misma vez también se muestra diferentes horas del día, mostrando mañana, tarde y noche.


A continuación se muestra todo el código del programa.

/*
 KODAYGAMES 2019
 https://programacion-cpp.blogspot.com/
   
 simulacion de las estaciones mediante colores
 y simulacion de dia, tarde, noche.
*/
#include <allegro.h>

#define mdia        0xc6e8ea
#define mtarde      0xdc7725
#define mnoche      0x0f0f6f
#define mprimavera  0x4afa56
#define mverano     0xfefc44
#define motono      0xfc6f30
#define minvierno   0x2082fb

void pintacomb( BITMAP* buffer, BITMAP* img, int trans){
     int num = int(( trans  * 255 ) / 100 );
     set_multiply_blender(128,128,128,trans);
     draw_trans_sprite( buffer, img, 0, 0);
};

void pintatrans( BITMAP* buffer, BITMAP* img, int trans){
     int num = int(( trans  * 255 ) / 100 );
     set_trans_blender(0,0,0,num);
     draw_trans_sprite( buffer, img, 0, 0);
};

int main() 
{ 
 allegro_init();
 install_timer();
 install_keyboard();
 install_mouse();
 
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
 
 BITMAP *buffer = create_bitmap(800, 600);
 BITMAP *ant = create_bitmap(800, 600);
 BITMAP *matizcolor = create_bitmap(800, 600); 
 BITMAP *matizdiario = create_bitmap(800, 600); 
  
 clear_to_color(buffer, 0x333333);

 clear_to_color(matizcolor, mprimavera);
 clear_to_color(ant, mverano);
 clear_to_color(matizdiario, mdia);
 
 BITMAP *cursor = load_bmp("cursor.bmp",NULL);
 BITMAP *w = load_bmp("web.bmp",NULL);
  
    BITMAP *fondo = load_bmp("bosque.bmp",NULL);
    BITMAP *tdia  = load_bmp("dia.bmp",NULL);
    BITMAP *ttarde = load_bmp("tarde.bmp",NULL);
    BITMAP *tnoche = load_bmp("noche.bmp",NULL);
    BITMAP *tprimavera = load_bmp("primavera.bmp",NULL);
    BITMAP *tverano = load_bmp("verano.bmp",NULL);
    BITMAP *totono = load_bmp("otono.bmp",NULL);
    BITMAP *tinvierno = load_bmp("invierno.bmp",NULL);
    
    bool salir = false;
    int swd = 1;
    int swp = 0;
    int swe = 1;
    int cont = 0;
    
    
    while ( !salir )
    {
       cont++;   
       blit( buffer, ant, 0, 0, 0, 0, 800, 600);   
       blit( fondo, buffer, 0, 0, 0, 0, 800, 600);
            
       if ( cont % 500 == 0 ) { swd++; swp=1; }
       if ( swd == 4 ) swd = 1;
       if ( cont % 1500 == 0 ) { swe++; }
       if ( swe == 5 ) swe = 1;
                          
       if ( swd == 1 )  clear_to_color(matizdiario, mdia); 
       if ( swd == 2 )  clear_to_color(matizdiario, mtarde);
       if ( swd == 3 )  clear_to_color(matizdiario, mnoche); 
       
       if ( swe == 1 ) clear_to_color(matizcolor, mprimavera); 
       if ( swe == 2 ) clear_to_color(matizcolor, mverano);
       if ( swe == 3 ) clear_to_color(matizcolor, motono);
       if ( swe == 4 ) clear_to_color(matizcolor, minvierno);
        
  //Circulo iluminado      
       circlefill( matizdiario, mouse_x+5, mouse_y+9, 85, mdia);
       
       pintatrans( buffer, matizcolor, 30 );
       pintacomb ( buffer, matizdiario, 200 );
                     
       if ( swe == 1 ){
            masked_blit( tprimavera, buffer, 0,0,40,40, 125,27);
       }       
       if ( swe == 2 ){
            masked_blit( tverano, buffer, 0,0,40,40, 125,27);
       }
       if ( swe == 3 ){
            masked_blit( totono, buffer, 0,0,40,40, 125,27);
       }
       if ( swe == 4 ){
            masked_blit( tinvierno, buffer, 0,0,40,40, 125,27);
       }       
              
       
       if ( swd == 1 ){
            masked_blit( tdia, buffer, 0,0,170,40, 44,27);
       }
       if ( swd == 2 ){
            masked_blit( ttarde, buffer, 0,0,170,40, 69,27);
       }
       if ( swd == 3 ){
            masked_blit( tnoche, buffer, 0,0,170,40, 79,27);
       }       
     
       textprintf_ex( buffer, font, 10, 585, 0xFFFFFF, -1, "Allegro Ver. %s ", ALLEGRO_VERSION_STR );      

       masked_blit( w, buffer, 0,0, 185, 550, 431,35);
       masked_blit( cursor, buffer, 0,0,mouse_x, mouse_y, 14,19);
   
    if ( swp == 1 )
       {
            // se a cambiado de hora
            swp=0;
       }
       
       blit(buffer, screen, 0, 0, 0, 0, 800, 600);
 
    if ( key[KEY_ESC] )
    {
            salir = true;
        }
    }
 
 
 destroy_bitmap(buffer);
 
 return 0;
}
END_OF_MAIN();


Si no quieres copiarlo puedes descargarlo haciendo click aqui

Lo primero de todo en nuestro código es incluir la librería Allegro. A continuación se definen unas constantes que contiene los colores para cada una de las estaciones del año y horas del día.

La función pintacomb(); se encarga de poner sobre la imagen buffer, la imagen img con un grado de opacidad determinada por trans (0-100), multiplicando los colores para producir un color más oscuro.

La función pintatrans(); se encarga de superponer la imagen img sobre la imagen buffer, con un grado de  transparencia que viene determinada por el parámetro trans. Para ello se habilita un modo de mezclador para combinar píxeles de color verdadero translúcido o iluminado.

En el programa principal se inicialíza el Allegro y se define el tamaño de la ventana que va a utilizar el programa. A continuación se declaran e inicializan todas las variables que se van a utilizar en el programa. El bucle principal se estará repitiendo hasta que la variable salir sea verdadero, y por tanto solo se finalizará cuando se pulse la tecla ESC.

El funcionamiento del programa se basa en controlar un contador llamado cont, esta variable en cada ciclo aumenta en uno. Cuando el contador es múltiplo de 500 cambia de hora del día (swd), y cuando el contador es múltiplo de 1500 cambia de estación del año(swe). Según los valores de swd y swe se aplican los colores correspondientes.

Para poder hacer funcionar este programa requiere de las imágenes utilizadas, para ello a continuación tenéis unos enlaces:




A continuación se muestra un vídeo del programa en ejecución.



SHARE
    Blogger Comment

0 comentarios:

Publicar un comentario