サイトトップ

Director Flash 書籍 業務内容 プロフィール
 

Macromedia Director非公式テクニカルノート

setCallback()

ID: FN0301003 Product: Director

Platform: All
Viersion: MX and above

シンタックス
flashSpriteReference.setCallback(ActionScriptオブジェクト, ActionScriptイベント, #Lingoハンドラ, Lingoスクリプトオブジェクト)
setCallback(ActionScriptオブジェクト, ActionScriptイベント, #Lingoハンドラ, Lingoスクリプトオブジェクト)

解説
Flashコマンド; このコマンドはスプライトあるいはグローバルメソッドとして使用します。指定したオブジェクトから発生する特定のイベントに対して、Lingoのコールバックハンドラを定義します。ActionScriptでオブジェクトにイベントが発生すると、そのイベントは指定したLingoハンドラに送られ、すべての引数もイベントとともに渡されます。

ActionScriptオブジェクトがFlashスプライトの中から生成された場合には、flashSpriteReferenceのシンタックスを使います。オブジェクトをグローバルに生成したときは、グローバルシンタックスを用います。

*注記
Flashキャストメンバーをまったく読込んでいない場合には、別途Flash Asset Xtraをムービーエクストラのリストに追加して、グローバルFlashコマンドが正しく動作するように設定する必要があります。拡張エクストラをエクストラリストに追加するには、「設定」>「ムービー」>「エクストラ」を選択します。詳しくは、マニュアルをご参照ください。

例文
つぎのステートメントは、Lingoスクリプトオブジェクトme内のmyOnStatusというLingoハンドラを指定して、ActionScriptオブジェクトtLocalConObjectからonStatusイベントが発生したとき呼出されるように定義します。tLocalConObjectは、スプライト3のFlashムービー内にあるものとします。

sprite(3).setCallback(tLocalConObject, "onStatus", #myOnStatus, me)

つぎのステートメントは、Lingoスクリプトオブジェクトme内のmyOnStatusというLingoハンドラを指定して、グローバルActionScriptオブジェクトtLocalConObjectからonStatusイベントが発生したとき呼出されるように定義します。

setCallback(tLocalConObject, "onStatus", #myOnStatus, me)

以下のステートメントは、新規のグローバルXMLオブジェクトを生成し、コールバックハンドラとしてXMLデータが読込まれたときそれを解析するスクリプトを作成しています。3行目のステートメントは、XMLファイルをロードします。コールバックハンドラも、同じスクリプト中に設定します。

gXMLCB = newObject("XML")
setCallback( gXMLCB, "onData", #dataFound, 0 )
gXMLCB.load( "myfile.xml" )

-- XMLデータ読込み時に呼出されるコールバックハンドラ
on dataFound me, obj, source
  obj.parseXML(source)
  obj.loaded = 1
  obj.onload(TRUE)
end dataFound

[訳者註] FlashスプライトからActionScriptオブジェクトを取得して、コールバックを受取るサンプルをご紹介します。Flash側でオブジェクトを作成し、MovieClipをクリックしたときにそのオブジェクトに対してメソッドを実行します(Flash側では、対応するメソッドを定義する必要はありません)。そして、Lingoビヘイビアでは、ActionScriptからのメソッド呼出しをイベントとして、コールバックハンドラを設定しています。

Flashと相互にコミュニケーションを取る場合には、ActionScriptオブジェクトをビヘイビアの'property'に設定しておくと便利です。ActionScriptオブジェクトの参照は、'getVariable'関数を使って取得することができます。ところが、'on beginSprite'ハンドラではActionScriptオブジェクトの取得には早すぎ、'getVariable'の結果として'void'が返されてしまいます。

つまり、ActionScriptオブジェクトの'property'への設定は、'getVariable'コマンドがオブジェクト参照を取得できるまで待つ必要がある訳です。'actorList'にビヘイビアインスタンスを設定して、オブジェクト参照の取得を確認するサンプルを以下に示します。

// Flash MX ActionScript
// _root
// フレームアクション
// MovieClip: _root.my_mcを配置
oMessenger = new Object();
_root.my_mc.onRelease = function() {
  oMessenger.onClicked(this._target);
};

-- Lingo Behavior
-- Flashスプライトに設定
property pMySprite, poFlashObject   -- property宣言

on beginSprite(me)
  pMySprite = sprite(me.spriteNum)
  -- actorListにインスタンスを設定して待つ
  (the actorList).append(me)
end

on stepFrame(me)
  -- Flash内のオブジェクト参照を取得
  poFlashObject = pMySprite.getVariable("oMessenger", false)
  -- 最初はActionScriptオブジェクトが取得できず、voidが返される
  put [#stepframe, poFlashObject, the actorList] -- forTesting
  -- オブジェクト参照が取得できたことを確認
  if objectP(poFlashObject) then
    -- コールバックハンドラを設定
    pMySprite.setCallback(poFlashObject, "onClicked", #xFlashCallback, me)
    -- actorListからインスタンスを削除
    (the actorList).deleteOne(me)
    put [#deleted, poFlashObject, the actorList] -- forTesting
  end if
end

on xFlashCallback(me, oFlashObject, arg) --コールバックハンドラ
  -- 第2引数にはActionScriptオブジェクトが渡される
  put [oFlashObject, arg]
end

-- メッセージウィンドウの結果: FlashスプライトのMovieClipをクリックしたとき
-- "/my_mc"

コールバック関数の第2引数として、ActionScriptオブジェクトの参照が渡されることにご注意ください。サンプルスクリプトには、確認のためポイントに'put'ステートメント(forTestingのコメント部分)を挿入していますので、メッセージウィンドウの出力結果も併せてご参照ください。

[訳者註2]
Flashスプライトにコールバックハンドラを設定する際に、'setCallback'コマンドのActionScriptオブジェクトを指定すべき第1引数に'void'を渡すと、第2引数のActionScriptイベントがFlash内でどのオブジェクトに対して呼出されてもDirectorがコールバックとして受取ってしまいます。このとき、Flash内では、そのメソッド呼出しがターゲットのオブジェクトには渡らず、Directorに奪われたかたちになりますので、ご注意ください。

'on beginSprite'ハンドラで'getVariable'関数を使ってActionScriptオブジェクトを取得しようとすると、前記[訳者註]に述べた通り'void'が返されます。この値をそのまま'setCallback'コマンドの引数に渡すと、この問題が発生します。

[訳者註3]
FlashからDirectorにメッセージを送るテクニックとして、Flashの'MovieClip.getURL'メソッドを使う方法もあります。とくにURLとして"event:"を指定すると、DirectorのFlashスプライトに設定したハンドラを呼出すことができます(Macromediaテクニカルノート「FlashからDirectorにメッセージを送る」参照)。

この'MovieClip.getURL'メソッドを使う方法と比べて'setCallback'コマンドでコールバックを設定する利点は、まず相互のコミュニケーションをひとつのActionScriptオブジェクトに集中できることがあります。そのオブジェクトをインターフェイスにできるため、DirectorとFlashそれぞれの作業を分離して管理しやすくなります。オブジェクトに対するメッセージだけ相互で決めれば、それぞれのスクリプティングは独立して行うことができるからです。

さらに、コールバックハンドラの方が、より幅広いデータを引数として渡せます。たとえば、以下は引数にMovieClipインスタンス自身を渡して、DirectorからMovieClipのメソッドを実行する例です(前述サンプルスクリプトの修正部分のみ掲げます)。

// Flash MX ActionScript
// _root
// フレームアクション
// MovieClip: _root.my_mcを配置
oMessenger = new Object();
_root.my_mc.onRelease = function() {
  oMessenger.onClicked(this._target, this);  // 引数にthisを追加
};

-- Lingo Behavior
-- Flashスプライトに設定
-- 修正したコールバック関数
on xFlashCallback(me, oFlashObject, arg, oInstance_mc)   -- 引数にMovieClipインスタンスを追加
  put [oFlashObject, arg]
  // MovieClipインスタンスをフレーム"_down"に移動
  oInstance_mc.gotoAndStop("_down")
end

出典
Using Director MX(英語版オンラインヘルプ)より邦訳。

_____

作成者: 野中文雄
更新日: 2005年8月22日 訳者註のActionScriptの記述が漏れていたため追加
更新日: 2003年3月31日 訳者註のサンプルを大幅修正。註2の内容を変更
更新日: 2003年3月23日 訳者註2および註3を追加
作成日: 2003年1月12日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.