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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     繰り返しでaddEventListenerを作成
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
Åê¹ÆNo.38263
投稿日時: 2008-3-30 1:29
繰り返しでaddEventListenerを作成
Stageにmcが10コ配置してあって、そのどれかをクリックでonMouseDownを実行したいのですが

for(var i:int=0; i<10; i++){
???.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

???部分はどう書けばよいのでしょうか?
as2では this["btn"+i] と書いていた所です
よろしくお願いします。
ニノミヤ カズノリ
Åê¹ÆNo.38264
投稿日時: 2008-3-30 1:46
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: 繰り返しでaddEventListenerを作成
引用:
prophetさんは書きました:
Stageにmcが10コ配置してあって、そのどれかをクリックでonMouseDownを実行したいのですが

for(var i:int=0; i<10; i++){
???.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

???部分はどう書けばよいのでしょうか?
as2では this["btn"+i] と書いていた所です

AS3.0でも変わらず、this["btn"+i]で行けると思います。
ゲスト
Åê¹ÆNo.38266
投稿日時: 2008-3-30 1:58
Re: 繰り返しでaddEventListenerを作成
ありがとうございます、this["btn"+i]は問題ないのですね

public function onMouseDown(Event:MouseEvent):void {
trace(this.name);
}

どのボタンを押しても出力がroot1になります
何故btn1とかではないのでしょうか?

永井勝則
Åê¹ÆNo.38267
投稿日時: 2008-3-30 1:59
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 繰り返しでaddEventListenerを作成
複数のムービークリップをムービークリップ(mc_set)にくるんで、
そのmc_setでaddEventListener()を実行しておくと、
イベントの伝播というやつで子に伝えてくれる、
という便利な手法があります。

mc_set.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownListener);

function onMouseDownListener(e:MouseEvent):void {
	trace(e.target.name);
}


----------------
永井勝則:
himco.jp :

ゲスト
Åê¹ÆNo.38268
投稿日時: 2008-3-30 2:19
Re: 繰り返しでaddEventListenerを作成
for(var i:int=0; i<10; i++){
this["btn"+i].addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}
public function onMouseDown(Event:MouseEvent):void {
trace(this.name);
}
でクリックしたmc名を取得することができました。
ありがとうございました。

このような処理はこの方法がベストなのでしょうか?
as3になってこの辺の処理がよくわかりません
参考になるサイトとかあれば教えて下さい。
野中文雄
Åê¹ÆNo.38269
投稿日時: 2008-3-30 11:01
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 繰り返しでaddEventListenerを作成
thisの参照先の違いは、おわかりになったのでしょうか。ActionScript 3.0からスコープの捉え方が変わりました。ActionScript 2.0からの移行時につまづきやすいポイントです。

参考: 『FLASH OOP』ActionScript 3.0版初稿 2-3「クラス定義とインスタンスの動的な生成」2-3-1-2「ActionScript 2.0を3.0と比較するためのポイント」および2-3-2-2「ActionScript 3.0と2.0の違い」

ちなみに、イベントオブジェクトの引数にEventという識別子を使うのは、止めましょう
引用:
prophetさんは書きました:
public function onMouseDown(Event:MouseEvent):void {
	trace(this.name);
}

どのボタンを押しても出力がroot1になります
何故btn1とかではないのでしょうか?

「このような処理」がどのような処理かによります。永井さんの手法との比較でいえば、その具体的な処理が親にさせるべきことなのか、個々の子に処理させた方がよいのかという、スクリプトの実質的なデザインに関わるからです。およそクリックで行う処理は、内容の如何を問わず、すべてこうするという決まりはありません。

マウスイベントについては、F-siteセミナー「イベントを制する者、ActionScript 3.0を制す」で解説しました。また、セミナーの様子は、F-siteセミナーレポートおよびそのトラックバック「閃光的網站・弛緩複合体」のReviewが詳しいです。
引用:
このような処理はこの方法がベストなのでしょうか?
as3になってこの辺の処理がよくわかりません
参考になるサイトとかあれば教えて下さい。


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

ゲスト
Åê¹ÆNo.38270
投稿日時: 2008-3-30 16:48
Re: 繰り返しでaddEventListenerを作成
参考サイトをいろいろ読んでみました。
まだ理解できない部分が多いですが少しずつAS3を勉強していきます
ありがとうございました。
永井勝則
Åê¹ÆNo.38271
投稿日時: 2008-3-30 18:01
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 繰り返しでaddEventListenerを作成
わたしの書いた、複数の子のボタンを親の中に入れるという方法は、真っ先に飛びつく方法ではないです。
混乱させてしまい、すいません。

ActionScript 3.0 + Flash CS3で、ムービークリップのボタンを複数
ダイナミックに作成するコードを4種類書いてみました。
やっていることはどれも同じなのですが、どこにどの機能を持たせているかが違います。
どれがよいとかよくないというのはないと思います。
addEventListener( )の設定場所も、ボタンに持たせたい機能によって変わってくると思います。

長文になります。

//(1)タイムラインにのみコードを記述する
// Flashのライブラリにボタン用のムービークリップ、リンケージ用クラス名Btn
//メインのタイムラインのフレーム
for (var i:uint=0; i<4; i++) {
	var btn:Btn=new Btn();
	btn.name="btn"+i;
	btn.x=30+(i*(btn.width+20));
	btn.y=20;
	addEventListener(MouseEvent.CLICK,onClickListener);
	addChild(btn);
}
function onClickListener(e:MouseEvent):void {
	trace(e.target.name);
	e.target.gotoAndStop(2);
}


///(2)ドキュメントクラス+FLAファイル
// Flashのライブラリにボタン用のムービークリップ、リンケージ用クラス名Btn
// FLAファイルの[ドキュメントクラス]にBtnClickを指定
// BtnClick.asファイル
package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class BtnClick extends Sprite {

		public function BtnClick() {
			for (var i:uint=0; i<4; i++) {
				var btn:Btn=new Btn();
				btn.name="btn"+i;
				btn.x=30+(i*(btn.width+20))
				btn.y=20;
				addEventListener(MouseEvent.CLICK,onClickListener)
				addChild(btn);
			}
		}
		
		private function onClickListener(e:MouseEvent):void{
			trace(e.target.name)
			e.target.gotoAndStop(2)
		}
	}
}


