Skip to content

nach131/so_long

Repository files navigation

42logo
so_long

total-views total-clone GitHub repo size GitHub top language GitHub last commit license-MIT

visitors

125

gif

instalar MiniLibX en MacOs

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.

minilibx-linux

sudo cp minilibx-linux/man/man3/* /usr/share/man/man3/

MiniLibX

utilizadas

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();

mlx_new_window

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.

XPM images

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".

mlx_put_image_to_window

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.

int mlx_destroy_image()

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.

Eventos

Para controlar los eventos, utilizaremos mlx_hook, MiniLibx utiliza los eventos de la libreria X11, podemos saber mas sobre ellos en el siguiente enlace.

Tipos de eventos

Una lista con todos los evento y las mascaras para utilizar en el siguiente enlace:

42Doc

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)

Animaciones

Para conseguir las animaciones utililzo el loop mlx_loop_hook

int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param)

mlx_loop

Para que la libreria MiniLibX funcione es necesario poner como ultima función mlx_loop

void mlx_loop(mlx_ptr_t *mlx_ptr)

Convertir png a xpm en linux

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

Carpeta de png

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

para mac

$ brew info imagemagick
$ brew install imagemagick

https://imagemagick.org/script/download.php