サイトトップ

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

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

Flashスプライトを操作する

ID: FN0501002 Product: Director

Platform: All
Viersion: MX 2004 and above

Director MXでは、getVariable()関数でFlashスプライト内のオブジェクト参照が取得できるようになり、Flashスプライトの操作の可能性が大きく拡がりました。MX 2004からはさらに、スプライト参照から直接オブジェクト参照の取得が可能になりました。これにより、スクリプトの自由度が、ますます高まります。

本稿では、Flashスプライトの操作の可能性について、実験的な試みを行います。スクリプティングスタイルとして、必ずしも推奨するものではないことを、ご了解ください。

1. _rootの参照を取得して操作を加える
まずは、Flashスプライトから_root(_level0)タイムラインの参照を取得します。[メッセージ]ウィンドウで、試してみましょう(スクリプト001)。Flashスプライトは、sprite(1)に配置したものとします。ここでは、あえてgetVariable()関数は使用しません。

スクリプト001■メッセージウィンドウでFlashスプライトの_rootを取得

-- _root = sprite(1).getVariable("_root", false)   -- でも可
_root = sprite(1)._root
put _root
-- <FlashObject アドレスポインタ>
put _root._url
-- "file:///Directorファイルのパス"

_rootが取得できれば、メインタイムラインをターゲットとして、MovieClipメソッドを呼出すことができます。ここでは、MovieClipの描画メソッドを使って、ブルーの正方形を描いてみます(スクリプト002)。スクリプトはやはり[メッセージ]ウィンドウで記述し,Flashスプライトをsprite(1)とします。0x0000FFという16進数はLingoで扱えませんので、10進数で渡します。

スクリプト002■メッセージウィンドウからFlashスプライトの描画メソッドを使う

_root = sprite(1)._root
_root.beginFill(16*15+15, 100)
_root.moveTo(50, 50)
_root.lineTo(100, 50)
_root.lineTo(100, 100)
_root.lineTo(50, 100)
_root.lineTo(50, 50)

2. ComboBoxコンポーネントを生成する
Flashスプライトの[ライブラリ]にComboBoxコンポーネントを格納し、ステージには配置しない状態で、Flashスプライトとして使用します。コンポーネントを動的に生成するFlashのUIObject.createClassObject()メソッドを使い、Flashタイムラインに配置したうえで、ComboBoxのメソッドにより項目とデータの設定を行ってみます(スクリプト003)。

Flashのクラスは、_globalオブジェクト下のパスにロードされます。ComboBoxクラスのパッケージパスはmx.controls.ComboBoxですので、その参照も取得する必要があります。

スクリプトはFlashスプライトに設定するビヘイビアとし、ComboBoxを生成する関数xCreateComboBox()を定義します。[メッセージ]ウィンドウやDirectorで配置したボタンから、つぎのステートメントを呼出すと、FlashスプライトにComboBoxインスタンスが配置されます。

-- Flashスプライトがsprite(1)の場合
sprite(1).xCreateComboBox()

スクリプト003■FlashスプライトにComboBoxを動的に生成する

-- Flashスプライト: [ライブラリ]にComboBoxコンポーネントを格納
-- スプライトビヘイビア
property mySprite, lList

on beginSprite(me)
  mySprite = sprite(me.spriteNum)   -- スプライト参照
  // ComboBoxの項目(label)として設定する文字列のリスト
  lList = ["item0", "item1", "item2"]
end

on xCreateComboBox(me)
  _root = mySprite._root
  // ComboBoxクラスの参照を取得
  ComboBox = mySprite._global.mx.controls.ComboBox
  // UIObject.createClassObject()メソッドによるコンポーネントインスタンスの生成
  my_cb = _root.createClassObject(ComboBox, "my_cb", 1)
  my_cb._x = 10
  my_cb._y = 10
  // リストの項目をComboBoxインスタンスに設定
  nCount = lList.count
  repeat with i = 1 to nCount
    // ComboBox.addItem()メソッドで項目(label)とデータ(data)の設定
    my_cb.addItem(lList[i], i)
  end repeat
end

3. Flash内のオブジェクトにアクセスするタイミング
Flashスプライトの表示と同時にComboBoxを配置しようとする場合には、若干の注意が必要です。ビヘイビアのon beginSpriteハンドラからxCreateComboBox()関数を呼出すと、スクリプトエラーになります。Flashスプライト内のオブジェクトにアクセスできる準備が、まだできていないからです。

