|
Macromedia Director非公式テクニカルノート
mouseOverButtonプロパティがFlashスプライトのTextField上でTRUEを返す
ID: FN0406004 |
Product: Director |
Platform: All
Viersion: 10.0 and above
1. 現象
mouseOverButtonは、「Flashムービースプライト内のボタン上にあるかどうかを調べるFlash スプライトプロパティです」(Director MX 2004「Directorスクリプトリファレンス」)。ところが、TextFieldインスタンス上で、プロパティの値としてTRUE(ボタン上の場合の値)を返すことがあります。
Flashスプライト内のボタンは、マウスポインタがロールオーバーしても、そのままでは指先カーソルに変わりません。そのめたには、mouseOverButtonプロパティの値を判定して、cursor()メソッドでカーソルの変更を行う必要があります。以下は、Flashスプライトピヘイビアのサンプルです(スクリプト001)。
スクリプト001■Flashスプライト内のボタン上でマウスポインタを指先カーソルに変更するビヘイビア
-- Flashスプライトビヘイビア
-- ボタン上でマウスポインタを指先カーソルに変更
property pSprite, pFlash_root
on beginSprite(me)
pSprite = sprite(me.spriteNum)
end
on mouseWithin(me)
if (pSprite.mouseOverButton) then
if (not pFlash_root.xOnTextField()) then
pSprite.cursor = 280 -- 指先カーソル
end if
else
pSprite.cursor = -1 -- 矢印カーソル
end if
end
|
問題の発生するFlashスプライトにこのビヘイビアを設定すると、TextFieldインスタンス上でもポインタが指先カーソルに変わってしまうことがあります。
2. 原因
Director MX 2004に読込んだFlash MX 2004スプライトで報告された問題です。TextFieldインスタンスが[選択可能]に設定されている場合(図001)、mouseOverButtonプロパティの値としてTRUEが返されます。
図001■Flash MX 2004で[選択可能]に設定されたTextField
3. 対処法
[1] Flashムービー作成時に、TextFieldの[選択可能]の設定を外します。
[2] スクリプトでマウスポインタがTextField上にあるかどうかの判定を加えて、対応する方法が考えられます[*1]。以下は、そのサンプルです(スクリプト002および003。mouseOverButton.zip/mouseOverButton.sit/同内容約80KB)。
スクリプト002■TextField上にマウスポインタがロールオーバーしているかどうかを返す関数
// Flash(SWF)ムービー
// _root
// フレームアクション
// [選択可能]に設定したTextFieldインスタンスmy1_txtとmy2_txtを配置
texts_array = [my1_txt, my2_txt]; // [選択可能]なTextFieldインスタンスの配列
// マウスポインタが配列に指定したTextFieldインスタンス上にあるかどうかを返す関数
function xOnTextField() {
for (var i = 0; i<texts_array.length; ++i) {
var _txt = texts_array[i];
if (this.xInside(_xmouse, _ymouse, _txt._x, _txt._y,
_txt.x+_txt._width, _txt._y+_txt._height)) {
return true;
}
}
return false;
}
function xInside(nX, nY, nLeft, nTop, nRight, nBottom) {
return (nX>=nLeft && nX<=nRight && nY>=nTop && nY<=nBottom);
}
|
[選択可能]TextFieldを配置したタイムライン_rootに設定
スクリプト003■[選択可能]TextField上にマウスポインタがあるかどうかを確認してカーソルを変更
-- Flashスプライトビヘイビア
property pSprite, pFlash_root
on beginSprite(me)
pSprite = sprite(me.spriteNum)
-- Flashスプライトの_level0(_root)タイムラインを取得
pFlash_root = pSprite.getVariable("_level0", false)
end
on mouseWithin(me)
if (pSprite.mouseOverButton) then
-- Flash(SWF)の関数を呼出してポインタがTextField上にあるかどうかを確認
if (not pFlash_root.xOnTextField()) then
pSprite.cursor = 280
end if
else
pSprite.cursor = -1
end if
end
|
Flashスプライトに設定
[*1] [選択可能]に設定した[静止テキスト]上でも、mouseOverButtonプロパティはTRUEを返します。しかし、Flashでは[静止テキスト]はTextFieldインスタンスではなく、その領域をスクリプトで取得することができません。したがって、[静止テキスト]については、スクリプトで対処することは困難です。ただ、[静止テキスト]を[選択可能]に設定するケースは、少ないと考えられます。
|
_____
作成者: 野中文雄
作成日: 2004年6月26日
Copyright © 2001-2003
Fumio Nonaka. All rights reserved.
|