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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     カスタム関数引数に、e.targetを適用した際のエラーに関して
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
joyko
Åê¹ÆNo.42772
投稿日時: 2009-7-2 17:32
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
カスタム関数引数に、e.targetを適用した際のエラーに関して
皆さん、
いつもお世話になってます。
まだ、AS2.0を引きずっており、AS3.0は勉強途中の身です。
環境は、WinXP(SP3)とCS3/AS3.0です。
【やろうとしてること】
1.ライブラリー内にあるクラス名Sikakuをnew演算子でステージに、for文を使って、10個ほど、ランダムに配置し、
それぞれに一回目にロールオーバーすると、動き出し、二回目にロールオーバーすると、停止する。
その際、他のインスタンスの動きには、影響を与えない、独立事象とする。
【実施したこと】
AS2.0で、attachMovie();を使って、作成してみましたが、意図通り動きます。

//以下は、AS2.0で、フレームアクションで記載し、正常に稼動します。
var list:Array=new Array();
for (var i:Number = 1; i<=10; i++) {
	var mc:MovieClip = this.attachMovie("Sikaku", "mc"+i, i);
	mc._x = Stage.width-Stage.width*Math.random();
	mc._y = Stage.height-Stage.height*Math.random();
	list.push("flag"+i);//配列に、flag1?flag10までの要素を格納する
	//trace(list);
	mc.id=i;
	mc.onRollOver = function() {
		list["flag"+this.id]=!list["flag"+this.id];
		//mc番号に相当する、list["flag"+this.id]がfalseなら、trueに、trueなら、falseにする
		//trace(this+":"+list["flag"+this.id]);
		if (list["flag"+this.id]) {
			//list["flag"+this.id]がtrueなら、カスタム関数を、target_mcと、playmodeを引数に、実行
			xEnterFrame(this,true);//playmode=true;となり、移動開始
		} else {//falseなら、同じく、引数を変更して、停止させる
			xEnterFrame(this,false);//playmode=false;となり、停止
		} 
	};
}

function xEnterFrame(target_mc:MovieClip, playmode:Boolean) {
	var speed:Number = 2;
	target_mc.onEnterFrame = function():Void  {
		if (playmode) {//trueなら、
			this._x += speed;
			if (this._x<0 || this._x>Stage.width) {
				speed = -speed;
			}
		} else {//falseとなったら、
			speed = 0;//停止
		}
	};
}


以下が、gaienboyさんに教えて頂いた方法で、訂正したAS3.0です。正常稼動します!gaienboyさん、ありがとうございました!

var list:Array=new Array();
for (var i:int=1; i<=10; i++) {
	var sikaku:MovieClip=new Sikaku();
	sikaku.x=stage.stageWidth-stage.stageWidth*Math.random();
	sikaku.y=stage.stageHeight-stage.stageHeight*Math.random();
	addChild(sikaku);
	list.push("flag"+i);
	//trace(list);//正常表示
	sikaku.id=i;//iをsikaku.idに保管
	sikaku.addEventListener(MouseEvent.ROLL_OVER,xRollOver);

}

function xRollOver(e:MouseEvent):void {//for文の外に出す
	var sikaku:MovieClip = e.target as MovieClip;//castする
	var instance=e.target;
	//trace(instance.name);//正常
	list["flag"+e.target.id]=!list["flag"+e.target.id];
	//「"flag"+e.target.id」がfalseなら、trueに、trueなら、falseに変更
	//trace(list["flag"+e.target.id]);//正常
	if (list["flag"+e.target.id]) {
		xMove(sikaku,true);//正常となりました!
	} else {
		xMove(sikaku,false);//正常となりました!
	}
}

function xMove(mc:MovieClip,playmode:Boolean) {
	var speed:int=2;
	mc.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
	function EnterFrameHandler(e:Event):void {
		if (playmode) {
			e.target.x+=speed;
			if (e.target.x<0 || e.target.x>stage.stageWidth) {
				speed=-speed;
			}
		} else {
			speed=0;
		}
	}
}
Tonpoo (gaienboy改め)
Åê¹ÆNo.42776
投稿日時: 2009-7-2 18:53
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: カスタム関数引数に、e.targetを適用した際のエラーに関して
gaienboyです。上記でエラーが出る原因についてですが、MouseEvent.targetプ
ロパティやEvent.targetプロパティの型がObjectであるため
です。

Eventクラス:targetプロパティ

joykoさんのスクリプトでは、e.targetが指しているもの(sikaku)は
MovieClipインスタンスです。ただ、e.targetそのものの型がObjectであるため、
xMoveファンクションの引数としてMovieClipインスタンスを指定しなければなら
ないところにObjectインスタンスを指定した
ことになり、結果としてエラーが出
てしまう、ということになります。

エラー回避の方法ですが、as演算子やクラス関数を使ってデータ型の変換(キャ
スト)
という処理を行うと可能です。

なお、joykoさんのスクリプトでは、for文の中でxRollOverというファンクション
が定義されてしまっています。このファンクション自体は10回も定義しなくてい
いので(笑)、for文から外してみてはどうでしょうか。

下記に、私なりのやり方で書いてみたスクリプトを掲載してみます。参考になさっ
てみてください。

for(var i:uint=0;i<10;i++){
	var mc:MovieClip = new Sikaku();
	mc.x = Math.floor(Math.random() * this.stage.stageWidth);
	mc.y = Math.floor(Math.random() * this.stage.stageHeight);
	mc.id = i;
	mc.isMoving = false;
	mc.xSpeed = 5 - Math.floor(Math.random() * 10);
	mc.ySpeed = 5 - Math.floor(Math.random() * 10);
	this.addChild(mc);
	mc.addEventListener(MouseEvent.MOUSE_OVER,xRollOver);
}

function xRollOver(e:MouseEvent):void{
	var mc:MovieClip = e.target as MovieClip;	//as演算子を使ってe.targetをMovieClipにキャスト
	if(mc.isMoving){
		mc.removeEventListener(Event.ENTER_FRAME,xMove);
	}else{
		mc.addEventListener(Event.ENTER_FRAME,xMove);
	}
	mc.isMoving = ! mc.isMoving;
}

function xMove(e:Event):void{
	var mc:MovieClip = MovieClip(e.target);	//クラス関数を使ってe.targetをMovieClipにキャスト
	mc.x += mc.xSpeed;
	mc.y += mc.ySpeed;
}


【追記】
今思ったんですけど、上記のスクリプト、xMoveをイベントリスナーにしてしま
ったので、引数としてMovieClip型が要求されているかどうかは関係なくなってし
まいましたね(汗)。元のjoykoさんのスクリプトの中でキャストを行うならば、
var instance = e.target;

となっているところを、
var instance:MovieClip = e.target as MovieClip;

もしくは、
var instance:MovieClip = MovieClip(e.target);

とすればいいかと思います。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

joyko
Åê¹ÆNo.42782
投稿日時: 2009-7-3 0:56
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
Re: カスタム関数引数に、e.targetを適用した際のエラーに関して
gaienboyさん、
またまた、早速のご教授、ありがとうございました!
>as演算子やクラス関数を使ってデータ型の変換(キャ
スト)という処理を行うと可能です。

>for文から外してみてはどうでしょうか。

この2つを行いましたら、正常稼動いたしました!

gaienboyさんのscriptも勉強させて頂きます!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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