jueves, 27 de septiembre de 2012

Creando un Paint en C++ Parte 1

En este ejemplo, se va a crear un pequeño editor de imagenes. Muy básico similar al paint que trae el windows.
Ejemplo del Editor Paint Koday




#include <allegro.h>
#define ANCHO 640
#define ALTO  480

int soltado = 1;
int accion = 4;
BITMAP *buffer;
BITMAP *dibujo;
BITMAP *botones;

Paso a paso

En la primera linea incluimos la librería con la cual realizaremos el proyecto.

En las lineas 2 y 3, definimos dos constantes ANCHO y ALTO que se utilizan para la resolución de la ventana.

En las lineas 5 al 9, se declaran las variables globales de nuestro ejemplo.

  • Soltado : indica si no esta pulsado el botón del ratón.
  • accion: indica el numero de la acción que esta activa.
  • buffer: imagen que almacena  todo para mostrarse por pantalla.
  • dibujo: contiene la imagen que se crea en el editor.
  • botones: la imagen que contiene los botones del editor.

 int main() 
{ 
 allegro_init();
 install_keyboard();
 install_mouse();
      
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, ANCHO, ALTO, 0, 0);
 
 buffer = create_bitmap(ANCHO, ALTO);
 dibujo = create_bitmap(ANCHO, ALTO);

 botones = load_bmp("bton.bmp",NULL);
 
    clear_to_color(buffer, 0xFFFFFF); 
    clear_to_color(dibujo, 0xFFFFFF); 

 while( !key[KEY_ESC] ){
       blit( dibujo, buffer, 0,0,0,0,ANCHO, ALTO);     
       Pinta_botones();

    //pulsa boton izquierdo
       if(mouse_b&1){ 
           Boton_izquierdo();      
       }else{
           soltado =1; 
       }

    Pinta_cursor();            
    blit(buffer, screen, 0, 0, 0, 0, ANCHO, ALTO);
    }

    destroy_bitmap(botones);
 destroy_bitmap(dibujo); 
 destroy_bitmap(buffer); 
 return 0;
}
END_OF_MAIN();

Funcion Principal paso a paso

 allegro_init();
 install_keyboard();
 install_mouse();
Inicializa el entorno del allegro, e instala el teclado y el ratón.

 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, ANCHO, ALTO, 0, 0);
Se definen las dimensiones de nuestra ventana segun las constantes ancho y alto.
 buffer = create_bitmap(ANCHO, ALTO);
 dibujo = create_bitmap(ANCHO, ALTO);
Se inicializa las imagenes.

botones = load_bmp("bton.bmp",NULL);
Se carga la imagen de los botones

    clear_to_color(buffer, 0xFFFFFF); 
    clear_to_color(dibujo, 0xFFFFFF);
Se rellenan las imágenes buffer y dibujo con el color blanco.

 while( !key[KEY_ESC] ){
       blit( dibujo, buffer, 0,0,0,0,ANCHO, ALTO);     
       Pinta_botones();

    //pulsa boton izquierdo
       if(mouse_b&1){ 
           Boton_izquierdo();      
       }else{
           soltado =1; 
       }

    Pinta_cursor();            
    blit(buffer, screen, 0, 0, 0, 0, ANCHO, ALTO);
    }

El bucle principal que se repite mientras no se pulse la tecla ESC, dibuja el dibujo y los botones  sobre el buffer. Si se pulsa el botón izquierdo del ratón se llama a la función boton_izquierdo(). Pinta el cursor sobre el buffer. Y finalmente se vuelca el contenido del buffer sobre la pantalla para mostrarlo.

destroy_bitmap(botones);
destroy_bitmap(dibujo); 
destroy_bitmap(buffer);
Antes de acabar se debe de liberar la memoria ocupada por las imágenes.

Funciones

Estas funciones se deben de declarar por encima de la función principal para un correcto funcionamiento.

void Boton_izquierdo(){
     if ( Sobre_boton() ){
          cambiaccion();
     }else{
          realizaccion();                    
     }
};
Esta función comprueba si cuando se ha pulsado el botón izquierdo, el cursor esta sobre los botones. La función debe declararse por debajo de las tres funciones que se utilizan dentro de ella, que son Sobre_boton(), cambiaccion() y realizaccion().

void cambiaccion(){};

void realizaccion(){};
Se crean las siguientes funciones, inicialmente vacías para poder compilar el proyecto.

void Pinta_cursor(){
    circle( buffer, mouse_x, mouse_y, 2, 0x000000 );  
    putpixel( buffer, mouse_x, mouse_y, 0x000000);
};
Esta función pinta el cursor.

void Pinta_botones(){
     blit( botones, buffer, 0,0, 0,0,64, 64);  
};
Esta funcion muestra los botones.

bool Sobre_boton(){
     return ( mouse_x >0 && mouse_x < 64 &&
              mouse_y >0 && mouse_y < 64 );
};
Esta función comprueba si el cursor esta sobre los botones, que en este caso se encuentran en la posición de arriba a la izquierda.

Y aquí acaba la primera parte del editor. La semana que viene  pondré la segunda parte con la imagen de los botones y las primeras funciones básicas del editor.

12 comentarios:

  1. si me gusta
    pero la gran pregunta de un millon de pesos funcionara ?

    ResponderEliminar
    Respuestas
    1. si se siguen todos los pasos y no hay ningun error al copiar, debe funcionar

      Eliminar
  2. Muy bueno por cierto me gusto el nuevo banner de tu foro

    ResponderEliminar
  3. Muy Bueno el tutorial, pero por que al compilar el programa se bloquea

    ResponderEliminar
  4. Muy buen tutorial y muy bien explicado.. cosa que se echa en falta en otros muchos... aunque me da error en donde el bool de Sobre_boton... probe a cambiar el bool por void por si era un error.. y luego me da error en la linea siguiente, en el return... me temo que me pase algo en la configuracion del dev, verdad?

    ResponderEliminar
  5. El 5 !! no se como, pero logre arrancar el allegro (aunque en codeblocks, no me mateis)...eso si, con el raton tengo problemas, pero seguire peleando que algo hare :S Y me reitero... muchas gracias por el tuto

    ResponderEliminar
    Respuestas
    1. Lo arrancaste en dev C++?, A mi no me cae en nada el alegro ]:

      Eliminar
    2. En su momento fue en Codebocks... ahora no toco mucho (nada vamos) el allegro... me pase a C# y Unity, y justo esta semana para quitar oxido con C++ me dio por mirar SFML a ver si era mejor que Allegro.. creo que Allegro es mas sencillo quizas, pero si que da guerra tambien!

      Eliminar

Antes de publicar un comentario

Todos los comentarios que se realicen en el blog son moderados.

Debido a esto es muy probable que tu comentario no aparezca de inmediato ya que previamente debe ser revisado para evitar un mal uso (SPAM).

Podrán realizar comentario cualquiera que tenga una cuenta de Google.

Related Posts Plugin for WordPress, Blogger...