[so_long] 3. 게임 초기화

aqualung·2023년 1월 26일

🖥 so_long

1. 초기화

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;

맵파일의 정보를 이용해 게임에 필요한 구조체들을 초기화 해줍니다. (자세한 내용은 다른 포스팅에서 설명하겠습니다.)

2. 이미지파일

플레이어, 코인, 적 등의 스프라이트들은 배경을 구성하는 이미지들위에 덧씌워 그려주었습니다.

배경을 각 요소마다 64x64 크기를 가지는 타일을 각 좌표마다 그려주는 방식을 사용했습니다.

이 타일들의 이미지를 초기화해주는 작업이 필요합니다.

png파일을 이용해 이미지를 생성할 수도 있지만 mlx의 자체적인 누수 문제 때문에 xpm파일을 이용해 이미지를 생성하였습니다.

xpmX window system에서 사용하는 bit map imageASCII text로 단색 이미지를 나타냅니다.

다음 코드들의 from_xpm함수는 mlx.hmlx_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의 이미지들을 저장합니다.

스프라이트는 애니메이션을 위해 프레임마다 다른 이미지들을 렌더링하도록 합니다.

그러므로 아래와 같이 하나의 스프라이트는 여러가지 이미지를 가집니다.

Screen Shot 2023-01-27 at 1 07 08 PM

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]);
}

필요한 모든 요소를 초기화 했다면 본격적으로 게임을 만들어 봅니다.

3. 윈도우

타일 하나당 64x64픽셀의 크기를 가지고 있으므로 윈도우의 해상도는 (너비 64, 높이 64)가 됩니다.

game->win_ptr = mlx_new_window(game->mlx_ptr, game->map.width * 64, \
			game->map.height * 64, "so_long");

0개의 댓글