keycode
123 <- 124 -> 125 아래 126 위
a s d w 0 1 2 13
dy
한쪽방향키 계속누르고있을때 계속 이동하게! 지금은 떼고 다시눌르는 방식으로 1칸씩 밖에 못감 ㅠㅠ 이동하려면 타탙타ㅏㄱ탁쳐야댐
image를 그릴때 파일의 경로 + 파일명을 입력해야되는데 파일 경로의 기준은 makefile기준이지 server.c파일이 아니다!
abs함수 정수 절대값 fabs함수 실수 절대값
-
플레이어가 벽을 통과할 수 있다. => map[i][j] == 1 즉 벽에 해당하는 좌표는 이동시키지 않는다.
-
플레이어가 이동하고 난 후에도 이전 좌표에 남아있는 플레이어의 이미지가 사라지지 않는다. => 플레이어 이동완료후(중요) 이전 좌표만 배경으로 다시 렌더링한다.
- 플레이어가 여전히 벽을 통과할 수 있다.
1-2. 플레이어가 벽을 통과하는 상태에서 다른 벽으로 이동할 시엔 잔상이 남지 않는다.
=> 아 move함수를 구현만 하고 사용하지 않았네... 머쓱;
플레이어가 벽을 통과할 수 없게 수정했으며 이동 전에 남아있는 플레이어의 이미지도 삭제함. 또한 첫 맵 렌더링시 벽 이미지와 바닥이미지도 렌더링하게 바꿈.
이제 collective아이템과 exit 출구를 구현할 차례이다.
Collective아이템과 exit을 구현하였다. 맵에 각각 2와 3값을 가질때 해당 이미지를 그리도록 하였다. 수집아이템을 다 모아야만 exit을 통해 게임이 종료된다. 수집아이템의 개수나 맵에서의 위치는 임의로 구현하였다.
맵을 읽어올 수 있도록 gnl을 연동하여야 겠다. 여기서 수집아이템의 개수를 세어야 할 것 같다.
또한 플레이어의 이동모션을 다양하게 만들고 싶은데 어떻게 해야할지 고민해보자.
map폴더에 .ber형식의 맵파일을 생성한다. 해당 맵을 gnl로 읽어온다.
- 맵의 유효성을 검증한다.(직사각형인지? 이상한 값이 들어있지는 않은지?) 1-1) 맵에 오류가 있다면 에러메시지를 출력한 후 제대로 종료되어야 한다.
- 맵의 정보를 int형 2차원 배열로 알맞게 변형한다. 2-1) 맵의 크기가 정해져 있지 않으므로 malloc으로 동적 할당을 해줘야 할 것 같다. 2-2) 또한 게임이 종료될 시 malloc을 한 맵을 free해 줘야 메모리 누수를 막는다.
- 2차원 배열의 메타정보를 알맞은 변수에 할당한다.
과거에 제출한 gnl의 util함수중 libft함수와 같은 이름이지만 다르게 정의된 함수가 있어서 충돌이 일어났다.
어차피 norm v3로 gnl을 업그레이드 해야 했는데 이번기회에 립엪티를 사용하는 gnl을 v3버전으로 먼저 최신화하고 해당 프로젝트에 적용해야 겠다.
gnl을 만지고 있다. 크게 2가지의 문제점이 있다.
-
libft의 함수와 gnl에서 쓰는 libft함수가 겹친다. gnl에서 libft함수를 지워도 so_long폴더에서는 동작할 수도 있다.
-
norm v3를 만들기 위해 코드가 길어지는데 함수의 분량 25줄을 넘어갈 것 같다. 기존 형태 : 특정조건 만족시 함수 실행 바꿀 형태 : 함수내에서 특정조건 불만족시 즉시반환 위 변화를 사용하면 함수를 불러오는 get_next_line의 분량이 줄어들고 호출되는 각 함수의 분량이 늘어난다.
-
추가로 질문하고 싶은 것이 #include로 외부 헤더파일을 가져오고 싶은데 이때 상대경로를 사용할때 파일을 기준으로하는 상대경로가 아닌 makefile의 상대경로로 주어야 한다. 너무 헷갈린다...ㅠㅠ
허;; 생각보다 많이 삽질을 하고있다. 일단 makefile을 gnl부분에도 추가하여 전체 프로젝트에서 잘 연동되게 만들었다. makefile로 만들어진 server를 대상으로 디버거를 돌릴 수 있는 환경 또한 마련했다.
현재 2개의 문제점이 있다.
-
겟넥라에서 *line = ft_strdup(""); 부분에서 오류가 난다. 애초에 line변수 자체라 null값을 가지기 때문에 역참조를 하는순간 에러가 나는 것으로 판단된다. => 애초에 이 문제는 2번에서 말한 잘못된 fd값을 겟넥라내에서 인덱스로 사용했기 때문에 널포인트에 접근하여 segmentaion error가 떠서 그렇다.
-
open의 반환값은 fp변수에 저장되는데 이 값을 int로 한 값이 fd가 맞나? fp랑 fd사이를 변환해야 할 것 같은데 바로 때려박아서 문제가 있을지도......? 아니 fd값이 182959408이 말이되나? static char* 배열에서 fd값을 인덱스로 접근할 수 없을 정도로 큰 값이다....;;;; => fopen은 파일 구조체를 반환하는 것이지 fd를 반환하는게 아니다. => fopen이 아닌 open함수를 이용했더니 정상적인 fd값이 출력되어 해결했다.
=> 결국 open함수를 잘못써서 일어난 헤프닝이었구만!(화살표는 8/24 11:45에 추가)
GNL이 잘동작한다. 이제 GNL을 사용하여 맵 파일을 잘 읽어들여서 int 2차원 배열에 잘 붙이기만 하면 된다.
그런데 2차원 배열의 사이즈는 프로그램에게 미리 정해둘 수 없다. map파일의 크기가 가변적으로 주어지기 때문이다. 따라서 map파일의 크기에 상관없이 이를 담을 수 있게 유동적으로 malloc을 할 수 있도록 해야한다. 내가 생각한 2가지 방법이다.
-
gnl을 첫회차에는 몇개의 행이 있는 지 세고, 세면서 직사각형꼴이 아니면 맵이 유효하지 않은 것이므로 즉시 맵 오류를 반환한다. 2회차에는 행의 개수만큼 malloc을 하여 char **line에 동적할당하고 각 행을 할당하면 될 듯.
-
동적 배열에 해당하는 자료구조를 직접 만든다. 사이즈가 부족하면 기존 사이즈의 2배를 새로 malloc하여 할당하고 이전에 있는 데이터를 새로운 공간에 복사하고 기존 데이터는 free한다.
gnl을 효과적으로 연동하기 위해 동적 배열 자료구조를 구현해 보았다. 결과적으로 들어오는 맵에 해당하는 동적배열을 할당할 수 있게 구현되었다. memory leak만 잡으면 mandatory파트는 끝. 일단 코드 정리하고 보너스 어떻게 구현할 지 좀더 고민해보자. 아 근데 억지로 memory leak을 발생시켰는데(mymap 동적배열 free안해봤음) 누수 감지가 안된다;; 이대로는 leak을 통해 메모리 누수를 막았다고 하기엔 무리가 있다. 어떡하지....
- 보너스리스트
-
적 추가. 주인공이 적에게 닿으면 게임에서 패배합니다.
-
스프라이트에 움직임을 주는 건 어떨까요?
-
쉘 대신, 화면상에 현재까지 움직인 횟수를 출력할 수도 있습니다.
메모리릭이 나타나는지 감지하는 법을 모르겠다. 일단 norm을 맞추기 위해 파일을 3개로 쪼개고 내용을 다듬고 있다.
또한 파일을 실행할때 맵이름을 실행인자로 넣어주는 것을 구현했다. map파일을 다른 디렉토리 안에 넣으면 open함수로 열때 파일경로를 추가해줘야되서 귀찮아진다. 그래서 그냥 makefile과 동일한 디렉토리내에 넣기로 했다. 이걸 구현한 사람의 코드가 있다면 보고싶다.
토큰 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
closed함수 내부에 //system("sudo leaks server > leaks_result; cat leaks_result | grep leaked && rm -rf leaks_result"); 를 넣어체크해볼것