이번 장에서는 키보드로 연주할 수 있는 피아노를 만들어 보겠습니다. 악기와 볼륨을 선택할 수 있고 해당 건반이 선택되었을 때 음계를 보여 줍니다. 키보드는 a(도), s(레), d(미), f(파), g(솔), h(라), j(시), k(도)로 매치됩니다.

사용자 삽입 이미지


1. 스프라이트 생성

아래와 같이 피아노와 음계 스프라이트를 생성합니다. 이미지는 아래의 압축파일을 다운로드 받으신 후 사용하시면 됩니다.

사용자 삽입 이미지


각 음계 스프라이트들을 마우스로 드래그 하여 아래와 같이 해당 건반위에 위치하게 합니다.

사용자 삽입 이미지
 

2. 스크립트

1) 메시지 생성
사용자 삽입 이미지
이전 장에서 처럼 broadcast 블럭의 화살표를 클릭한 후, 'new..'를 선택하여 좌측과 같이 각 음계의 메시지를 생성합니다.

도는 높은 도와 낮은 도 두개가 있기 때문에 높은 도는 'do2'로 지정합니다.




2) 음계 스크립트
모든 음계 스크립트는 아래와 같이 동일합니다. 한가지 다른 점은  [when i receive [message]] 블럭의 메시지에 각 음계의 메시지(do, re, mi, pa...)가 들어 갑니다. 아래는 도 스크립트이며 각 음계마다 아래와 같이 스크립트를 작성하며 메시지(do, re, me..)를 음계에 맞게 수정합니다.
사용자 삽입 이미지

이 스크립트가 하는 일은 간단합니다. 시작되면 [hide]로 음계 이미지를 숨깁니다. 그런 후에 [when i receive [message]] 에서 각 건반의 메시지를 받을 경우에 0.5초간 보여 준 후 다시 숨깁니다. 위의 do 메시지는 사용자가 키보드에서 'a'를 눌렀을 경우에 발생 합니다.

3) 피아노 스크립트
a. 변수 생성
Varaibles의 [Make a variable]을 클릭하여 instrument, volume, oldInstrument, oldVolume 변수를 각각 생성합니다. instrument는 현재 선택된 악기를 저장하며, voloume은 말 그대로 현재 볼률을 저장합니다.

oldInstrument, oldVolume은 각각 이전의 볼륨과 악기를 저장합니다. 사용자에 의해 instrument, volume이 변경되었는지의 검사를 위해서 사용됩니다. 아래의 스크립트에서 forever 블럭 내부를 보시면 용도를 알 수 있습니다.

사용자 삽입 이미지

b. 시작시 초기화
[set volume to (50)] 현재 볼륨을 중간(50)으로 설정합니다.
[set instrument to (1)] 현재 악기를 1로 선택합니다.
[set oldVolume to (volume)] oldVolume을 Volume과 같게 만듭니다.
[set oldInstrument to (instrument)] oldInstrument를 Instrument와 같게 만듭니다.

사용자 삽입 이미지
[set instrument to [값]]의 입력창내의 화살표를 클릭하시면 좌측과 같이 128가지의 선택 가능한 악기들이 나옵니다. 이 악기중 하나를 선택할 수 있습니다.

이 프로그램에서는 1~100까지의 악기만 선택할 수 있습니다.


c. 무한루프
forever 내에서는 현재 볼륨(volume)과 악기(instrument)가 사용자에 의해서 변경되었을 경우 볼륨과 악기를 다시 설정합니다. 설정 후에는 변경된 값들을 다시 old 변수들에 저장하여 같은 값을 다시 지정하지 않도록 합니다.

d. 사용자 입력 처리
사용자가 건반에 해당되는 키를 눌렀을 때는 아래와 같은 명령이 실행됩니다.

[play note [값] for (0.3) beats] note 다음에 오는 값은 음의 높이를 설정합니다. 48(낮은 도)부터 반음을 포함하여 1씩 증가 됩니다. beats 앞의 값은 음의 길이를 설정합니다. 여기서는 0.3으로 설정했습니다. 더 짧게 끝낼려면 0.3보다 작은 값을 입력합니다.

그후에 [broadcast [메시지]]를 이용하여 각각의 메시지를 보냅니다. 이 메시지를 받은 각 음계의 스프라이트들은 잠시 나타났다 사라지게 됩니다.

이제 완료되었습니다. 시작버튼을 클릭하여 테스트를 하여 봅니다.
사용자 삽입 이미지
캔버스 내의 instrument와 volume값을 변경하여 실행해 봅니다. 좌측 하단의 동그란 버튼을 드래그 하면 값들이 변경됩니다.

사용자 삽입 이미지
사용자 삽입 이미지
변수를 더블클릭하면 좌측과 같이 모양이 차례대로 변경됩니다.


AND

이번 장에서는 벽에 반사되는 공을 번갈아 가며 막아 내는 간단한 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

사용자 삽입 이미지
저번 주에 인터넷에서 구입을 하고 어제 저녁에 받았습니다. 2.4GHz 흰색으로 구입했는데 받아 보니 역시나 이쁘네요. 단아 하다는 느낌이 들었습니다.

저같은 중년 아저씨는 검은색이 더 어울릴 것 같은데 맥은 흰색이 라는 생각으로 선택했습니다.

이것 저것 만져 보고 달라진 레오퍼드를 살펴 보는라 어제는 거의 밤을 새웠습니다. 아들녀석이 포토부스를 너무 재밌어 해서 서로 해볼려고 싸웠습니다. 오늘 아침에도 눈뜨자 마자 맥북을 만지고 있더군요. 빨리 Wii를 사서 녀석의 관심을 돌려야 할 것 같습니다.

노트북을 많이 써 본 편은 아니지만 여지껏 구입한 노트북중에 가격대비 가장 만족도가 높은 것 같습니다. 다만 에이샵에서 들어 본적은 있는데 실제 들고 다녀 보니 약간 무겁게 느껴지긴 합니다. 이전 맥 미니처럼 메모리 추가하고 하드도 빠른 것으로 교체할려고 했는데 막상 써보니 그다지 업그레이드의 필요성을 못 느끼겠네요. 지금까지는 부트캠프를 사용하지 않았는데 이번엔 VS를 위해서 써볼려고 합니다. 사용해보고 별 무리 없으면 업그레이드 없이 그냥 쓰기로 했습니다.

이것저것 설치하고 설정하는라 아직 Xcode와 다른 개발툴들은 못 써봤는데 많이 기대가 됩니다. 맥북 하나로 아침부터 아이처럼 기분이 좋아 계속 싱글벙글 해서 있으니 한편으론 나이 값을 못한다는 생각도 듭니다. ^^

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

맥세이프 전원 아답터  (6) 2008.05.20
요즘 근황...  (2) 2008.05.19
부러운 애플의 건방짐  (4) 2008.05.07
블로그 첫 돌을 넘겼습니다  (16) 2008.05.06
오~ 파이어폭스3 좋네요  (16) 2008.04.04
AND