본문 바로가기
42/42cursus

[so_long] 3. 게임 초기화하기

by jaemjung 2021. 10. 19.

1. 구조체 이용하기

 

일단 본 프로젝트의 경우 사용해야 하는 변수들이 아주 많고 복잡하므로 구조체를 잘 이용하여 분리해주면 편리하다. 나는 먼저 game이라는 큰 구조체를 하나 만든 후 해당 구조체를 이용하여 게임에 필요한 정보들을 저장해주기로 했다.

typedef struct s_game
{
	void			*mlx_ptr; 
	void			*win_ptr; 
	char			**map; // 2차원 배열에 저장된 맵
	int			map_height; // 맵의 높이
	int			map_width; // 맵의 너비
	int			number_of_collectibles; //총 수집물의 갯수
	t_tiles			tiles; // 타일의 이미지 포인터를 담은 구조체
	t_player		player; // 플레이어와 관련된 정보를 담은 구조체
	t_exit			exit; // 출구와 관련된 정보를 담은 구조체
	t_collectible		*collectibles; // 수집물의 정보를 담은 배열
}				t_game;

초기화의 순서는 다음과 같다

1. 임시 연결 리스트에 담겨있던 맵 정보 **map에 2차원 배열 형태로 변환하여 저장
2. mlx및 window 초기화
3. image 초기화
4. 2차원 맵을 읽어들여 플레이어, 출구, 수집품의 정보를 각각 구조체 내부의 변수에 저장
5. 읽어들인 정보를 바탕으로 window에 맵 표시

이 부분은 mlx의 기능만 제대로 다룰 줄 안다면 별 문제 없이 진행할 수 있는 부분이라 쉽게 넘어갈 수 있었다.

 

2. 맵을 그리기 위한 고민 

 

맵을 그리기 위한 방법을 고민하며 처음에는 다음과 같은 방법으로 맵을 그려줄 생각이었다.

1) 일단 2d 맵 배열을 순회하며 맵 그리기
2) 후에 키 입력을 받으면 -> 2d 맵 배열의 정보를 수정
3) 2d 맵 배열의 수정된 정보를 바탕으로 다시 맵 그려주기

그런데 코딩을 하다보니, 맵에서 정적인 요소인 벽과 빈 공간은 그리는데 별 문제가 없었지만 동적인 요소를 처리하기 위해서는 위치 뿐만 아니라 플레이어가 수집한 수집품, 수집품의 경우 수집된 여부, 출구의 경우 개폐 여부와 같은 것들이 맵을 그리는 것에 연관되어 있어서 2차원 배열이 충분한 정보를 담지 못할 뿐더러 그것을 직접 수정하며 코드를 짜는 것이 매우 복잡한 일이 되어버렸다.

 

따라서 정적인 요소(벽과 빈 공간)은 2d맵을 직접 순회하며 그려주고, 플레이어, 수집품, 출구는 각 정보를 담은 구조체를 초기화 한 후, 해당 구조체를 수정/조회하면서 맵을 그려주도록 했다.

 

그런데 지금 생각해보니 이 과제 같은 경우는 게임을 진행하며 변화된 맵을 따로 저장할 필요가 없으니 이런식으로 코드를 짠다고 하지만, 맵의 변화를 저장하는 경우에도 이런식으로 짜는 것이 맞을까?하는 의문이 들기도 한다.

 

 

 

댓글