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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   FLASH目安箱【バグ報告・要望】
     変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hanywa
Åê¹ÆNo.6710
投稿日時: 2004-4-28 19:48
新米
居住地: 兵庫
投稿: 10
使用環境:
Win2K,Flash MX2004
変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
duplicateしたMovieClipのもつ変数の1つが突然消える現象に
出くわしました。

1.depulicateしたMovieClipに5つ変数を設定。
 各変数に値を入れます。
 このうち1つの変数名は"moveD"です。
 "move"だとUIObject.moveと判断されますが、
 後ろに"D"をつけて回避したつもりでした。

2.depulicateしたMovieClipをクリックすると
 Functionをよびだすように設定。

3.Function内でサウンドを鳴らし、同Function内で
 onSoundCompleteを使いサウンド終了後の処理を入れます。

すると、サウンドを鳴らす処理をしている間は
そのセルがもっていた変数"moveD"に値が入っているのを
traceを使い確認したのですが、onSoundCompleteの処理に
入ったと同時にtraceで"moveD"がundefinedとなりました。
他の4つの変数はtraceで確認できるので
ターゲットパスが間違えている訳ではなさそうです。

で、もしやと思い、"moveD"を"goD"に変更したところ、
上記問題は発生しませんでした。

どうやら予約語(メソッド名やプロパティ名)が変数名に
含まれていると何らかのタイミングで不具合が起こるようです。
depulicateが関係あるのか、onSoundCompleteが関係あるのかは
まだ絞りきっていません。

同様な経験をされた方はいらっしゃいませんでしょうか。
ゲスト
Åê¹ÆNo.6712
投稿日時: 2004-4-28 20:09
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
こんにちは。

いいえ、MovieClipクラスはUIObjectクラスを継承しません。むしろ逆です。
よって仰るような意味の「予約語」ではありません。
引用:
 このうち1つの変数名は"moveD"です。
 "move"だとUIObject.moveと判断されますが、
 後ろに"D"をつけて回避したつもりでした。

本当に変数名を変更したらその不具合が確認できないのでしたら、何らかのバグかもしれません。良ければスクリプト自体を載せて頂くとありがたいです。
hanywa
Åê¹ÆNo.6717
投稿日時: 2004-4-28 21:56
新米
居住地: 兵庫
投稿: 10
使用環境:
Win2K,Flash MX2004
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
「予約語」は付け焼刃な知識で書いたため間違えていたと思います。
申し訳ないです。

関連するスクリプト自体はかなりの量があり全部乗せるのは無理なので
呼び出し部分とFunctionの部分を一部割愛した状態でよいでしょうか。

onClipEvent(mouseUp){
	if(this.hitTest(_root._xmouse,_root._ymouse,true) && this.moveD!="N" && this._currentframe>=3){	
		if(this.moveD=="M"){		//イベントの場合
			_parent.Mevent(this._name,_parent.HitObj);
		}
	}
}


function Mevent(CName,NCname){
var EveMp3 = this[CName].eveMp3;
	if(EveMp3.length>0){
		EveSound = new Sound(EMp3_mv);
		EveSound.loadSound("MP3/"+EveMp3+".mp3", false);
		EMp3_mv.gotoAndPlay(1);
		EMp3_mv.onEnterFrame = function() {
			if (EveSound.getBytesLoaded()>=EveSound.getBytesTotal()) {
				EveSound.setVolume(150);
				EveSound.start();
				EMp3_mv.onEnterFrame = null;
			}else{
				trace("wait");
			}
		}
		trace(eval(CName).moveD);
		EveSound.onSoundComplete = function() {
		trace(eval(CName).moveD);
			img_mv[EveImg]._alpha=0;
			charaEv(NCname,chara_mv._x,chara_mv._y);
			chara_mv._alpha=100;
		};
	}
}

これでmoveDのところをgoDにするとtraceで取れているのですが、
このままだと2回目(onSoundComplete後)のtraceで取れなくなっています。

いまためしに"moveD"を"Dmove"に変えたところ問題なく動きました。
"move"+"D"の場合が問題なようです。
ゲスト
Åê¹ÆNo.6718
投稿日時: 2004-4-28 23:38
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
やはりそのような不都合は確認されません。
怪しいのはインスタンス参照にeval()を使っている所です。eval()はスコープチェーンを辿るという点で配列アクセスと異なります。
おそらく一部割愛した部分に原因があると思います。配列アクセスでインスタンス参照をしてみたり、デバッガでコードを辿ったりしてみてはいかがでしょう。

以下、実行コード。
var EMp3_mv:MovieClip;
var My_mc:MovieClip;
var EveSound:Sound;

My_mc.moveD = "will this be remain...?";
My_mc.onRelease = function()
{
     _root.Mevent(this._name);
};

function Mevent(CName:String):Void
{
     EveSound = new Sound(EMp3_mv);
     EveSound.onSoundComplete = function()
     {
          trace([eval(CName).moveD, _root[CName].moveD]);
          //出力:will this be remain...?, will this be remain...?
     };
     
     EveSound.loadSound("sample.mp3", false);
     trace([eval(CName).moveD, _root[CName].moveD]);
     //出力:will this be remain...?, will this be remain...?

     /*
     var My_mc;     //例えばこのような変数を宣言したりすると
     trace([eval(CName).moveD, _root[CName].moveD]);
     //出力:undefined, will this be remain...?
     */
     
     EMp3_mv.play();
     EMp3_mv.onEnterFrame = function()
     {
          if (_root.EveSound.getBytesLoaded() >= _root.EveSound.getBytesTotal())
          {
               _root.EveSound.setVolume(150);
               _root.EveSound.start();
               delete this.onEnterFrame;
          }
     };
}
hanywa
Åê¹ÆNo.6761
投稿日時: 2004-4-30 13:35
新米
居住地: 兵庫
投稿: 10
使用環境:
Win2K,Flash MX2004
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
検証してくださってありがとうございます。
確かにこのスクリプトでは問題なく動いています。

