1. 키 입력을 인식하기
먼저 키보드 입력을 인식하기 위해서는 macOS의 키코드를 알아야한다.
https://eastmanreference.com/complete-list-of-applescript-key-codes
Complete list of AppleScript key codes
key codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey codekey code
eastmanreference.com
여기를 참조하여 원하는 키코드를 찾은 후, mlx_hook 함수를 이용하여 해당 키코드에 맞춰 원하는 동작을 실행할 수 있다.
참고로 본 과제에 쓴 키코드는 다음과 같았다.
KEY_ESC 53
KEY_W 13
KEY_A 0
KEY_S 1
KEY_D 2
2. 한 번에 싹, 혹은 하나씩만...
이 부분을 진행하며 가장 고민했던 점은 화면에 표시된 맵을 사용자의 입력에 맞춰 변화시키는 방법이었다.
처음에는 다음과 같은 방법으로 코드를 짤 작정이었다.
1) 키 입력을 받으면 유효한 이동인지 검증 => 벽으로 이동하는 것은 아닌지 검증하기
2) 유효한 이동이라면 현재 캐릭터가 있는 칸의 캐릭터 이미지를 지우기
3) 캐릭터가 이동하고자 하는 칸에 수집물이 있다면 -> 수집물의 이미지 지우고, 수집물 비활성하고, 플레이어의 수집품 카운트++
4) 캐릭터가 이동하고자 하는 칸에 캐릭터의 이미지 다시 생성
그런데 이런 식으로 하면 고려해야 할 부분이 너무 많아지고 코드가 꼬이며 산더미처럼 쌓이게 되었다. 또 보너스를 구현하기 위해서는 여기에 애니메이션을 추가해야 하는데, 애니메이션까지 고려한다면? 무시무시한 코드가 탄생할 것이 틀림 없었다.
한참 고민하던 차에 그냥 맵 전체를 다시 뿌려주면 어떨까 생각을 해보았다. 어차피 애니메이션을 구현하려면 프레임마다 이미지를 새로 쏴줘야 할테니, 필수 사항을 구현할 때도 똑같이 해주면 되지 않을까? 알고보니 많은 분들이 그냥 키 입력을 받을 때마다 맵 전체를 다시 그려주는 방법으로 본 과제를 구현하고 있었다. 나도 대세의 흐름에 따라...
1) 키 입력을 받으면 유효한 이동인지 검증
2) 유효하다면 캐릭터 구조체의 정보 중 위치정보를 알맞게 수정
3) 캐릭터의 위치와 수집품의 위치를 비교해 수집품이 수집되었는지 체크, 수집되었다면 해당 정보 반영
4) 변화된 정보를 바탕으로 맵 새로 그리기
5) 캐릭터가 이동한 곳이 탈출구인지 체크, 탈출 조건이 되었다면 탈출하며 게임 종료.
위와 같은 방법으로 구현하니 코드도 훨씬 간결해지고 좀더 머리 속으로 이해하기 쉬운 코드가 탄생하였다.
static void move_player(int keycode, t_game *game)
{
if (keycode == KEY_W || keycode == KEY_A
|| keycode == KEY_S || keycode == KEY_D)
{
check_wall_and_move(keycode, game);
check_collectible(game);
draw_map(game);
check_exit(game);
}
}
'42 > 42cursus' 카테고리의 다른 글
[push_swap] 2. 스택 연산 구현하기 (0) | 2022.01.12 |
---|---|
[push_swap] 1. 입력 검증 및 스택 만들기 (0) | 2022.01.12 |
[so_long] 3. 게임 초기화하기 (0) | 2021.10.19 |
[so_long] 2. mlx 라이브러리 사용하기 (0) | 2021.10.04 |
[so_long] 1. 맵 파싱하기 (0) | 2021.09.27 |
댓글