Accessibility

Director TechNote

ビヘイビアのインスタンスとメッセージ(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からカウントされます。注目していただきたいのは、メッセージウィンドウに表示された[, 10]です。(具体的に出てくる記号自体は毎回変わります)というのは、インスタンス(への参照)を表します。10が'sendSprite'で送ったパラメータだということはおわかりになるでしょう。つまり2番目のパラメータ10を受取るためには、まず最初のパラメータであるインスタンス(への参照)を受取っておく必要があるわけです。

そうすると、インスタンス(への参照)は取りあえず受取っておくだけのものかといいますと、そうではありません。一旦受取った'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

ID: dr0265
Product: Director
Versions: 7 and above
OS: ---
Browser: N/A
Server: N/A
Database: N/A
Former ID: N/A