42: so_long 메모장

ilko·2023년 7월 27일

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만 해주는건데..
    1. 네 방향 대각선 두 지점 체크 2. 한 함수에서 8방향 체크
      - 플레이어 기준 Y, X-> 위:0, 0 || 0, 64 오른쪽: 0, 64 || 64, 64 아래: 64, 0 || 64, 64 왼쪽: 0, 0 || 64, 0
      - 1-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이미지 띄우면 너무 짧아서 프레임 단위로 좀 더 길게 이미지 뽑게 변경.

적 설정

    1. x_size, y_size 변수 활용하여 일정 크기이상의 맵이면 대각선에 적 make. 벽이라면 속도 느리게. - make_enemy()함수 호출.
    1. 컬렉션 다 먹으면 적이 직선으로 따라오기 (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 값 덜 건드릴 수 있음.)

  • 	(https://www.remove.bg/)
  1. 사이즈 줄이기. (애니메이팅 전에 하니 자동 관절 인식 더 잘함.)(먼저 할거면 해상도 많이 깨지는지 테스트 필요.)
  2. png이미지 -> 걷는 모션 영상으로 변경.
  • 	(https://sketch.metademolab.com/)
  1. mp4 영상 gif 변경 (26프레임 많더라) 후 split frame (png output 설정) 후 필요하면 텍스트(get) 넣고  이미지들 저장 해보자. 그 다음에 파일들 다시 올려서 크롭하기. <- 순서는 필요에 따라 계속 바뀔듯?
  • 	(https://ezgif.com/)
  1. png to xpm
  1. 필요에 따라 xpm값 조정.

맨대토리 나누고 .. 모드는 해커톤 때문에 시간이 부족하여 그냥 컬렉션 다 먹으면 문이 보이게 변경 제출

profile
아직은

0개의 댓글