이번 장에서는 마우스를 이용해 원반을 조준하여 맞추는 클레이 사격 게임을 만들어 보겠습니다. 게임 시작, 게임, 게임종료 화면을 추가하고 각각 시작과 다시시작 버튼을 클릭하여 게임을 시작할 수 있습니다. 5 스테이지까지 나오는 원반을 마우스를 조준하고 클릭하여 최대한 많이 맞추는 게임입니다.

사용자 삽입 이미지

1. 변수 생성
Variables에서 make a variable 버튼을 클릭하여 아래와 같은 변수들을 생성합니다.

  • gameStep - 0은, 12는 게임중, 2는 게임 종료 상태를 의미합니다.
  • stage - 1부터 5까지 현재 스테이지를 나타냅니다.
  • point - 플레이어가 맞춘 원반 수입니다.
  • count - 현재까지 발사 된 원반 수입니다.
  • thick - 프레임 카운터 입니다.
  • targetLive1 - 원반1의 상태이며 0은 대기, 1은 발사 중, -값은 파괴중입니다.
  • targetLive2 - 원반2의 상태입니다.
  • targetLive3 - 원반3의 상태입니다.
  • targetLive4 - 원반4의 상태입니다.
  • targetLive5 - 원반5의 상태입니다.
  • targetLive6 - 원반6의 상태입니다.

사용자 삽입 이미지
플레이어에게는 state와 point만 보여줍니다. 두 변수를 제외하고 나머지 변수의 출력선택의 체크를 해제합니다.


2. 스프라이트 생성
1) 커스튬 등록
좌측의 압축된 이미지 파일을 다운로드 받으신 후에 아래와 같이 스프라이트를 등록합니다. 

사용자 삽입 이미지

배경 이미지는 좌측과 같이 open, close, bg 세개의 이미지를 추가합니다. 원반 스프라이트들(sprite4~sprite9)은 우측과 같이 t1(t2, t3)의 깨지는 원반이 커스튬을 추가합니다.

사용자 삽입 이미지

2) 배경음/효과음 설정
사용자 삽입 이미지
배경의 Sounds 탭을 클릭하여 아래와 같이 대기, 게임, 종료 화면에서 배경음악으로 사용될 음악 파일을 등록합니다.

여기서 사용된 배경음악은 스크래치가 있는 폴더의 Media/Sounds/Music Loops에 있는 음악파일을 사용했습니다.

각자 취향에 맞는 음악 파일을 넣으셔도 됩니다.





접시가 깨질 때 사용되는 효과음은 스크래치에서 스프라이트 생성시 기본으로 등록되는 pop 사운드를 사용합니다. 다른 효과음을 원할 경우에는 하드디스크에 있는 음악 파일을 등록(Import)하거나 새로 녹음(Record)하여 사용하실 수 있습니다.

3. 배경화면 스크립트
1) 게임 초기화
사용자 삽입 이미지
플레이어가 '시작' 또는 '다시시작' 버튼을 클릭하였을 때 발생되는 'initGame' 메시지에 응답하는 스크립트 입니다.

각종 필요한 변수들을 초기화하고 배경음을 중단합니다. 그리고 현재 배경 이미지를 게임실행 화면(bg)으로 변경합니다.





2) 게임 종료
사용자 삽입 이미지
5 스테이지가 끝나고 게임이 완료되었을 경우 발생되는 closeGame 메시지에 응답하는 스크립트 입니다.

배경 이미지를 게임종료(close) 이미지로 변경하고 배경음을 중단합니다.

3) 배경음 출력
사용자 삽입 이미지
사용자가 시작버튼을 클릭하면 실행되는 스크립트 입니다. gameStep을 0(대기화면)으로 설정하고 이전에 플레이되는 배경음이 있다면 중지합니다. 그리고 배경 이미지를 게임대기(open) 이미지로 변경합니다.

forever내부의 스크립트는 무한루프로 반복되면서 각각의 gameStep에 맞는 배경음을 출력합니다.

* jungle - 게임중(gameStep=1) 배경음악
* Xylo1 - 게임종료(gameStep=2) 배경음악
* Cave - 게임대기(gameStep=0) 배경음악







