목록2022/04/01 (6)
치춘짱베리굿나이스
텍스쳐 입히기 직전에는 벽에 단색을 입혔지만 이번엔 텍스쳐를 입혀보자 벽이 왜곡되어 보여야 하므로 어느 높이에 어떤 텍스쳐 색을 넣어야 할 지 계산해야 한다 동서남북 텍스쳐 저장하기 .xpm 또는 .png 파일을 불러와서 포인터 배열 또는 구조체에 저장해둔다 perpWallDist 구하기 Raycasting 구현 - 화면에 벽 그리기 의 방법으로 perpWallDist를 구한다 벽이 바라보는 위치 구하기 벽이 바라보는 방향이 어느 쪽인지 (동서남북) 에 따라 다른 텍스쳐를 적용해야 하므로, 부딪힌 광선의 방향을 가진rayDirX와 rayDirY, 벽이 위치한 축 (x 또는 y)을 담은 side 변수를 사용하여 벽의 방향을 구한다 벽의 x축 거리의 비율 구하기 광선이 벽의 어느 지점에 닿았는지 구해야 텍스..
모 단풍게임이 생각나는 (ㅡ,,ㅡ;;) 쏠브닥 만우절 이벤트 뱃지 못참지 ㅋㅋ 하고 17성까지만 달리자 했는데 650포인트정도가 순삭 그와중에 내가 이거 알려준 다른사람은 17성까지 250포인트정도밖에 안 써서 더 킹받았다 가챠게임에서 "초면에 죄송하지만 A 뽑으려고 했는데 10연가챠만에 B가 나왔네요 이거 좋은건가요?" 를 보는 기분이었다 18성부턴 쳐다도 안 보려고 잠궈버렸다 옆에서 계속 20연이면 다른 뱃지를 주는데? 한번만 더 달려보자 달려보자 하는거 거들떠도 안보기로 했다
키 이벤트 시야 회전 (←, →) 플레이어의 시야를 좌우로 회전하기 위해선 시선 (dir벡터 : dirX, dirY) 과 카메라평면 (plane벡터: planeX, planeY) 이 같이 회전되어야 한다 시선 (dir) 회전하기 dirX = dirX * cos(theta) - dirY * sin(theta); dirY = dirX * sin(theta) + dirY * cos(theta);카메라평면 (plane) 회전하기 planeX = planeX * cos(theta) - planeY * sin(theta); planeY = planeX * sin(theta) + planeY * cos(theta);캐릭터 이동 (w, a, s, d) 카메라평면 (plane) 과 시선벡터 (dir) 는 방향벡터이며, ..
화면에 벽 그리기 이번 예제에서는 텍스쳐 대신 색상을 사용하여 벽을 그린다 벽의 높이 계산하기 카메라 평면부터 벽까지의 거리를 구했으니 이제 벽의 높이를 계산하고, 실제로 화면에 벽을 그릴 단계에 왔다 가중치 없는 기본값으론, 카메라 평면과 벽 사이 거리가 정확히 1일 때 벽의 높이가 height와 일치한다고 가정한다 화면상 표시되는 벽의 높이는 카메라 평면과 벽 사이의 거리 (perpWallDist) 에 비례한다 이때 취향에 따라 height를 보정하여 사용하여도 상관 없다 height의 가중치가 클 수록 벽의 높이가 높아진다 벽을 그리기 위한 벽의 시작점, 끝점 계산 startPoint = (height / 2) - (lineHeight / 2); if (startPoint < 0) startPoin..
광선 이동거리 계산 및 보정 어안렌즈 효과 방지하기 화면에 벽을 출력할 땐 카메라 평면 (plane ⇒ 선) 기준으로 출력됨에도 불구하고 플레이어 기준 (pos ⇒ 점) 으로 거리를 계산하기 때문에 카메라 평면으로부터 벽까지의 거리가 제각각이 된다 카메라 평면의 끄트머리에 가까울 수록 벽까지의 거리가 과도하게 길어져 실제 카메라 평면까지의 거리보다 훨씬 멀게 연산되며 이는 화면의 왜곡을 초래한다 어안렌즈 효과를 방지하기 위해 광선이 벽에 도달했다 하더라도 광선의 이동거리를 바로 구하지 않는다 어안렌즈 효과를 방지한다면 플레이어 시점 (점) 이 아니라 카메라 평면 (선) 까지의 거리를 계산하므로 광선이 정확히 어느 지점에 부딪혔는지도 구할 필요가 없다 perpWallDist 광선의 적중 지점과 카메라 평면..
반복문의 동작 주의할 점 Lodev는 y가 아래에서 위로 증가하는 좌표계를 사용하였는데, 레이캐스팅 구현 시에 이 부분을 신경쓰지 않으면 이동 방향이나 회전 방향이 반대가 된다 각 벡터의 용도를 확실히 알고 구현해야 플레이어의 현재 상태에서 어떤 방향 또는 값을 갖는지 명확하게 알고 디버깅할 수 있으므로 코드를 작성하기 전 각 변수의 의미를 확실히 알고 가는 것을 추천함 위의 이미지 또한 어떻게 구현하는가에 따라 틀릴 수 있다 1. stepX, stepY 설정 if (rayDirX < 0) stepX = -1; else stepX = 1; if (rayDirY < 0) stepY = -1; else stepY = 1; 현재 광선의 방향에 따라 stepX와 stepY를 설정한다 광선의 방향은 rayDirX..