flow
메인 인자 파싱
-
arc가 2가 아니라면 에러뜨게(3이상이면 다음 맵 넘어가게 할까?) -> bonus
-
arc가 6이상이라면 맵이 너무 많으니 에러뜨게 -> bonus
-
perror, strerror 공부. -> 에러 메세지(매크로) 문자열을 받고, void 리턴 하는 error함수를 만들어서
각 에러 메세지 매크로 체크해보고 exit(1) 호출해서 프로세스 끝내기. 필요하다면 free 해주는 flag 넣어주자.
error()와 free_error()로 나누자.
맵 파일 gnl로 char ** 형으로 데이터 가져오기 (후에 편하게 다루기위해 2차원으로 가져오기)
-
gnl에서 맵 전체 불러오고 체크 or 라인마다 갖고와서 체크 (직사각형인지 값 가져오면서 체크 가능.)
- 라인마다 갖고오니 코드가 복잡해짐 ..어차피 체크 나중에 하면되니 한번에 불러들이고 개행 기준으로 split..다시하자.
맵 파일(.ber) 유효성 체크.
- close(fd) 시점은 맵 파일 다 가져온 후 바로 해도 될듯?
- 맵은 최대 5개까지 받을 수 있고 다음 단계 넘어가면 새로 시작하게 다 malloc을 .. 전의 데이터 아무것도 프린트 안되면 “다음 단계” 흐름이 없는데 흠 …
루피 표정으로 구분? 큰 효과 없이 일만 많아질듯. 구조체에 맵 개수만큼 malloc하고 map_num 변수로 맵 단계 인덱스 관리하자.
- 테스트를 위해 .ber파일 테스트 하는 테스트 함수 만듬
- 빈 파일, 직사각형, 벽으로 둘러쌓여 있는지, 유효한 경로 있는지
- gnl에서 널가드는 하지말자. gln에서 에러처리 하지 않는이상 malloc에러인지 EOF를 만난건지 모르니까. -> malloc에러면 뒤에 함수에서 에러가 떠서 괜찮다.
- 유효한 경로가 있는지 찾는 dfs함수를 한 함수로 만들기 위해서 고통이였는데 맥주 두 캔 마시면서 하니까 바로 됐네. 왜 됐지? 간단하게 E, C 개수만 생각해서 그런가?
- 그리고 우리가 하는 dfs는 dfs가 아닌 것 같다. 모든 경로를 탐색하는게 아닌 한번만 다 돌아보고 E, C 카운트만 세서 체크를 해보니까.
mlx 활용하여 윈도우창 init
x, y 좌표를 픽셀단위로 만들자. 그럼 각 칸의 사이즈(문자 하나)는 32가 되겠지? (사이즈는 아마 32 32)
그리고 각 이미지를 mlx를 사용해서 put 할 때는 32를 해줘서 보내주면 될듯?
그럼 각 문자들을 32해서 맵 데이터를 만들어야겠구만? or 현재 있는 맵에서 약0.04정도 픽셀 (소수 사용하는 방법 1/32 = 0.03125로 나쁘지 않을듯?)
- 그럼 플레이어가 컬렉션에 만났을 때, 매번 플레이어 상하좌우 +32 위치를 체크해서 C를 만나면 컬렉션 이미지를 없애는 방법으로 해야할듯. 그럼 플레이어는 맵과 독립적으로 움직일 수 있게 해야할듯.
-
훅이 들어오면 플레이어 범위 체크해서 벽이면 못가게 컬렉션이면 그 인덱스 destoy image하고 정수만큼의 인덱스(캐스팅해서 소수점 덜어내거나 50%만큼 +하거나) 에 배경띄우고 플레이어는 +1 위치에 띄우기 -> 그럼 컬렉션의 주소도 필요한데 ..
-
int mlx_key_hook(void win_ptr, int (funct_ptr)(), void *param);
->param은 우리가 준 함수 포인터에서 값을 변경한다면 가능하게끔 해주는 변수.
-
2 픽셀씩 움직이게 하고 이미지를 전체를 찍어주는게 아닌 플레이어가 움직인 위치를 고려해서 이미지를 바꾸고싶은데 …
- destroy 하면 이미지 객체가 아예 나가리 돼서 다시 이미지의 주소를 받아오는 방법을 생각했지만 매번 파일 오픈하면 시간적으로 너무 비효율적일것같다.
- 그래서 생각한게 이미지를 한 인덱스에 여러번(배경, 플레이어 put 하듯이) 찍어 주는 방법을 생각했는데 메모리가 계속 쌓일까봐 걱정.
- 실제로 플레이어가 움직이면 잔상(바로 전 프린트 된 이미지)이 남아있다.
- 메모리 사용률로 간단하게 테스트 해봤는데 늘어나진 않는다 …… mlx_put_to_window 함수가 메모리 할당을 하는게 아닌 이미지에 대한 정보가 완전히 픽셀 단위로 바뀌어서 프린트 하는거면
- 단지 이미지를 win_ptr 주소에 픽셀단위로 그려내는거니 중첩이 아닌 다시 그리는 느낌일듯?
- 많이 고민 해봤지만 위가 결론.
- 그렇다면 나오는 잔상을 어떻게 해결할까 -> x, y 의 좌표를 64로 나누고 *64를 다시 해주면 플레이어의 현재 (맵 파일상의)인덱스를 찾는다 ………
- > 그건 의미 없다… 흠 블록(인덱스)를 여러개 밟고 있을 수 있으니 함수 따로 빼자.
- >64로 나눈 나머지가 있다면 + 인덱스+1 해서 배경 초기화 해주면 될듯/?
- > 렌더링을 해준다는 개념이라 픽셀단위로 그려질듯.
-
바보같이 check_others 함수에서 무브 상태값만 변경하면 되는걸 다른걸로 수정하다가 시간 낭비함.
-
위에 대부분은 해결이 안됐다 … 벽에서 떨리는건 부스터로 빠르게 벽을 만나서 (얼음 컨셉이면 얼음이라 문제라고 하자)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/* p_speed: 2, boost: 11(10부터 감소) ->를 이용해서 플레이어의 최소 스피드 2 보장해주기 ..픽셀 난리남.
대각선 이동, 플레이어 스피드, 부스트 조정
- 플레이어 구조체 만들고 mlx_hook()함수로 플레이어 상태값 변경. mlx_loop_hook()함수로 매 프레임마다 상태값 보고 렌더링.
- 속도와 부스트 값 보기 좋은 정도로 설정.
- 하 ……벽 가까이서 부스터 쓰고 박으면 관성 있다고하자.. 벽 일 때 p_pos[X, Y] 값 보정 해줘야할듯. 픽셀 튐.(부스터 때문) <- 보정 식 때문에 문제가 많아서 일단 지우고 진행.
- > 벽 만났을 때 4 픽셀 범위 안이면 1리턴하게 했는데 … 네 방향 체크 추가하니까 개판됐다.
- > 구조체에 만들어놓을까? 생각해보면 + 64만 해주는건데..
- 네 방향 대각선 두 지점 체크 2. 한 함수에서 8방향 체크
- 플레이어 기준 Y, X-> 위:0, 0 || 0, 64 오른쪽: 0, 64 || 64, 64 아래: 64, 0 || 64, 64 왼쪽: 0, 0 || 64, 0
- 1-1. 대각선 우짜노 ..
- > 많은 보정과 조건들 했는데 뭐가 문제있고 그래서 대각선 네 방향 추가하고 값 수정중 ..
——————————————————————>무브 보정값들은 구현 거의 다 하고 이미지 적용 후 하자. -> 벽 반동 없애려면 체크 함수에서 한 조건에서 리턴 때리면 되긴 하는데 그럼 벽에 꽂히는 상황이 있음 ./..
- 부스트 게이지 숫자로 플에이어 머리위에 찍기.
———————————————————————->아 놈 때문에 2차원 배열 안에 인덱스는 구조체->구조체->배열의 n번째의 값을 해주는게 너무 ..
—————————>08M07D 함수를 나누고 합치는 과정에서 키 프레스하면 벽보다 + 2만큼 더 연산이 돼서 벽에 꽂혀버렸는데, 과거의 내가 한 걸 보니 map_pos(각 _yx변수) 에서 변경 된 값으로 움직였기 떄문에 각 함수에서 다시 p_pos로 _yx에 값을 넣는 과정을 하니 됐다 .
!!!!!!!!!!!!!!! 플레이어 보정 (map_pos, player.pos[2] 보정)
- player_speed를 맵 포지션 값에 넣어줘야 제대로 된 체크가 되는데 + 64도 체크하는 RIGHT, DOWN은 벽 만났을 때 보정을 조금 다르게 해줘야한다.
- 하 .. 위 왼쪽은 벽을 만났을 때 player.pos[Y, X]에서 64로 나눈 나머지를 빼줘야하고, 아래 오른쪽은 64에서 player.pos[Y, X]를 64로 나눈 값을 더해줘야한다. 그리고 player.pos[Y, X]- -;를 해서 딱 나눠 떨어지는 경우를 없앤다. -> 그럼 껴서 안들어가짐… 안하면 딱 나눠떨어지는 값에
- 근데 대각선인 경우 문제가 생긴다 … 함수 하나에 넣어보고 같은 결과면 8방을 체크해보자.
부스트
- 게이지 바 추가.
- boost 켜져 있을때만 run이미지 띄우면 너무 짧아서 프레임 단위로 좀 더 길게 이미지 뽑게 변경.
적 설정
- x_size, y_size 변수 활용하여 일정 크기이상의 맵이면 대각선에 적 make. 벽이라면 속도 느리게. - make_enemy()함수 호출.
- 컬렉션 다 먹으면 적이 직선으로 따라오기 (ex: 적의 속도는 2(벽) 4(길) 6(플레이어 쫓기). 직선말고 그냥 랜덤으로 움직이되 속도만 빠르게 하자..
top 70 324
게임 끝(엔딩)
- 적을 만나면 end_game()함수를 호출했는데 계속 렌더링이 안됐다 … 다른 것들은 정상적인지 확인 해봤지만 렌더링이 문제.
- 혹시 mlx_loop_hook()함수가 img_put()함수를 일괄적으로 처리할까 싶어서 렌더링하고 리턴하고 다음 렌더링에 end_game() 호출하니 렌더링 잘 됨!
- 해피엔딩 새드엔딩은 x, y 사이즈의 반에 풋하고(너무 작은 맵은 일반적이지 않으니 UB로 간주) sleep(3) 하자.
이미지
1. png파일 구하기. -> 이모티콘샵 (크롱 이미지는 누끼까지 땀)
2. 누끼 따기. (나중에 xpm 값 덜 건드릴 수 있음.)
- 사이즈 줄이기. (애니메이팅 전에 하니 자동 관절 인식 더 잘함.)(먼저 할거면 해상도 많이 깨지는지 테스트 필요.)
- png이미지 -> 걷는 모션 영상으로 변경.
- mp4 영상 gif 변경 (26프레임 많더라) 후 split frame (png output 설정) 후 필요하면 텍스트(get) 넣고 이미지들 저장 해보자. 그 다음에 파일들 다시 올려서 크롭하기. <- 순서는 필요에 따라 계속 바뀔듯?
- png to xpm
- 필요에 따라 xpm값 조정.
맨대토리 나누고 .. 모드는 해커톤 때문에 시간이 부족하여 그냥 컬렉션 다 먹으면 문이 보이게 변경 제출