サイトトップ

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

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.