puppetSprite , the castNum |
このページでは以下のことを解説しています
[Lingoの道]
跳ね返りのスクリプト
キャストの入れ替え
サウンドのOn/Off
さて、パペットの話をもう少し続けてみましょう。今度はキャストの入れ替えと移動、そして音のOn/Offというワザに挑戦してみます。 |
さて、パペットの基礎もわかったことですし、ちょっと応用的なことにチャレンジしてみましょうか。下のサンプルを見て下さいね。
アレ?なんでキャストが変わっていくの?どうなってんの?それに絵が動いて、壁に当たって跳ね返っていますね。どうなってんの?
キャストの入れ替えは簡単なんですが、跳ね返りのスクリプトは結構めんどうですよ。
スコアはどうなっているのですか?
実はたったの1フレームしか使っていません。証拠がありますよ。
これがスコア
ううむ、これだけ証拠を見せられると納得せざるを得ませんね……おそるべしLingo!!
じゃ、ぼちぼちスクリプトの解説を始めていきましょうか。
じゃ、簡単なところからなんですが、サウンドをOn/Offするラジオボタンがありますよね。あのスクリプトはどうなっているのですか?
それが極めて簡単なんです。ラジオボタンのキャストスクリプトに以下のように書いています。
on mouseUp
set the soundEnabled to not the soundEnabled
end
あれ?これだけですか?なんなんですか、この長いコマンドは。the soundEnabled……ううむ。
これはサウンドを鳴らすかどうかのプロパティです。このスクリプトの場合、ボタンを押す毎にthe soundEnabled をnotにするわけです。
…………????
いや、わかりやすくいうと、サウンドを鳴らすかどうかを前回のやつと違うようにするわけですよ。前回Onだったら、今回はそれのnotなので、Offになるのです。OffのnotはOnですから……。
つまり「裏の裏は表」という理論みたいなものですね。なるほど。ま、これはわかりました。で、次に跳ね返りのスクリプトなんですが、これがよくわからない。というか、何をしたらいいのかが全く分からないんですよ。
まずはスプライトの制御を「スコア」から「スクリプト」のほうにゆずらないと行けませんよね。そのためには何を使うんでしたか?
puppetSpriteでしたよね?この場合はチャンネル1をパペットにしないといけないので、puppetSprite 1という命令をムービー開始時に実行しないといけませんよね。だから……on startMovieの時にパペット宣言を行えばいいんでしょうか?
その通りです!だいぶ理解してきましたね!さて、そこからが問題なんですが、スプライトが移動するという仕組みについて確信に触れていくことにしましょう。スプライトが移動しているように見せているのですが、その手順は以下のようになっています。
というように手順が進みます。
じゃ、「現在の座標を計算」はどのようにすればいいのかなぁ……。あ、そうだ!さっき使ったputを使ってこんな風に書けばいいのかな?
put the locV of sprite 1 into v
put the locH of sprite 1 into h
一応変数をvとhにしておきましたけど、別になんでもいいんですよね。このスクリプトでスプライト1の座標が変数に代入されましたね。
その通り!今日は冴えてますねぇ。じゃ、次の「方向を判断」というのはどうしたらいいと思いますか?ヒントとしては垂直方向と水平方向の二つを用意するのですが、わかりますか……?
ううむ、どうすればいいのかな?判断をするのだからif文とかを使用すればいいのはわかるんだけど……
第2ヒント。このムービーの画像サイズは260*260ピクセルですが、跳ね返りの限度を下の図のようにしてみましょう。そして、進行方向の変数をdirVとdirHという名前にして、正方向に進む時にはdirVを1にして、負方向に進むときには-1にしてみましょう。
じゃ、1か-1かで方向を決めればいいのですね。ええと、こんな風に書けばいいのかな?判断方向のハンドラをhoukouとでも命名しておきましょうか
on houkou
if v >=240 then set dirV=-1
if v <=20 then set dirV=-1
if h >=240 then set dirH=-1
if h <=20 then set dirH=-1
end
ううむ、実はこれではうまく動作しませんね。原因は色々ありますが、一つ一つ説明していきましょう。まず、vとかhなどの変数を書いていますが、その変数が何かが書かれていませんね。
え?さっきputで書いたじゃないですか!
それは甘いですね。このハンドラ内で宣言されていないんですよ。ですから、このスクリプト内にさっきのput文を書き加える必要があります。もしくはグローバル変数を宣言する必要がありますね。
え?なんですか?それ??
ハンドラを越えて通用する変数のことですね。スクリプトの冒頭でglobal v,h,dirH,dirVのように記述することによって、他のハンドラで設定されたグローバル変数を使えるようにするのです。つまり、global宣言は二つ以上いるわけですよ。だからvとかhとかの変数設定をon startMovieのハンドラ等で行ってしまえばいいんですよ。こんな風にね。
on startmovie
global dirV,dirH
set dirV to 1
set dirH to 1
repeat with n=1 to 6
puppetSprite n , true
end repeat
end
……ううむ、なんとか分かりましたが……。で、さっきの跳ね返りのハンドラはどのようになるのですか?
このように書いてみましょう。
on houkou
global dirV, dirH,v,hif v >= 140 or v<=20 then
set dirV = dirV*(-1)
puppetsound "boing"
end ifif h >= 129 or h<=23 then
set dirH = dirH*(-1)
puppetsound "boing"
end ifend
if文をorでひとまとめにして、すっきりさせていますね。スプライトが端っこにきたら、-1をかけて、正と負を変えているんですね。それとぼよよ〜んという音をpuppetSoundで鳴らしているんですね。ほほう、こうして書かれているものを見ると理解できますね。なるほど。
で、次に移動先の座標の計算のスクリプトですが、idouというハンドラでこのように書いてみました。
on idou
Global dirV,dirH,v,h
put the LocV of sprite 1 into v
put the LocH of sprite 1 into hhoukou
set the locV of sprite 1 to v+dirV*(8)
set the locH of sprite 1 to h+dirH*(8)
end
これで移動のスクリプトの集大成です。今までのハンドラを統合しているメタハンドラですね。ですから、フレームスクリプトにidouと書けばおしまいですね。簡単かんたん。あとのスクリプトなどは説明はいりませんよね。
なるほど……こうしたらスプライトが動いて見えますね……。なんだ、結構簡単なんだ。
ま、一度自分で試行錯誤しながら作ってみると、もっと勉強になるでしょうね。がんばって下さいね