どの段階でアクセス可能になるかは、オブジェクトの種類や参照方法によって異なるようです(スクリプト004)。たとえば、getVariable()関数を使って、_rootへの参照を取得することは、on beginSpriteハンドラ内でも可能です。ところが、スプライトを直接ターゲットにして_rootにアクセスすると、スクリプトエラーになります。この参照方法が使用できるには、何らかの準備が必要なことが推測されます。コンポーネントのクラスを参照するには、フレーム(on exitFrameなど)の進行を待たなければならないようです。

ここで、もうひとつ注目すべきことがあります。スプライトを直接ターゲットにしてオブジェクトを参照すると、オブジェクトが取得できないときスクリプトエラーになるのに対して、getVariable()関数を使えばVoidが返るだけでエラーにはならないことです。

スクリプト004■FlashスプライトのビヘイビアからFlash内のオブジェクトを参照してみる

-- Flashスプライト
-- スプライトビヘイビア
property mySprite, lList, nDelay

on beginSprite(me)
  mySprite = sprite(me.spriteNum)
  lList = ["item0", "item1", "item2"]
  --  me.xCreateComboBox(mySprite)   -- スクリプトエラー
  --  put mySprite._root   -- スクリプトエラー
  put mySprite.getVariable("_root", false)   -- オブジェクト参照が返される
  put mySprite.getVariable("_global.mx.controls.ComboBox", false)   -- Void
end

そこで、Flashスプライトの準備が整うまで、ビヘイビアインスタンスをactorListに格納し、アクセス可能になってからxCreateComboBox()関数を呼出すことにします。筆者のテストでは、2回目のon stepFrameで関数が呼出せました。しかし、この間のプロセスを明記したドキュメントは見当たらないようです。そうなると、この回数も確実とはいえません。

今回の処理の場合、ComboBoxクラスにアクセスできれば、Flash内の処理は問題なくできると考えられます。したがって、ComboBoxクラスへのアクセスをgetVariable()関数で試し、オブジェクトとして取得できたら、処理を進めることにします。

スクリプト005■Flashスプライトのビヘイビア自身による初期化処理でComboBoxインスタンスを生成

-- Flashスプライト: [ライブラリ]にComboBoxコンポーネントを格納
-- スプライトビヘイビア
property mySprite, lList, nDelay

on beginSprite(me)
  mySprite = sprite(me.spriteNum)
  lList = ["item0", "item1", "item2"]
  // actorListにビヘイビアを格納して準備待ち
  _movie.actorList.append(me)
end

on stepFrame(me)
  // ComboBoxクラスへの参照を取得
  ComboBox = mySprite.getVariable("_global.mx.controls.ComboBox", false)
  put ComboBox   -- テスト用
  if (objectP(ComboBox)) then
    me.xCreateComboBox(ComboBox)   -- 取得した参照を引数として渡す[*1]
    _movie.actorList.deleteOne(me)
  end if
end

on xCreateComboBox(me, ComboBox)
  _root = mySprite._root
  --  ComboBox = mySprite._global.mx.controls.ComboBox
  my_cb = _root.createClassObject(ComboBox, "my_cb", 1)
  my_cb._x = 10
  my_cb._y = 10
  nCount = lList.count
  repeat with i = 1 to nCount
    my_cb.addItem(lList[i], i)
  end repeat
end

なお、初めに述べましたように、実際のプロジェクトでは、このようなスクリプティングはあまり推奨されません。ComboBoxインスタンスの生成のような処理は、Flash側で行った方が柔軟なデザインといえるでしょう。つまり、Flash側にComboBox生成の関数を定義し、Directorからそれを呼出すという仕組みです。ComboBoxに設定する項目がDirector側の処理で決まるなら、その値をFlashスプライトに渡します。

ただし、Directorのリストは、Flashの(配列などの)データ型にはなりません。DirectorからFlashスプライト内に配列を(newObject()関数により)作成し、そこに必要な項目を値として追加したうえで、Flashからその配列を利用することになります。

[*1] ComboBoxクラスの参照は、on stepFrameハンドラでのアクセステストで取得済みなので、xCreateComboBox()関数に引数として渡し、関数内で再度取得する手間を省きました。

_____

作成者: 野中文雄
更新日: 2005年10月12日 DirectorからFlashに配列を渡す文末の説明を修正。
作成日: 2005年9月29日


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