가끔 구조체에서 접근해야하는 변수가 많아 분기처리가 까다로울 때가 있다. 예를들어 아래의 구조체를 보자.

캐릭터 에셋들이 가져야 하는 sprite 정보들을 구조체에 저장해 두었다. 구조를 설계할 때, 특정 상황에서 어떤 sprite를 써야 하는지 직관적으로 알 수 있도록 하고 싶었다.

typedef struct s_asset
{
	t_canvas		*background_black;

	t_font			*font_default;

	t_sprite		*spr_player_blue_idle_right;
	t_sprite		*spr_player_blue_idle_left;
	t_sprite		*spr_player_blue_move_right;
	t_sprite		*spr_player_blue_move_left;
	t_sprite		*spr_player_blue_attack_right;
	t_sprite		*spr_player_blue_attack_left;
	t_sprite		*spr_player_blue_die_right;
	t_sprite		*spr_player_blue_die_left;

	t_sprite		*spr_player_red_idle_right;
	t_sprite		*spr_player_red_idle_left;
	t_sprite		*spr_player_red_move_right;
	t_sprite		*spr_player_red_move_left;
	t_sprite		*spr_player_red_attack_right;
	t_sprite		*spr_player_red_attack_left;
	t_sprite		*spr_player_red_die_right;
	t_sprite		*spr_player_red_die_left;
	...
}              t_asset;

분기로

변수에 접근하기


각 상황마다 다른 sprite를 적용해야 하는데 이걸 분기로 처리한다면 아래와 같이 될 것이다.

t_sprite *scr_get_spr_player(t_asset *asset, int type, int color, int dir)
{
	if (color)
	{
		if (type == 0)
		{
			if (dir == 1)
				return (asset->spr_player_blue_idle_right)
			else
				return (asset->spr_player_blue_idle_left)
		}
		else if (type == 1)
		{
			if (dir == 1)
				return (asset->spr_player_blue_move_right)
			else
				return (asset->spr_player_blue_move_left)
		}
		else if (type == 2)
			{
			...
		}
		else
				{
			...
		}
	}
	else
	{
		// 위랑 같음
	}
}

물론 헤더 파일을 배열로 만든다면 해결할 수 있다. 아래의 코드를 살펴보자

typedef struct s_asset
{
	t_canvas		*background_black;

	t_font			*font_default;

	t_sprite		*spr_player[16];
	...
}

하지만 spr_player[16] 와 같이 배열을 사용한다면, 헤더 파일이 어떤 sprite들을 가지고 있는지 직관적으로 알 수 없다.

그리고 0, 1, 2와 같이 적어두면 이해하기 어렵기 때문에 #define BLUE_IDLE_RIGHT 0 와 같이 선언을 해주어야 하는데, 코드를 볼 때, 해당 선언이 되어있는 부분과 함께 보지 않으면 이해하는데 상당히 불편했다.