typedef struct s_spr
{
t_img idle[2][4]; //정지중 사용할 이미지들
t_img run[2][4]; //움직일때 사용할 이미지들
int i; //반복문을 돌때마다 카운트된다 -> 부드러운 애니메이션을 만들기 위해 사용
int offset;
int x0;
int y0; //방향키를 입력하기 전의 좌표
int x;
int y; //방향키를 입력했을때 도달하게될 좌표
int dir; //움직이려하는 방향
int look; //캐릭터가 현재 보고 있는 방향 (좌우)
int move; //실제 움직이는지 확인
int walk; //벽에 막혀 움직이지는 않지만 걷는 애니메이션은 그리기 위해 사용
int key_block; //캐릭터가 이동중에는 방향키가 block된다.
} t_spr;
맵파일의 정보를 이용해 게임에 필요한 구조체들을 초기화 해줍니다. (자세한 내용은 다른 포스팅에서 설명하겠습니다.)
플레이어, 코인, 적 등의 스프라이트들은 배경을 구성하는 이미지들위에 덧씌워 그려주었습니다.
배경을 각 요소마다 64x64 크기를 가지는 타일을 각 좌표마다 그려주는 방식을 사용했습니다.
이 타일들의 이미지를 초기화해주는 작업이 필요합니다.
png파일을 이용해 이미지를 생성할 수도 있지만 mlx의 자체적인 누수 문제 때문에 xpm파일을 이용해 이미지를 생성하였습니다.
xpm은 X window system에서 사용하는 bit map image로 ASCII text로 단색 이미지를 나타냅니다.
다음 코드들의 from_xpm함수는 mlx.h의 mlx_xpm_file_to_image을 간소화한 함수입니다.
void img_tile(t_game *game)
{
t_img *img;
img = game->tile;
img[FLOOR].ptr = from_xpm(game, "t_0.xpm", &img[FLOOR]);
img[WALL].ptr = from_xpm(game, "t_1.xpm", &img[WALL]);
img[E_LOCK].ptr = from_xpm(game, "e_0.xpm", &img[E_LOCK]);
img[E_UNLOCK].ptr = from_xpm(game, "e_1.xpm", &img[E_UNLOCK]);
}
t_game 구조체에 생성된 tile의 이미지들을 저장합니다.
스프라이트는 애니메이션을 위해 프레임마다 다른 이미지들을 렌더링하도록 합니다.
그러므로 아래와 같이 하나의 스프라이트는 여러가지 이미지를 가집니다.

void img_coin(t_game *game)
{
t_img *img;
img = game->coin;
img[0].ptr = from_xpm(game, "c_0.xpm", &img[0]);
img[1].ptr = from_xpm(game, "c_1.xpm", &img[1]);
img[2].ptr = from_xpm(game, "c_2.xpm", &img[2]);
img[3].ptr = from_xpm(game, "c_3.xpm", &img[3]);
}
필요한 모든 요소를 초기화 했다면 본격적으로 게임을 만들어 봅니다.
타일 하나당 64x64픽셀의 크기를 가지고 있으므로 윈도우의 해상도는 (너비 64, 높이 64)가 됩니다.
game->win_ptr = mlx_new_window(game->mlx_ptr, game->map.width * 64, \
game->map.height * 64, "so_long");