//(3-1)ASクラスファイル+FLAファイル
// Flashのライブラリにボタン用のムービークリップ、リンケージ用クラス名BtnClass
// メインのタイムラインでBtnClassのインスタンスを作成して、リスナーを設定
// メインのタイムライン
for (var i:uint=0; i<4; i++) {
	var btn:BtnClass=new BtnClass();
	btn.name="btn"+i;
	btn.x=30+(i*(btn.width+20));
	btn.y=20;
	btn.addEventListener(MouseEvent.CLICK,onClickListener);
	addChild(btn);
}

function onClickListener(e:MouseEvent):void {
	e.target.onClick("メインのタイムラインから");
}


//(3-2)ASクラスファイル+FLAファイル
// BtnClass.as
//FLAファイルでリンケージのクラスに設定されている
// メインのタイムラインでインスタンスを作成
// メインのタイムラインから送られてくる、関数と引数に反応
package {
	import flash.display.MovieClip;

	public class BtnClass extends MovieClip {
		public function BtnClass() {

		}
		public function onClick(mes:String):void {
			trace(this.name+mes);
		}
	}
}


//(4-1)ASクラスファイル+FLAファイル
// FLAファイルではこのSetBtnをドキュメントクラスに設定
// FLAファイルのライブラリには、ボタンのムービークリップをBtnClass2という名前で
// リンケージのクラス名に指定
// このクラスはメインクラス、BtnClass2を使ってボタンを配置
package {
	import flash.display.Sprite;

	public class SetBtn extends Sprite {
		public function SetBtn() {
			for (var i:uint=0; i<4; i++) {
				var btn:BtnClass2=new BtnClass2();
				btn.name="btn"+i;
				btn.x=30+(i*(btn.width+20));
				btn.y=20;
				addChild(btn);
			}
		}
	}
}


//(4-2)ASクラスファイル+FLAファイル
// メインクラスから呼び出されるボタンのクラス
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;

	public class BtnClass2 extends MovieClip {
		public function BtnClass2() {
			addEventListener(MouseEvent.CLICK,onClickListener)
		}
		public function onClickListener(e:MouseEvent):void {
			trace(this.name);
		}
	}
}

なお、
各ファイルともエラーは出ていないので問題ないとは思うのですが
記述に間違いまたは不適切な箇所がある可能性はあります。

個人的には、1か4の方法が”潔い”ので好きです。


----------------
永井勝則:
himco.jp :

ゲスト
Åê¹ÆNo.38274
投稿日時: 2008-3-31 0:15
Re: 繰り返しでaddEventListenerを作成
ありがとうございます、いろいろ試してみます

function onClickListener(e:MouseEvent):void {
trace(e.target.name);
}
上記のような書き方は自分ではなかなか見つけられないです。

現在、永井さんが翻訳した「ActionScript 3.0アニメーション」と
ActionScript 3.0入門ノート/大重美幸著、を読んでAS3に挑戦しているところです
他に良い書籍があれば教えて下さい。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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