このスクリプトを元に、テストをしてみました。
まず、今自分が作っているものですが、クリックするMCは
Depulicateして使うので、Depulicate元のMCに
onClipEvent(mouseUp){
	_root.Mevent(this._name);
}

_rootにあるFunctionの街頭部はコメントアウトします
//My_mc.onRelease = function(){
//	_root.Mevent(this._name);
//};

これで動かしてもTraceの結果は同じです。

次にDepulicateで今のMCの名前を"Myz_mc"にし、_rootのFunctionに
Depulicateする一文を書き加えます。
var EveSound:Sound;
Myz_mc.duplicateMovieClip("My_mc",999);
My_mc._y = My_mc._y+100;
My_mc.moveD = "will this be remain...?";

これで動かすとTraceに
will this be remain...?,will this be remain...?
undefined,undefined
undefined,undefined

と表示されます。
これだと変数名を"goD"に変えても同じ結果なんで、
私が行き詰まっている現象と異なるのですが、このような事になりました。
私のDepulicateの使い方がおかしいのでしょうか。
hanywa
Åê¹ÆNo.6766
投稿日時: 2004-4-30 13:49
新米
居住地: 兵庫
投稿: 10
使用環境:
Win2K,Flash MX2004
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
引用:

怪しいのはインスタンス参照にeval()を使っている所です。eval()はスコープチェーンを辿るという点で配列アクセスと異なります。

未だにeval()の使い方がよくわかっていません。悪戦苦闘中です。
「迷える子羊の部屋」に行きたい気分です。

それに便乗して動作に関係ないところなのですが、
私が前に転載したFunctionのうちonSoundComplete付近のTraceで
		trace(this[CName].goD);
		EveSound.onSoundComplete = function() {
			trace(this[CName].goD);
			trace(_root[CName].goD);
			trace(eval(CName).goD);
			img_mv[EveImg]._alpha=0;
			charaEv(NCname,chara_mv._x,chara_mv._y);
			chara_mv._alpha=100;
		};

と入れたらonSoundComplete内の
trace(this[CName].goD);
だけundefinedになってしまい頭が???状態です。
_root指定は今作っているムービーの性質上使えないので
相対パスに頼るしかないのですが・・・
野中文雄
Åê¹ÆNo.6769
投稿日時: 2004-4-30 14:16
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
MovieClip以外のオブジェクト(Soundインスタンス)に定義した関数内では、thisが(Sound)インスタンス自身を参照します。これは、ターゲットを省略したデフォルト参照とは異ります。
引用:
hanywaさんは書きました:
        trace(this[CName].goD);
        EveSound.target_mc = this;  //【追加】
        EveSound.onSoundComplete = function() {
            trace(this[CName].goD);
            trace(_root[CName].goD);
            trace(eval(CName).goD);
            trace(this. target_mc.goD);  //【追加】
            // [後略]

と入れたらonSoundComplete内の
trace(this[CName].goD);
だけundefinedになってしまい頭が???状態です。


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

野中文雄
Åê¹ÆNo.6770
投稿日時: 2004-4-30 14:26
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
引用:
hanywaさんは書きました:
次にDepulicateで今のMCの名前を"Myz_mc"にし、_rootのFunctionに
Depulicateする一文を書き加えます。
var EveSound:Sound;
Myz_mc.duplicateMovieClip("My_mc",999);
My_mc._y = My_mc._y+100;
My_mc.moveD = "will this be remain...?";

いつどこにどのようなtrace()ステートメントを記述しているのでしょうか? MovieClipの名前が変わりましたので、先のポストとはスクリプトも異なってくると思います。正しく書替えていなければ、当然undefinedが出力されます。
引用:
これで動かすとTraceに
will this be remain...?,will this be remain...?
undefined,undefined
undefined,undefined

と表示されます。


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

hanywa
Åê¹ÆNo.6772
投稿日時: 2004-4-30 15:21
新米
居住地: 兵庫
投稿: 10
使用環境:
Win2K,Flash MX2004
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
野中文雄さんは書きました:
引用:
MovieClip以外のオブジェクト(Soundインスタンス)に定義した関数内では、thisが(Sound)インスタンス自身を参照します。これは、ターゲットを省略したデフォルト参照とは異ります。

ありがとうございます。Soundインスタンス自信を参照するのですね。

引用:
MovieClipの名前が変わりましたので、先のポストとはスクリプトも異なってくると思います。

ごめんなさい。ご指摘いただいて自分がDepulicate時の
onClipEventの動きについて誤った解釈をしていた事に気が付きました。
お二方、特にマツダ様は検証時間も割いていただいて本当に申し訳ないです。本当にすみませんでした。
ゲスト
Åê¹ÆNo.6774
投稿日時: 2004-4-30 17:31
Re: 変数名にメソッド名やプロパティ名(予約語)が含まれてたらアウト?
結局解決なさったのですか?
でしたら参考の為に、何処をどのように修正したのか教えていただくと有り難いのですが、、、。
引用:

hanywaさんは書きました:
ごめんなさい。ご指摘いただいて自分がDepulicate時の
onClipEventの動きについて誤った解釈をしていた事に気が付きました。
お二方、特にマツダ様は検証時間も割いていただいて本当に申し訳ないです。本当にすみませんでした。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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