본문바로가기
[게임 디자인 씽킹] 게임 로직에서 벡터의 역할 탐색하기!
수학동아 2020.07.27

게임 로직을 프로그래밍할 때 많은 수학 원리가 쓰이는데요, 이번에는 게임 오브젝트의 움직임을 정의할 때 벡터가 어떻게 사용되는지 알아보겠습니다.

 

움직이는 축구공에 고양이가 부딪히지 않도록 고양이 위치를 마우스로 바꾸면서 오랫동안 버티는 스크래치 게임을 만들어봅시다. 게임 화면과 게임 규칙은 다음과 같습니다.

 

<게임 화면>

<게임 규칙>

●게임을 실행하면 고양이 오브젝트는 마우스 포인터를 따라 움직인다. ●공 오브젝트는 화면 안에서 움직이는데 상하좌우 화면 가장자리에 부딪히면 튕겨 나온다. ●플레이 시간이 왼쪽 위에 표시되고 고양이 오브젝트가 공 오브젝트와 부딪히면 게임이 끝난다.

 

 

<고양이 오브젝트 코드>

➊ 게임을 시작하면 고양이 오브젝트의 크기를 75%로 줄이고 타이머를 초기화 한다. ➋ 마우스 위치에 고양이 오브젝트가 오도록 한다. ➌ 공 오브젝트와 부딪히면 게임이 끝난다.

 

<공 오브젝트 코드>

➊ 게임을 시작하면 공 오브젝트가 좌표 (-200, 0)에 위치하도록 정의하고, 움직이는 방향의 각도를 무작위로 정한다. ➋ 매번 20만큼 움직이면서 화면 가장자리에 부딪히면 튕겨 나온다.

 

 

공 오브젝트가 상하좌우 가장자리에서 튕겨 나오는 것을 벽에 닿으면 튕기기라는 블록이 모두 처리해 줍니다. 그런데 이 명령어는 스크래치에는 있지만 대부분의 텍스트 기반 프로그래밍 언어에는 없습니다. 이 로직을 벽에 닿으면 튕기기 블록을 사용하지 않고 코딩하려면 어떻게 해야 할까요?

먼저 공 오브젝트의 이동 방향을 정의하는 단위벡터(dx, dy)와 빠르기를 정의하는 값(speed)으로 공 오브젝트의 움직임을 정의해봅시다. 만약 공오브젝트가 움직이는 방향의 각도를 ‘θ’라고 하면 이동 방향을 정의하는 단위벡터는 dx = cos(θ), dy = sin(θ)로 계산할 수 있습니다.

 

<벽에 닿으면 튕기기 명령어 없이 짠 공 오브젝트 코드>

➊ 공 오브젝트의 크기를 고려하면서 공 오브젝트가 상하좌우 화면 가장자리 중 어디에 부딪혔는지를 체크하고 dx 또는 dy 값의 부호를 바꾼다. ➋ ChangeDirection 함수로 dx 또는 dy 값의 부호를 바꾼다.

 

여러분은 블록을 사용하지 않고 어떻게 코딩하겠어요? 위 코드에도 보완할 부분이 있는데요, 어떤 부분일까요? 질문의 답을 댓글로 주세요. 좋은 의견을 낸 회원에게 게임 관련 선물을 드립니다! 지금 바로 참여하세요!

 

클릭하면 스크래치 코드를 볼 수 있어요!

 

첫 댓글의 주인공이 되어 보세요!
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911