ビヘイビアのインスタンスとメッセージ(1)
こちらはビヘイビアに関してご理解いただくための情報です。ご参照ください。(ただし、文中のLINGOはDirector7Jからご利用いただける記述方法で記載されております。Director6.xをご利用の方はご注意ください。)
| 1 | ビヘイビアとインスタンス スコアスクリプトとしてのひとつのビヘイビア(スクリプトキャストメンバー)は、スコア上にいくつでもドロップして使用することができます。スコア上に設定された個々のビヘイビアは、そのフレームに再生ヘッドがくると動作可能な状態になります。それらのひとつひとつを、元のビヘイビアスクリプトと区別して「インスタンス」と呼びます。 ビヘイビアスクリプトがクッキーの抜き型だとすれば、インスタンスは焼き上がったクッキーです。クッキーは抜き型で形づくられます。ですから、同じ型からつくられたクッキーは同じ形です。けれど、トッピングや混ぜ込む材料を変えることで、それぞれ異なったフレーバーになります。ビヘイビアの場合には、「プロパティ」がこのフレーバーに当たります。 プロパティは、ビヘイビアスクリプトの頭で定義するのが通常です。定義には 'property'キーワードを使います。ループさせたフレーム('go the frame')にスプライトを置いて、以下のビヘイビアを設定してみましょう。 -- [クリックをカウントする ビヘイビア] property pCount on mouseUp me pCount = pCount + 1 put pCount end スプライトをクリック('mouseUp')するたびに、クリック回数をメッセージウィンドウに表示します。別のスプライトにも同じビヘイビアをドロップしてクリックすると、前のスプライトとは独立してクリック回数をカウントすることがおわかりいただけるでしょう。設定したビヘイビアは同じでも、インスタンスが異なれば、プロパティの値は独立して保持・管理されるのです。 スプライトに設定されたビヘイビアは、ビヘイビアインスペクタで確認することができます。ただし、ここにリストされたビヘイビアはインスタンスではありません。クッキーでいえば、これは単なる注文リストです。Directorはスプライトというお客様が登場したその瞬間に、クッキーを焼き上げるのです。つまり、インスタンスは、スプライトのあるフレームに再生ヘッドがきた瞬間に生成されます。そのとき最初に受取るメッセージが'beginSprite'です。そしてインスタンスは、再生ヘッドがスプライトから抜け出るとき、'endSprite'メッセージを受取った後、破棄されます。 |
| 2 | メッセージとインスタンス クリックをカウントするビヘイビアに、カスタムハンドラを追加してみます。これはカウンター'pCount'の値を、0にリセットします。 -- [クリックをカウントするビヘイビアへの追加部分 - カウンターのリセット] on xReset me pCount = 0 end このハンドラを実行するには、インスタンスに対してメッセージ'xReset'を送る必要があります。メッセージは、'sendSprite'コマンドで送ることができます。 ('sendSprite'について、詳しくは『Lingo辞書』またはオンラインヘルプ参照)。ビヘイビアを設定したスプライトのチャネル番号が1だとすれば、以下のステートメントをメッセージウィンドウから実行します。 -- [メッセージウィンドウから実行するステートメント] sendSprite(1, #xReset) その後、スプライトをクリックすると、またカウントは1からスタートします。 2つのハンドラ('mouseUp'と'xReset')の後には、パラメータとして'me'が入っています。この'me'は、実はインスタンスを意味しています。ここまでの処理でしたら、この'me'は付けなくても問題は生じません。'me'が必要となるのは、たとえばカウンター'pCount'を任意の値に設定するハンドラを書く場合です。 -- [クリックをカウントするビヘイビアへの追加部分 - カウンターのセット] on xSet me, nCount put [me, nCount] -- for testing pCount = nCount end カウンターをセットするハンドラを追加しました。1行目のステートメント'put[me, nCount]'は確認用です。また、メッセージウィンドウから'sendSprite'コマンドで、'pCount'の値を10に設定するステートメントを実行してみます。 sendSprite(1, #xSet, 10) -- [<offspring "" 4 5a4affc$gt, 10] カウンター'pCount'は10に設定され、スプライトをクリックすると11からカウントされます。注目していただきたいのは、メッセージウィンドウに表示された[ そうすると、インスタンス(への参照)は取りあえず受取っておくだけのものかといいますと、そうではありません。一旦受取った'me'へは、(ドットシンタックスで)さまざまにアクセスできるようになります。たとえば、'me.spriteNum'は、ビヘイビアの設定されたスプライトの番号を返します。また、ハンドラもドットシンタックスで呼べます。試しに'xReset'ハンドラを書き替えてみましょう。 -- [カウンターのリセット(変更)] on xReset me me.xSet(0) end カウンターのリセットは、'pCount'を0にセットすればよいで、'xSet'ハンドラを呼ぶことにしました。'me.xSet()'で、自分のインスタンスに'xSet'メッセージが送れます。このときも、インスタンス(への参照)は最初のパラメータとして送られます。2番目以降のパラメータは、括弧内に書きます。括弧内には0が入っているので、カウンター'pCount'は0に設定されます。 |
| 3 | メッセージを送る他の方法 'sendSprite'以外にも、ビヘイビアインスタンスに対してメッセージを送る方法があります。'me.xSet()'で自分のインスタンスにメッセージが送れました。このドットシンタックスは、スプライトに対しても使えます。メッセージウィンドウで試してみましょう。 -- [メッセージウィンドウからカウンターをリセットする] sprite(1).xReset() 'xReset'には、'me'以外のパラメータはありませんので、括弧内はブランクです。これで、カウンター'pCount'は0に設定されます。ただし、'sendSprite'と異なり、対応するハンドラが存在しないと、スクリプトエラーになることに注意が必要です。 他には、インスタンスを他の変数、たとえばグローバル変数に入れてアクセスする方法があります。この処理は、初期設定として、インスタンスの生成時に行うことにします。したがって、ハンドラは'beginSprite'になります。 -- [クリックをカウントするビヘイビアへの追加部分 - インスタンスをグローバル変数に入れる] global gCounter on beginSprite me gCounter = me end グローバル変数'gCounter'にインスタンスが入りました。インスタンスへのアクセスは、やはりドットシンタックスでできます。 -- [メッセージウィンドウからカウンターを10にセットする] gCounter.xSet(10) インスタンスはグローバル変数に入れましたので、スプライト番号を意識する必要がありません。ただし、複数のスプライトで使用するには、それぞれのグローバル変数名を変えなければならないことに注意してください。 このままにしておきますと、スプライトがフレーム上に存在しなくなっても、インスタンスがグローバル変数に残ってしまいます。'endSprite'でグローバル変数を'void'に設定して、メモリを解放します。 -- [クリックをカウントするビヘイビア(全体)] global gCounter property pCount on beginSprite me gCounter = me end on endSprite me gCounter = void end on mouseUp me pCount = pCount + 1 put pCount end on xReset me me.xSet(0) end on xSet me, nCount put [me, nCount] -- for testing pCount = nCount end |