4) 게임 제어
게임 진행 시(gameStep=1)에 실행되는 스크립트들입니다. 무한루프를 반복하면서 thick을 1씩 증가시킵니다.

사용자 삽입 이미지

[if <[[thick] mod [(10) + [[(5) - [stage]]*(3)]]]=(0)>]
원반이 발사될 시점을 검사하는 스크립트 입니다.

  • thick mod (식): 증가되는 thick과 (식) 값의 나머지를 구해 그 값이 0일 경우에만 원반을 발사 합니다. (식) 값이 작을 수록 원반이 자주 나타납니다.
  • 10+(5-stage)*3: stage는 1 부터 시작되며 1씩 증가됩니다. 1 스테이지에서는 22의 값을 가지며 점점 감소되어 최종 5 스테이지에서는 13의 값을 갖습니다.

사용자 삽입 이미지
좌측은 위의 스크립트에서 원반을 발사하는 검사가 참(1)일 경우에 실행되는 스크립트입니다.

이 스크립트는 6개의 원반들의 상태를 검사하여 현재 발사되지 않은 원반(targetLive#번호 == 0)이 있으면 initTarget#번호 메시지를 보내 해당 원반이 발사되도록 합니다.

원반이 발사되었을 경우에는 현재 발사된 원반수를 나타내는 count 값을 1 증가 시킵니다.






















사용자 삽입 이미지
현재 발사된 원반 수를 검사하여 스테이지를 증가 시키거나 게임의 종료를 검사하는 스크립트 입니다.

발사된 원반수에 따라 아래와 같이 설정합니다.

* 11~25: 2 스테이지로 설정
* 26~45: 3 스테이지로 설정
* 46~70: 4 스테이지로 설정
* 71~100: 5 스테이지로 설정
* 100이상: 게임 종료(gameStep=2)














4. 표적 스크립트
표적은 게임 진행중에만 출력됩니다. 현재 마우스의 위치를 따라 이동하며, 플레이어가 마우스 버튼을 클릭하였을 경우에 원반들과 충돌을 검사합니다.

사용자 삽입 이미지
게임시작(initGame) 메시지를 받았을 경우에는 show로 표적을 출력합니다. 게임종료 메시지(closeGame)를 받았을 경우에는 hide로 표적을 출력하지 않습니다.





게임이 시작되면 아래의 스크립트가 실행됩니다.

[go to [mouse-pointer]]
사용자의 마우스 포인터의 움직임에 따라 표적을 이동합니다.

[if <mouse down?>]
마우스가 클릭되면 표적의 위치가 해당 원반과 충돌하고 원반이 발사되었을 경우(targetLive#번호=1)에는 해당 원반에게 격추되었다는 hitTarget#번호 메시지를 발송합니다.

사용자 삽입 이미지

5. 원반 스크립트
원반 스프라이트는 3가지 각도로 이동하며 좌측, 우측에서 나타나는 총 6개의 종류가 있습니다. 원반의 위치와 이동경로를 제외하고는 대부분 동일하기 때문에 여기서는 하나의 스크립트만 설명하겠습니다. (각각의 구현 예는 아래의 소스를 다운 받아 스크래치에서 직접 확인해 주세요)

사용자 삽입 이미지
게임 초기화 메시지를 받았을 경우에는 해당 원반을 숨기고 'targetLive#번호' 변수를 발사 대기중임을 나타내는 0으로 설정합니다.



사용자 삽입 이미지
원반이 격추당했을 경우에 발생되는 메시지(hitTarget#번호)를 받았을 경우에 실행되는 스크립트 입니다.

효과음(pop)을 출력하고 'targetLive#번호' 변수를 파괴중임을 나타내는 -1로 설정합니다. 그리고 점수(point)를 1증가합니다.


사용자 삽입 이미지
발사 준비 메시지(intTarget#번호)를 받았을 경우에 실행되는 스크립트 입니다.

'targetLive#번호' 변수를 발사중(1)로 설정하고 출발위치를 설정합니다. (출발 위치는 원반 종류에 따라 조금씩 차이가 있습니다)

'target#번호' 로 커스튬을 원반 기본 이미지로 설정합니다. 원반 파괴 효과를 위해 설정된 효과(effects)를 초기화한 후에 원반을 보이도록 합니다.

다음은 실제 원반을 움직이는 스크립트입니다.
사용자 삽입 이미지

[change x by [(2)+[[stage] * (0.3)]]
[change y by [(1)+[[stage] * (0.3)]]
발사 중(targetLive#번호=1)일 때aㅏㄴ 원반을 이동합니다. 원반을 이동시키는 방법은 각각의 원반에 따라 조금씩 틀립니다. 이 스크립트의 원반은 x 축으로 2 이동할 때 y 축으로는 1 이동합니다. stage * 0.3으로 스테이지가 증가함에 따라 원반의 이동속도가 증가되도록 합니다.

[change taregetLive#번호 by (-1)]
폭파중일 때(targetLive#번호<0)는 targetLive#번호를 -1씩 감소 시킵니다. -30이 되면 사라집니다.

[switch to costume [t1]]
'targetLive#번호'가 -3 보다 큰 3 프레임 동안에는 파괴된 이미지로 변경합니다. 그 후에는 -30이 될 때까지 [change [ghost] effect by (25)]로 파괴된 이미지가 서서히 사라지는 효과가 나타나게 합니다.

[if <<<[x position] > (265)> or <[y position] > (180)>> or <[targetLive#번호] < (-30)>>]
x, y가 화면의 범위를 벗어 났거나 'targetLive#번호'가 -30이 넘어 30 프레임 동안 원반이 파괴되는 효과를 보여 주었으면 'targetLive#번호'를 0으로 대기상태로 만들고 hide로 원반을 출력하지 않습니다.

6. 버튼 스크립트
1) 시작 버튼
사용자 삽입 이미지
시작 시에는 show로  버튼을 보여 줍니다.

현재 게임상태가 대기(gameStep=0)이고 버튼 이미지가 클릭되면 gameStep을 1(게임 모드)로 설정하고 initGame 메시지를 발송한 다음 버튼 이미지를 감춥니다.






2) 다시시작 버튼
사용자 삽입 이미지
게임이 종료되었음을 알리는 closeGame 메시지를 받았을 때에 show로 버튼을 출력합니다.


사용자 삽입 이미지
시작 시에는 hide로 보여 주지 않습니다.

현재 게임상태가 종료(gameStep=2)이고 버튼 이미지가 클릭되면 gameStep을 1(게임 모드)로 설정하고 initGame 메시지를 발송한 다음 버튼 이미지를 감춥니다.






이상으로 게임을 완성하였습니다. 시작버튼을 클릭하여 스크립트를 실행합니다. 초기 화면에서 '시작' 버튼을 클릭하면 게임이 시작됩니다. 5 스테이지까지 100개의 원반이 발사되면 게임이 종료됩니다. '다시 시작' 버튼을 클릭하여 게임을 다시 시작할 수 있습니다.

전체 구조와 스크립트는 아래의 파일을 다운로드 받으셔서 확인해 보세요

'프로그래밍 강좌 > 스크래치' 카테고리의 다른 글

5.3 [고급] 범고래 봉봉 게임  (10) 2008.07.18
5.2 [고급] 벽돌깨기 게임  (0) 2008.07.13
4.7 [중급] 묵찌빠 게임  (0) 2008.06.16
4.6 [중급] 카드 맞추기  (0) 2008.06.11
4.5 [중급] 숫자야구 게임  (0) 2008.05.20
AND

작년 여름에 마지막 12 스테이지로 들어 간지 10여개월만에 드디어 클리어 했습니다(작년 포스팅). 매일 점심먹거나 머리아플 때등 보통 서너판씩 꾸준히 했는데 오늘 드디어 감격적인 엔딩을 보았습니다.

사용자 삽입 이미지

한 일년을 이 녀석과 함께 재미있게 보냈으니 기쁘기도 하고 섭섭하기도 하네요. 이제 슬슬 다른 게임을 찾아 보아야 할 것 같습니다. 요런 아기자기하고 재미있는 맥용 게임 추천해 주실 분 안계신가요?

'이야기들 > 소소한 이야기' 카테고리의 다른 글

스크래치 강좌 끝~  (8) 2008.07.28
5년만에 강림하신 지름신  (16) 2008.07.15
맥북 DVI 어댑터  (2) 2008.06.16
휴~ 아이폰 3G  (4) 2008.06.10
맥세이프 전원 아답터  (6) 2008.05.20
AND

이번 장에서는 묵찌빠 게임을 만들어 보겠습니다. 가위바위보를 하는 시점이 사용자가 키를 누르는 시점이라는 것만 제외하면 게임규칙은 우리가 흔히 하는 묵찌빠 게임과 같습니다. 사용되는 키는 키보드 좌측 하단의 z(묵), x(찌), c(빠) 입니다.


사용자 삽입 이미지


1. 변수 생성
Variables의 [Make a variable]을 클릭하여 아래의 변수들을 생성합니다.
  • state - 게임 상태입니다. 0은 가위바위보로 공격을 정하는 상태고 1은 사용자가 공격중인 상태, 2는 컴퓨터가 공격중인 상태입니다.
  • computer - 컴퓨터가 이긴 횟수입니다.
  • player - 사용자가 이긴 횟수입니다.
  • computerChoice - 현재 컴퓨터가 선택한 값(묵:1, 찌:2, 빠:3)입니다.
  • playerChoice - 현재 사용자가 선택한 값입니다.
  • winner - 승자를 나타내며 1은 사용자가 이겼을 경우, 2는 컴퓨터가 이겼을 경우입니다.

2. 스프라이트

1) 스프라이트 생성
이번장에서 사용하는 스프라이트는 4가지 입니다. Sprite1은 사용자 이미지, Sprite2는 컴퓨터 이미지, Sprite3은 현재 공격 차례를 나타내는 화살표이며 Sprite4는 각종 안내 문구를 출력합니다. 

사용자 삽입 이미지

Sprite1과 Sprite2는 '바위' 이미지외에 '가위', '보' 커스튬을 추가합니다. 좌측은 Sprite1, 우측은 Sprite2입니다.
사용자 삽입 이미지

Sprite4에도 s1, s2 이미지를 커스튬에 추가합니다. 아래의 압축파일을 다운로드 받아서 사용하시면 됩니다.

2) 효과음 생성
* 효과음을 녹음 할려면 헤드셋 또는 웹켐과 같이 마이크가 연결되어 있어야 합니다. 없으신 분들은 다음 장으로 바로 넘어 갑니다.

사용자 삽입 이미지
공격시 '묵, 찌, 빠'의 효과음 출력을 위해 Sprite1에서 Sounds 탭을 선택한 후에 녹음을을 위해 [Record] 버튼을 클릭합니다.


아래와 같이 녹음창이 뜨면 붉은색 녹음 버튼을 클릭한 후 '묵'을 녹음 하고 OK 버튼을 눌러 저장합니다. 같은 방법으로 '찌', '빠'도 추가하며 각각의 이름을 'muk', 'ji', 'pa'로 변경합니다.
사용자 삽입 이미지


사용자 삽입 이미지
Sprite1의 Sounds 탭에 좌측과 같이 녹음된 음성들이 저장 되어 있음을 확인합니다.

Sprite2에도 같은 방법으로 효과음을 추가합니다. 컴퓨터에서 사용하는 목소리기 때문에 Sprite1과 다른 목소리로 녹음하시는 것이 좋습니다.








3. 사용자(Sprite1) 스크립트
1) 초기화
사용자 삽입 이미지

게임이 시작되면 initPlayer 메시지를 발송하고 player, computer의 점수를 0으로 설정합니다.

initPlayer 메시지를 받으면 현재의 커스튬을 묵(bw)으로 설정한 후에 winner, state 변수를 0으로 설정합니다.

2) 입력 처리
사용자 삽입 이미지
사용자 입력을 처리하는 스크립트 입니다. z는 묵, x는 찌, c는 빠를 선택한 경우입니다.

[if <[state]=(1)>]
현재 상태가 사용자가 공격일 경우에만 사용자의 입력에 따라 '묵', '찌', '빠' 음성을 출력합니다.

[set playerChoice to (값)]
사용자의 선택을 저장합니다. 값은 묵은 1, 찌는 2, 빠는 3입니다.

[swtich to costume [custume]]
사용자가 선택한 값에 따라 커스튬을 변경합니다.

[broadcast [setComputer] and wait]
컴퓨터의 처리를 위해 setComputer 메시지를 발송합니다.














4. 컴퓨터(Sprite2) 스크립트
1) 초기화
사용자 삽입 이미지
시작시에는 기본으로 묵(bw2) 커스튬을 출력합니다.




2) 컴퓨터 순서 처리
사용자 삽입 이미지

[set computerChoice [ping random (1) to (3)]]
1에서 3까지 임의의 수를 선택합니다.

[if <[computerChoice]=(값)>]
선택된 값을 묵(1), 찌(2), 빠(3)인지 검사합니다.

[swtich to costume [custume]]
선택된 값에 따라 커스튬을 출력합니다.

[if <[state]=(2)>]
state가 2인 컴퓨터의 공격순서일 경우에는 효과음을 출력합니다.

[broadcast [decision] and wait]
사용자 입력과 컴퓨터의 선택된 값에 따른 처리를 위해 decision 메시지를 발송합니다.

3) 승부 처리
사용자 삽입 이미지

[if <<[playerChoice]-[computerChoice]>=(0)>]
사용자와 컴퓨터가 같은 선택을 하였는지를 검사합니다.

[if <not <[state]=(1)>>]
state가 0이 아닐 경우, 즉 공격우선권을 위해 가위바위보를 하는 경우가 아닐 경우를 의미합니다. 같은 선택을 하였기 때문에 사용자가 공격중일 경우(state=1)에는 plyaer 우승횟수를 1 증가하고 winner를 1(사용자)로 설정합니다. 컴퓨터가 공격중일 경우에는 computer 우승횟수를 1 증가하고 winner를 2(컴퓨터)로 설정합니다.

[broadcast [showMessage] and wait]
결과 출력을 위해 showMessage 메시지를 발송합니다.

[broadcast [initPlayer] and wait]
[swtich to costume [bw2]]
다시 게임을 시작하기 위하여 initPlayer 메시지를 발송하고 커스툼을 '주먹'으로 변경합니다.

playerChoice-computerChoice가 -1 또는 2일 경우에는 사용자가 이긴 경우입니다. 이때는 [set state to (1)]로 사용자에게 공격권을 설정하고, 아니면 컴퓨터에게 공격권(state=2)을 설정합니다.

[broadcast [setArrow] and wait]
화살표 아이콘이 현재 공격권을 가지고 있는 쪽에 출력되도록 합니다.

[broadcast [showMessage] and wait]
안내문 출력을 위해 showMessage 메시지를 발송합니다.

5. 화살표 스프라이트
사용자 삽입 이미지
시작되면 아이콘을 숨기고 Y위치를 40으로 설정한 후 무한반복 되면서 아래, 위로 0.2초의 간격을 두고 움직입니다.

사용자에게 공격권이 있을 경우(state=1)에는 X 위치를 사용자 쪽으로 이동(-177)하고 출력합니다. 컴퓨터에게 공격권이 있을 경우(state=2)에는 컴퓨터 쪽으로 이동(00)하고 출력합니다. 그외 공격권을 위해 가위바위보 중(state=0)일때는 아이콘을 숨깁니다.


6. 메시지 스프라이트
1) 초기화
사용자 삽입 이미지
초기 커스튬을 s0으로 설정합니다. s0은 "가위, 바위, 보"란 커스튬을 출력합니다.



2) 메시지 출력
사용자 삽입 이미지
showMessage를 처리하는 스크립트 입니다. state가 0일 경우(공격권 선택중)일 때는 "가위, 바위, 보"란 메시지를 출력합니다.

누군가 공격중일 때는 사용자가 이겼을 경우(winner=1)에는 s1 커스튬(플레이어 승!!)을 출력하고, 컴퓨터가 이겼을 경우에는 s2 커스튬(컴퓨터 승!!)을 출력합니다.

[wait (3) secs]
[hide]
메시지를 3초간 출력하고 감춥니다.















이제 완료하였습니다. 시작버튼을 클릭하여 플레이 해 봅니다. 처음엔 z, x, c로 가위바위보를 하여 공격권자를 선택합니다. 사용자는 공격시에도 방어시에도 z, x, c중 하나를 선택하여 키보드로 입력하여야만 게임이 계속 진행됩니다.

전체소스는 아래의 파일을 다운로드 받아 확인해 보시기 바랍니다.
AND