dポイントプレゼントキャンペーン実施中!

変数の利用方法

皆様いつもお世話になっています。
毎回単純な質問ばかりして申し訳ないのですが、どうしてもエラーの原因が分からなくて投稿させて
いただきました。

環境は CS3のAS3 です。

下記のソースでどうしても、ボタンにマウスオーバーしたときに、
【条件は未定義であり、プロパティがありません。】
とでます。

自分的には、gotoAndPlayのインスタンス名のしての仕方が悪いのかと思っているのですが、
複数のボタンで同じ処理をさせたいので、直接インスタンス名を指定しないで、変数で指定したいのですが。

本当に説明がへたくそでスイマセン。
宜しくお願いいたします。

-------------------------------------------------------------------

//マウスオーバー
bot1.addEventListener(MouseEvent.MOUSE_OVER, handleRollOver(1));


function handleRollOver(bot:int){
return function (e:MouseEvent){
this["bot" + bot].gotoAndPlay("Over");
}
}

-------------------------------------------------------------------

A 回答 (1件)

this を trace アクションで表示してみると分かるのですが、return function の中にある this はスクリプトを書いたタイムライン(例えばメインのタイムラインに書いた場合はメインのタイムライン)を指していません。


このため、新たに作られる関数の中では、this を使うと目的のインスタンスを指すことが難しくなります。


ActionScript 3.0 では、イベントが起きた時に addEventListener で登録しておいた関数が自動的に呼び出されます。
この時、発生したイベントに関する様々な情報を1つにまとめたものが、呼び出される関数に渡される約束になっています。
渡される情報の1つに、イベントが発生した対象(今回の件ではムービークリップ)の参照があります。例えば bot1 でイベントが発生した時は、bot1 を表す情報が含まれています。

渡される情報は、addEventListener で登録する関数の中で使うこともできます。
bot1 にカーソルを合わせた時に自分自身のタイムラインのフレームを移動したいのであれば、この情報を利用すると便利です。


ステージにムービークリップ bot1 ~ bot3 があるとします。
それぞれにカーソルを合わせた時、自分自身のフレームラベル "Over" に移動するスクリプトの一例です。
このスクリプトは、メインのタイムラインのフレームに記述してください。

(↓ 各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)


//- - - - -

 function handleRollOver( e:MouseEvent )
 {
  //イベントが発生した対象自身のフレームに移動
  e.target.gotoAndPlay( "Over" );
 }

 //イベント処理をまとめて定義
 for( var i:int = 1 ; i <=3 ; i++ )
 {
  this[ "bot" + i ].addEventListener( MouseEvent.MOUSE_OVER , handleRollOver );
 }

//- - - - -


イベントに関する情報はたくさんあるので、1つのオブジェクトにまとめて渡されてきます。
受け取る情報全体を表す部分が、handleRollOver 関数の仮引数である e です。
関数の中で個々の情報を取り出すには、e の中の、知りたい情報を管理している個別の変数の名前を指定します。

イベントが発生した対象の情報は” target ”という名前の変数に入っており、対象がどんな名前でも対応できるようになっています。
関数の中では同じ e.target という記述でも、bot1 でイベントが起きた時は bot1 を、bot2 の場合は bot2 のことを指しますから、ムービークリップがいくつあってもイベント処理関数は1つだけで済みます。
    • good
    • 0
この回答へのお礼

丁寧に教えて頂きまして、ありがとうございます。

分からないことだらけで、無我夢中でやっていましたが、
教えて頂いた内容を何度も、よむことでイベント処理の事が
少しずつ分かってきました。

教えた頂いたソースでボタンの処理も無事に成功しました。
本当にありがとうございました。

お礼日時:2010/07/13 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!