BLOG ARTICLE 핑퐁게임 | 1 ARTICLE FOUND

  1. 2008.05.14 4.2 [중급] 핑퐁 게임 2

이번 장에서는 벽에 반사되는 공을 번갈아 가며 막아 내는 간단한 2인용 핑퐁 게임을 만들어 보겠습니다. 사용되는 키는 아래와 같습니다.

  • q - 플레이어1 Up
  • a - 플레이어1 Down
  • o - 플레이어2 Up
  • l - 플레이어2 Down

q와 a는 플레이어 1이 o와 l은 플레이어 2가 사용합니다.

사용자 삽입 이미지

1. 스크립트/배경 설정
사용자 삽입 이미지
배경과 바, 공 이미지를 페인트 툴에서 직접 그리거나 아래의 압축 파일을 다운로드 받아서 사용합니다.





사용자 삽입 이미지
첫 바 이미지로 Sprite1을 생성한 후에 해당 스프라이트에 마우스 우클릭을 하면 좌측과 같은 메뉴가 나옵니다.

여기서 duplicate를 클릭하면 똑 같은 스프라이트가 Sprite2로 복사됩니다. 


2. 바 스크립트
* 브로드캐스트(broadcast)
스프라이트는 다른 스프라이트에게 동작을 지시하는 등 서로 통신을 할 필요가 있습니다. 이를 위해서 broadcast를 사용합니다. 보내는 쪽에서는 [broadcast [message]] 명령어를 이용해 특정 메시지를 보내고 받는 쪽에선 [when i receive [message]]로 메시지가 발생하였을 때의 동작을 처리할 수 있습니다. 아래의 사용 예를 보시면 이해하기가 쉬울 것입니다.
 
사용자 삽입 이미지

왼쪽은 Sprite1의 스크립트이고 오픈쪽은 Sprite2의 스크립트 입니다. 거의 동일하며 a, q를 입력받는 것과 o, ㅣ을 입력받는 차이만 있습니다.

[if <touching [Sprite3]>] Sprite3은 공 스프라이트 입니다. 공과 바가 충돌했을 경우에는 broadcast를 이용해 reflex란 메시지를 보냅니다.

사용자 삽입 이미지
'reflex'란 메시지를 만들기 위해서 좌측과 같이 broadcast 블럭의 화살표를 클릭한 후에 new 메뉴를 선택합니다. 메시지 이름을 'reflex'로 입력하고 OK버튼을 클릭합니다. 여기서는 [broadcast [message] and wait] 를 사용합니다. 'and wait'가 추가되면 메시지를 발송하고 응답을 받을 때까지 기다립니다. 'and wait' 없이 [broadcast]를 사용하면 공이 바에 충돌하는 동안 계속 메시지가 발생하게 됩니다.


3. 공 스크립트
사용자 삽입 이미지
이전 장에서 설명한 것과 같이 Variables의 [Make a variable]  버튼을 클릭하여 좌측과 같이 ball_x, ball_y, score1, score2 네개의 변수를 생성합니다.

ball_x와 ball_y는 현재 공의 방향을 나타내는 변수 입니다. ball_x가 음수(-)이면 공은 좌측으로 움직이고 양수(+)면 우측으로 움직입니다. ball_y가 음수(-)이면 공이 위쪽으로 양수(+)면 아래로 움직입니다.

score1은 플레이어1의 점수이며 score2는 플레이어2의 점수 입니다. 점수는 스테이지에 보여져야 하므로 좌측의 체크박스를 선택합니다.










스크립트는 아래와 같이 시작시 반복하면서 공을 움직이고 벽과 충돌하는지 검사하는 부분과 플레이어의 바로 부터 메시지를 받았을 경우에 공의 방향을 변경하는 2개의 부분으로 이루어져 있습니다.

사용자 삽입 이미지

1) 변수 초기화
게임이 시작될 때 변수들을 초기화 합니다.

[set ball_x to (2)], [set ball_y to (2)] 초기 공의 방향을 우상단(45도)으로 시작되도록 합니다. ball_x, ball_y에 대입되는 (-)2는 한 프레임당 움직이는 속도 입니다. 숫자가 증가되면 공의 움직임이 빨라 집니다. 그외 score1, score2 점수를 0으로 설정합니다.

2) 공 이동
그 아래있는 [chang x by (ball_x)], [chang y by (ball_y)]는 공의 좌표를 변경해 공이 이동하도록 합니다. 공의 x, y 좌표에 각각 ball_x, ball_y 만큼 더해 집니다.

3) 벽과의 충돌 검사
[if <(y position)  > (170)>] 공이 하단의 벽과 충돌하였을 경우 입니다. ball_y를 -2로 변경하여 공이 반대로 위로 움직이도록 합니다.

[if <(y position)  < (-170)>] 공이 상단의 벽과 충돌하였을 경우 입니다. ball_y를 2로 변경하여 공이 반대로 아래로 움직이도록 합니다.

4) 득점
[if <(x position)  > (220)>] 공이 우측의 벽과 충돌하였을 경우 이며, 플레이어1이 득점을 하게 됩니다. 이 경우에는 공의 위치를 중앙에서 다시 시작하도록 하면 플레이어1의 점수에 1을 증가합니다.

[go to x:(0) y:(0)] 공을 화면의 중앙에 위치하게 합니다.

[set ball_x to (-2)], [set ball_y to (2)] 플레이어1이 득점을 하였기 때문에 이긴 사람이 먼저 공격을 받도록 시작 시 ball_x를 -2로 설정하여 플레이어1쪽으로 진행되도록 합니다.

[change score1 by (1)] 플레이어1의 점수를 1 증가 시킵니다.

아래의 [if <(x position)  < (-220)>] 는 좌측의 벽에 충돌하여 플레이어2가 득점을 한 경우이며 위와 동일한 작업을 합니다.

이제 완료 되었습니다. 깃발(시작) 버튼을 눌러 플레이 해 봅니다. 플레이어 1은 q, a로 플레이어 2는 o,l로 바를 조종합니다. 갈수록 스크립트가 많아져 이전과 중복되는 설명은 생략하였습니다. 어려운 부분은 이전 포스팅을 참조 하시기 바랍니다.


AND