본문 바로가기
컴퓨터 활용/노년에 즐기는 코딩

[스크래치] 스쿼시 게임을 만들면서 라켓과 공의 관계

by easyfly 2023. 2. 18.
반응형

스크래치에서 두 스프라이트 관계

스크래치에서 스프라이트 사이에 소통을 유지하는 방법으로 메시지를 전달하는 방법을 사용합니다. 그런데 상대방과의 관계 속에서 두 스프라이트가 긴밀한 협조가 이루어지면 좋겠다는 필요가 생깁니다.

테니스나 스쿼시에서 공과 라켓 사이의 관계가 그렇습니다. 공이 라켓(여기서는 패들)에 닿으면 반사되어 나가는데, 처음 라켓을 출발하기 전까지는 라켓에 붙어 있어야 하니까요.

패들과 공의 관계

스크래치 기본 스프라이트에 패들(가로로 긴 막대)이 있습니다. 이것을 이용해서 기본 스프라이트의 공(ball)을 쳐내는 기능을 스크래치로 구현하시게요.

패들 위에 붙어있는 공

이 경기에서 공은 3번 주어집니다. 공이 패들에 닿았을 때 반사되는 각도는 왼쪽 45도에서 오른쪽 45도 설정했습니다. 물론 난수를 이용해서. 마우스를 클릭하면 패들에서 공은 떠나 벽을 치고 다시 반사되어 오는 상황입니다. 마우스 클릭 전까지 공은 패들 위에 붙어 있어야 합니다. 공의 위치는 x좌표는 패들과 같지만, y좌표는 위로 조금 올라가야 됩니다. 그렇지 않으면 패들 가운데에 요상하게 붙어있게 됩니다.

아래와 같은 상황이......

패들의 x좌표와 y좌표와 일치했을 때의 문제점

패들을 '맨 앞쪽'으로 순서를 바꾼 것도 공이 패들에 가려져야 자연스러우니까요. 만약 공이 패들 앞쪽에 놓이면 패들에 붙어있다고 생각되지 않겠죠. 각 객체는 레이어를 가지고 있습니다. 패들이 속한 레이어를 맨 앞쪽으로 배치한다는 얘기입니다. 서로 겹쳤을때 다른 객체는 뒤에 서게 됩니다.

 

그리고 패들의 y좌표는 -140으로 고정되어 있고 마우스 x좌표에 의해서만 위치가 달라지기 때문에 세로로 움직이는 것은 막을 수가 있습니다. 마우스가 패들에서 멀리 떨어져 있어도 마우스가 갖는 x좌표만 참조하니까요. y좌표는 항상 '-140'입니다. 패들은 가로로만 움직이면서 그 위에 공이 붙어있는 상황(공 치기 전의 상황)이 됩니다.

패들에 공이 붙어있는 모습

"'마우스를 클릭했는가?'까지 반복하기" 조건을 줬기 때문에 마우스 클릭으로 변화가 있기 전까지는 계속 x좌표와 y좌표가 주어진 패들의 'x좌표', 패들의 'y좌표+15'를 유지하게 됩니다. 마우스의 좌표값을 참조하기 때문에 마우스가 전혀 엉뚱한 위치에 있어도 그 값을 참조하여 벽에 붙어 있게 됩니다.

패들과 공의 관계

마우스 클릭과 동시에 공은 15만큼 지속적으로 움직이게 됩니다. 사방이 벽이기 때문에 벽에 닿으면 반사되면서 공은 움직이게 됩니다.

일단 1단계는 여기까지 코딩하고 그 결과를 보도록 하겠습니다. 스마트폰은 마우스가 없기 때문에 프로젝트가 의도한대로 움직이지 않습니다. 터치가 이뤄지면서 바로 마우스 클릭으로 인지하여 공은 움직이기 시작합니다.

스크래치 코딩 정리

스쿼시 게임의 코딩은 길어집니다. 반복문 및 함수 등이 적용되면서 진행되니까요. 완성되는 과정을 부분부분 나눠서 보시게요.

공에 대한 1단계 코딩
패들에 대한 1단계 코딩



스크래치 프로젝트에서 보기

위 코딩까지를 확인해 보겠습니다.



정리

공이 패들에 붙어있는 상황을 만드는 것은 감지 패널의 'Paddle의 x좌표'에서 해결됩니다. 이게 코드 패널에서 쉽게 찾아지지 않습니다. 코드 패널 '감지'

감지 패널 중 '객체'의 '요소' 부분

객체의 요소에는 다음과 같은 것들이 있습니다.

감지 패널에서 참조하는 객체의 여러 요소들

이 교재는 서정형 님의 '프로그래머가 알려주는 수학'을 참고했습니다.

반응형

댓글