トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ループで複数のMCにイベントハンドラを登録する方法
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
蛾次郎
Åê¹ÆNo.34347
投稿日時: 2007-7-25 10:32
新米
居住地: 東京都
投稿: 12
使用環境:
Windows XP SP2
Flash CS3
Flash 8
ループで複数のMCにイベントハンドラを登録する方法
root にいくつかの同様な動作をさせたいムービークリップがあり、その上のテキストフィールドの文字列を指定したり、イベントハンドラを設定したいと思っています。

引用:
root -+- item0_mc -+- title_txt
|
+- item1_mc -+- title_txt
|
+- item2_mc -+- title_txt
|
+- item3_mc -+- title_txt
|
+- item4_mc -+- title_txt


以上のような感じになっています。

最初は以下のようなコードをムービークリップの数書いていたのですが、

引用:
item0_mc.title_txt.text = "ほげほげ";

item0_mc.onRollOver = function()
{
var fmt:TextFormat = item0_mc.title_txt.getTextFormat();
fmt.color = 0xffffff;
item0_mc.title_txt.setTextFormat(fmt);
};

item0_mc.onRollOut = function()
{
var fmt:TextFormat = item0_mc.title_txt.getTextFormat();
fmt.color = 0x0b4176;
item0_mc.title_txt.setTextFormat(fmt);
};


このムービークリップの数が動的に変わるので、ループで設定しようと思い、以下のようなコードを書きました。

引用:
var titles_array:Array = ["ほげほげ", "ふげふげ", "がすがす", "どんどん", "だらだら"];

for (var i:Number = 0; i < 5; i++)
{
this["item" + i + "_mc"].title_txt.text = titles_array[i];
this["item" + i + "_mc"].onRollOver = function()
{
var fmt:TextFormat = this["item" + i + "_mc"].title_txt.getTextFormat();
fmt.color = 0xffffff;
this["item" + i + "_mc"].title_txt.setTextFormat(fmt);
};
this["item" + i + "_mc"].onRollOut = function()
{
var fmt:TextFormat = this["item" + i + "_mc"].title_txt.getTextFormat();
fmt.color = 0x0b4176;
this["item" + i + "_mc"].title_txt.setTextFormat(fmt);
};

}


しかし、このコードではうまくいきませんでした。
ムービークリップ上にマウスを持っていっても文字色が変わらないのです。ハンドラに trace 文を入れると出力されるのでハンドラとしては登録されているのだと思います。

おそらく基本的な部分で間違っていると思うのですが、現在どこが間違っているのか予想ができない状態です。
「ここが違う」「普通はこのようなコードを書く」などありましたら、教えていただけないでしょうか。


----------------
蛾次郎@東京

蛾次郎
Åê¹ÆNo.34348
投稿日時: 2007-7-25 10:52
新米
居住地: 東京都
投稿: 12
使用環境:
Windows XP SP2
Flash CS3
Flash 8
Re: ループで複数のMCにイベントハンドラを登録する方法
自己レスです。

forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する
http://www.fumiononaka.com/TechNotes/Flash/FN0601002.html

を見ているところです。どうも、

引用:
タイムライン上には、forループの処理を終えたカウンタ変数iが値3をもっています。したがって、どのMovieClipインスタンスも、スクリプトの記述場所にあるタイムライン変数iを、共通に参照する結果となったのです。


あたりが問題のようです。
もう少し調べてみます。


----------------
蛾次郎@東京

ひろゆき
Åê¹ÆNo.34349
投稿日時: 2007-7-25 11:07
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: ループで複数のMCにイベントハンドラを登録する方法
var titles_array:Array = ["ほげほげ", "ふげふげ", "がすがす", "どんどん", "だらだら"];

for (var i:Number = 0; i < 5; i++) {
	var _mc:MovieClip = this["item" + i + "_mc"];
	_mc.title_txt.text = titles_array[i];
	_mc.onRollOver = function():Void {
		var fmt:TextFormat = this.title_txt.getTextFormat();
		fmt.color = 0xffffff;
		this.title_txt.setTextFormat(fmt);
	};
	_mc.onRollOut = function():Void {
		var fmt:TextFormat = this.title_txt.getTextFormat();
		fmt.color = 0x0b4176;
		this.title_txt.setTextFormat(fmt);
	};
}
で、いかがですか?

forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する」の前に、
Buttonのthis」をお読みになった方が良いように思います。


----------------
質問する際は、回答者に具体的な情報を与えてください。

蛾次郎
Åê¹ÆNo.34350
投稿日時: 2007-7-25 11:09
新米
居住地: 東京都
投稿: 12
使用環境:
Windows XP SP2
Flash CS3
Flash 8
Re: ループで複数のMCにイベントハンドラを登録する方法
結局、

引用:
this["item" + i + "_mc"].onRollOver = function()
{
var fmt:TextFormat = this.title_txt.getTextFormat();
fmt.color = 0xffffff;
this.title_txt.setTextFormat(fmt);
};
this["item" + i + "_mc"].onRollOut = function()
{
var fmt:TextFormat = this.title_txt.getTextFormat();
fmt.color = 0x0b4176;
this.title_txt.setTextFormat(fmt);
};


とすることで目的の動作をすることがかわりました。

なぜ、ループで書いた場合とループで書かなかった場合に差異があるのかは不明です…


----------------
蛾次郎@東京

ひろゆき
Åê¹ÆNo.34351
投稿日時: 2007-7-25 11:21
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: ループで複数のMCにイベントハンドラを登録する方法
もっとシンプルなもので、テストされるなどしないと、
訳が分からないままでしょう。

_root 上に、ムービークリップ(インスタンス名: mc1, mc2) を配置。
(ムービープレビューにて、確認)

_root 第1フレームに
for (var n:Number = 1; n <=2; n++) {
	this["mc"+n].onRelease = function():Void {
		trace(this);
		trace(n);
		trace(this["mc"+n]);
	};
}
と記述。

_root 第1フレームに
for (var n:Number = 1; n <=2; n++) {
	mc1.onRelease = function():Void {
		trace(this);
		trace(n);
		trace(this["mc"+n]);
	};
	mc2.onRelease = function():Void {
		trace(this);
		trace(n);
		trace(this["mc"+n]);
	};
}
と記述。(あまり、このような記述はしないと思いますが、あえて)

_root 第1フレームに
for (var n:Number = 1; n <=2; n++) {
	this["mc"+n].id = n;
	this["mc"+n].onRelease = function():Void {
		trace(this);
		trace(n);
		trace(this.n);
		trace(this["mc"+n]);
		trace(_root["mc"+this.n]);
	};
}
と記述。


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.34352
投稿日時: 2007-7-25 11:44
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ループで複数のMCにイベントハンドラを登録する方法
「ループ」しなくても、変数iやthisの参照を正しく理解しなければ同じことです。
引用:
蛾次郎さんは書きました:
なぜ、ループで書いた場合とループで書かなかった場合に差異があるのかは不明です…

var i:Number = 0;
this["item"+i+"_mc"].onRollOver = function() {
	trace([i, this, this["item"+i+"_mc"], this._parent["item"+i+"_mc"]]);
};
i++;
this["item"+i+"_mc"].onRollOver = function() {
	trace([i, this, this["item"+i+"_mc"], this._parent["item"+i+"_mc"]]);
};


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

蛾次郎
Åê¹ÆNo.34358
投稿日時: 2007-7-25 13:39
新米
居住地: 東京都
投稿: 12
使用環境:
Windows XP SP2
Flash CS3
Flash 8
Re: ループで複数のMCにイベントハンドラを登録する方法
i に関しては、ループ中で、
this["item"+i+"_mc"]._i = i;

などとして this._i を使い、(カウントアップ済みの)root の i を使わないという方法を取るということがわかりました。

this についてなんですが、

root -+- textField1
   |
   +- movieClip1
      |
      +- textField1

という構成で、movieClip1.onRollOver の中で、

this は _level0.movieClip1
textField1 は _root.textField1
this.textField1 は _root.movieClip1.textField1

今まで、いつでも textField1 は this.textField1 だと思っていましたが、_root.textField1 と _root.movieClip1.textField1 ということで違うものなんですね。

もう少し、勉強してみます。



----------------
蛾次郎@東京

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops