Rusty Surfers 프로젝트 개발일지 3일차

부드러워진 레인 이동

Posted by ChoiCube84 on January 14, 2024 · 5 mins read

Rusty Surfers 프로젝트

오늘도 Rusty Surfers 프로젝트를 진행하며 새로 짜거나 수정한 코드들에 대해 정리해볼 것이다. Rusty Surfers 게임 코드들은 내 깃헙 레포지토리1를 참고하면 된다.

추가 및 수정 사항

1. 구조체 및 파일 이름 변경

기존의 Character 구조체의 이름을 Player 로 변경하였다. 파일 이름도 character.rs 에서 player.rs 로 변경하였다.

2. 배경 추가

pixabay 에서 바다가 펼쳐진 이미지를 하나 구하여 임시 배경으로 추가하였다. 이 배경은 나중에 변경될 수 있다.

3. 레인 위치 조정

배경을 추가하게 되면서 지평선이 가운데 생기고 하늘과 바다가 구분되었기 때문에, 레인의 위치도 이에 맞게 조정하게 되었다. 화면 아래 절반 만큼에 3개의 레인이 존재하도록 하였다.

4. 원근감 임시 삭제

원래 코드에서는 원근감을 적용하여 화면에서 뒤쪽 레인으로 갈 수록 보드의 크기가 줄어들도록 하였는데, 이를 perspective 라는 변수로 정도를 조정할 수 있게 해둔 뒤, $0.0$ 로 설정하여 원근감을 우선 없애두었다.

게임을 만들고 직접 플레이 해보며 원근감을 설정할 것인지, 한다면 어느정도로 할 것인지 정해나갈 것이다.

5. 보드 물리작용 관련 코드 추가 및 수정

보드의 물리작용과 관련된 코드 수정은 크게 2가지 있다.

첫 번째로는 레인을 이동하는 과정에서 보드가 뚝뚝 끊기듯이 움직이는 것이 부자연스럽다고 생각하여 레인 사이를 부드럽게 이동하도록 설정하였다.

이 과정에서 보드의 상태를 나타내는 PlayerStatus 를 새로 만들었고, 기존의 Character (현 Player) 클래스의 on_the_air 변수를 status 변수로 대체함과 동시에 레인 이동의 로직을 구현하는 데에도 사용하였다. 현 시점에서 점프와 레인 이동은 동시에 이루어질 수 없으며, 좌우 이동은 자유롭게 할 수 있다.

두 번째로는 보드의 점프 정도를 편하게 설정할 수 있게 하기 위해서 jump_customize 함수를 만들었다. 기존에 점프 정도를 조정하려면 점프 시작 시 초기 속도가속도 값을 이리저리 조정하며 감을 잡아야 했지만, 새로 만든 함수는 최대 점프 높이체공 시간 을 인자로 주어 앞의 2개의 값을 자동으로 설정하게 해주었다.

이 함수를 만들기 위해서 관계식을 알아내어야 했고, 아래는 그 식의 유도 과정이다. 궁금한 사람은 펼쳐서 읽어보길 바란다.

식 유도 과정

문자 정의


입력으로 주어지는 것

보드가 튀어오르는 최대 높이: $H$
보드가 점프한 뒤 되돌아오기까지 걸리는 프레임 수: $T$

알아내야 하는 것

보드가 점프를 시작할 때 초기 속도: $v_0$
중력 가속도: $g$

식 전개에 필요한 것

시간에 따른 보드의 위치: $y(t) = \Sigma_{k=0}^t (v(k) \cdot 1)$
시간에 따른 보드의 $y$ 방향 속도: $v(t) = v_0 - gt$

풀이

1. 보드가 되돌아오기까지의 변위는 $0$ 이므로, 다음 식이 성립한다. $$ \begin{align*} y(T) &= \Sigma_{t=0}^T (v(t) \cdot 1) = \Sigma_{t=0}^T v(t) \\ &= \Sigma_{t=0}^T (v_0 - gt) = (T+1)v_0 - \frac{T(T+1)}{2}g = 0. \end{align*} $$ 2. $T+1 > 0$ 이므로 다음 식이 성립한다. $$ \begin{align*} 0 &= (T+1)v_0 - \frac{T(T+1)}{2}g \\ 0 &= v_0 - \frac{T}{2}g \\ \frac{T}{2}g &= v_0 \\ g &= \frac{2}{T} v_0 \end{align*} $$ 3. 보드가 최고점에 도달하는 조건은 $v(t) = 0$ 이며, 이 때 $t = \frac{T}{2}$ 이다. 따라서 다음 식이 성립한다. $$ \begin{align*} y\left(\frac{T}{2}\right) &= \Sigma_{t=0}^{T/2} (v(t) \cdot 1) = \Sigma_{t=0}^{T/2} v(t) \\ &= \Sigma_{t=0}^{T/2} (v_0 - gt) = \left(\frac{T}{2}+1\right)v_0 - \frac{\frac{T}{2}\left(\frac{T}{2}+1\right)}{2}g = H. \end{align*} $$ 4. 2단계에서 얻은 결과를 3단계에서 얻은 식에 대입하면 다음과 같은 결과를 얻게 된다. $$ \begin{align*} \left(\frac{T}{2}+1\right)v_0 - \frac{\frac{T}{2}\left(\frac{T}{2}+1\right)}{2}g &= H \\ \left(\frac{T}{2}+1\right)v_0 - \frac{\frac{T}{2}\left(\frac{T}{2}+1\right)}{2}\left(\frac{2}{T} v_0\right) &= H \\ \left(\frac{T}{2}+1\right)v_0 - \frac{\left(\frac{T}{2}+1\right)}{2} v_0 &= H \\ \frac{\left(\frac{T}{2}+1\right)}{2} v_0 &= H \\ \frac{T+2}{4} v_0 &= H \\ v_0 &= \frac{4}{T+2} H \end{align*} $$ 5. 최종적으로 다음 두 식을 얻게 된다. $$v_0 = \frac{4}{T+2} H$$ $$g = \frac{2}{T} v_0$$


마무리

오늘은 고작 3일차이긴 하지만 역대급으로 많은 코드가 추가되고 수정된 날이었다. Rust 언어도 여러 가지 기능과 특성을 이해해 가면서 점점 익숙해져가는 것 같다.

많은 코드가 추가된 것과는 별개로, 하루종일 수학 식을 알아내느라 머리를 쥐어짜낸 것 같다… 물리 자체가 이산적으로 구현되어 있기 때문에 일반적인 물리 공식을 가져다 쓰면 이상할 것 같았기 때문에 직접 만드려 한 것인데, 예상외로 머리가 아팠다.

개발일지를 유심히 읽어본 사람들은 알겠지만, 오늘 개발일지에는 코드가 첨부되어 있지 않다. 오늘의 일지부터는 더 이상 코드를 일일히 넣지 않기로 했기 때문이다. 글 분량이 뻥튀기 되는 것은 좋지만, 읽는 사람의 입장에서 그 긴 코드를 일일히 볼 것 같지도 않고, 스크롤하느라 손가락만 아플 것 같기 때문에 그냥 안 넣기로 했다. 정확한 코드 수정사항이 궁금하다면 내 레포지토리에서 수정기록을 확인하길 바란다.

오늘의 개발은 여기까지!


1: https://github.com/ChoiCube84/rusty-surfers