Es necesario tener homebrew
Instalar X11.
brew install Xquartx
Ahora ya podemos descomprimir minilibx_opengl.tgz e instalarlo.
cd minilibx_opengl
make
sudo cp mlx.h /usr/local/include
sudo cp libmlx.a /usr/local/lib
sudo reboot
Instalar man de MLX en MacOs.
sudo cp minilibx-linux/man/man3/* /usr/share/man/man3/
Permite crear software gráfico de una manera sencilla y con simples funciones. Permitiendo dibujar y gestionar imagenes con eventos básicos (teclado, ratón).
flag de compilación.
-framework OpenGL -framework AppKit
Para inicialiar la conexión entre el software y la pantalla, asignaremos mlx_init
, de esta manera se creara una conexión entre la ventana y los evento realiados por el usuario.
mlx_ptr
es el argumento identificador devuelto por mlx_int()
void *mlx_init();
void *mlx_new_window ( void *mlx_ptr, int size_x, int size_y, char *title );
int mlx_clear_window ( void *mlx_ptr, void *win_ptr );
int mlx_destroy_window ( void *mlx_ptr, void *win_ptr );
La función mlx_new_window()
crea una nueva ventana en la pantalla, utilizando los argumtos size_x
y size_y
para determinar el tamaño y *title
para el título de la ventana.
mlx_new_window()
devuelve un indicador de ventana void *
que se pude usar con otras llamadas de MiniLibX, ya que la libreria puede usar un numero arbitrario de ventanas separadas.
mlx_clear_window()
y mlx_destroy_window()
respectivamente limpian (en negro) y destruyen la ventana.
mlx_ptr
es el identificador de la conexión y win_ptr
es un identificador de ventana.
void *mlx_xpm_file_to_image ( void *mlx_ptr, char *filename, int *width, int *height );
Devuelve el puntero de la estructura "mlx_img_list_t"
en la cual esta un char puntero con los datos del archivo xpm que le hemos pasado en "filename"
.
int mlx_put_image_to_window ( void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y );
La imagen almacenada se podra mostrar en cualquier ventana especificando el identificador de la conexión, la ventana y la imagen (mlx_ptr, win_ptr, and img_ptr)
son necesarios las cordenadas x, y para definir donde debe colocarse la imagen.
Si vamos a volver a utilizar la variable donde se ha guardado el archivo xpm, es necesario liberar esa varible con mlx_destroy_image
.
int mlx_destroy_image ( void *mlx_ptr, void *img_ptr );
Destruye la imagen pasada por img_ptr
y livera la variable.
Para controlar los eventos, utilizaremos mlx_hook
, MiniLibx utiliza los eventos de la libreria X11, podemos saber mas sobre ellos en el siguiente enlace.
Una lista con todos los evento y las mascaras para utilizar en el siguiente enlace:
void mlx_hook(mlx_win_list_t *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param)
win_ptr
Identificador de la wentana a controlar.
x_event
El evento a controlar.
x_mask
La mascara para el evento a controlar,
funct_ptr
La función que se ejecutara cuendo el evento se active.
param
Parametros que se le pasaran a la función a ejecutar.
Yo solo he utilizado el evento "17" DestroyNotify
que controla el click de cerrar la venta.
con la función exit
casteada en void, y NULL
como parametro ya que exit no necesita.
mlx_hook(game.win, 17, 1L << 0, (void *)exit, NULL);
Para controlar las teclas pulsadas por el usuario
void mlx_key_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param)
mlx_key_hook(game->graphic.win, key_hook, game);
En mi caso yo paso la funcion key_hook
, que recibe el parametro game
pasado mediante la función mlx_key_hook
y recibe keycode
que es el numero de tecla pulsado.
int key_hook(int keycode, t_game *game)
Para conseguir las animaciones utililzo el loop mlx_loop_hook
int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param)
Para que la libreria MiniLibX funcione es necesario poner como ultima función mlx_loop
void mlx_loop(mlx_ptr_t *mlx_ptr)
sudo apt install imagemagick
convert a.png x.xpm
convert x.xpm aa.png
Mejorando la calidad y definiendo cantidad de colores
convert fotograma-000001.png -depth 8 -colors 256 -colorspace RGB -define XPM:color-format='6c' -define XPM:sort=True -define XPM:string=1 -define XPM:mime=1 fotograma-000001.xpm
Para convertir a xpm todos los png que hay en una carpeta
for file in *.png; do convert $file -depth 8 -colors 256 -colorspace RGB -define XPM:color-format='6c' -define XPM:sort=True -define XPM:string=1 -define XPM:mime=1 $file.xpm; done
$ brew info imagemagick
$ brew install imagemagick