게임 로직을 프로그래밍할 때 많은 수학 원리가 쓰이는데요, 이번에는 게임 오브젝트의 움직임을 정의할 때 벡터가 어떻게 사용되는지 알아보겠습니다.
움직이는 축구공에 고양이가 부딪히지 않도록 고양이 위치를 마우스로 바꾸면서 오랫동안 버티는 스크래치 게임을 만들어봅시다. 게임 화면과 게임 규칙은 다음과 같습니다.
<게임 화면>
<게임 규칙>
●게임을 실행하면 고양이 오브젝트는 마우스 포인터를 따라 움직인다. ●공 오브젝트는 화면 안에서 움직이는데 상하좌우 화면 가장자리에 부딪히면 튕겨 나온다. ●플레이 시간이 왼쪽 위에 표시되고 고양이 오브젝트가 공 오브젝트와 부딪히면 게임이 끝난다.
<고양이 오브젝트 코드>
➊ 게임을 시작하면 고양이 오브젝트의 크기를 75%로 줄이고 타이머를 초기화 한다. ➋ 마우스 위치에 고양이 오브젝트가 오도록 한다. ➌ 공 오브젝트와 부딪히면 게임이 끝난다.
<공 오브젝트 코드>
➊ 게임을 시작하면 공 오브젝트가 좌표 (-200, 0)에 위치하도록 정의하고, 움직이는 방향의 각도를 무작위로 정한다. ➋ 매번 20만큼 움직이면서 화면 가장자리에 부딪히면 튕겨 나온다.
공 오브젝트가 상하좌우 가장자리에서 튕겨 나오는 것을 벽에 닿으면 튕기기라는 블록이 모두 처리해 줍니다. 그런데 이 명령어는 스크래치에는 있지만 대부분의 텍스트 기반 프로그래밍 언어에는 없습니다. 이 로직을 벽에 닿으면 튕기기 블록을 사용하지 않고 코딩하려면 어떻게 해야 할까요?
먼저 공 오브젝트의 이동 방향을 정의하는 단위벡터(dx, dy)와 빠르기를 정의하는 값(speed)으로 공 오브젝트의 움직임을 정의해봅시다. 만약 공오브젝트가 움직이는 방향의 각도를 ‘θ’라고 하면 이동 방향을 정의하는 단위벡터는 dx = cos(θ), dy = sin(θ)로 계산할 수 있습니다.
<벽에 닿으면 튕기기 명령어 없이 짠 공 오브젝트 코드>
➊ 공 오브젝트의 크기를 고려하면서 공 오브젝트가 상하좌우 화면 가장자리 중 어디에 부딪혔는지를 체크하고 dx 또는 dy 값의 부호를 바꾼다. ➋ ChangeDirection 함수로 dx 또는 dy 값의 부호를 바꾼다.
여러분은 블록을 사용하지 않고 어떻게 코딩하겠어요? 위 코드에도 보완할 부분이 있는데요, 어떤 부분일까요? 질문의 답을 댓글로 주세요. 좋은 의견을 낸 회원에게 게임 관련 선물을 드립니다! 지금 바로 참여하세요!