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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     変数の代入と初期値の必要性について質問です
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kogua
Åê¹ÆNo.36561
投稿日時: 2007-11-29 23:24
半人前
居住地:
投稿: 51
使用環境:
WindowsXPsp3,FlashCS3
変数の代入と初期値の必要性について質問です
すごく基本的なところですみません。

やりたいことはできてるのですが
ある疑問が解けないので質問させてください。
2つのケースを比較します。

<ケース1>
ルートに、MCとボタンを1つずつ配置します。

●そのMC(インスタンス名はug_mc)に書いたスクリプト
onClipEvent (load) {
idoY= 100;
dainyuY = 0;
}
onClipEvent (enterFrame) {
dainyuY= (idoY-this._y)/5;
this._y += dainyuY;
}

●ボタンに書いたスクリプト
on (rollOver) {
_root.ug_mc.idoY = 150;
}
on (rollOut) {
_root.ug_mc.idoY = 100;
}

つまり、ボタンを触ると、ug_mcのy座標が
150のところにゆっくり移動し、
ロールアウトすると
y座標が100の位置にゆっくり戻る、
というだけのスクリプトです。

そして、もう一つ(ケース2)は、ゆっくり移動する部分に
バネのような動きを持たせたところだけが異なっています。

<以下ケース2>
●MC(インスタンス名はug_mc)に書いたスクリプト
onClipEvent (load) {
idoY= 100;
dainyuY = 0;
}
onClipEvent (enterFrame) {
dainyuY=dainyuY*0.8+(idoY-this._y)/3;
this._y += dainyuY;
}
※ボタンに書いたスクリプトはケース1と同じ。

それをふまえて質問なのですが
以前、野中さんに「Flash MX 2004でハマりがちな問題点」に
書いてある、変数に初期値が必要になった、というのを教えて頂いて、それから必ず作った変数には初期値を入れるようにしているのです。

ところが、<ケース1>で、初期値を設定せず
以下のようにしても、ちゃんと作動するのです。
(パブリッシュ設定はFlash8)
<ケース1>
●そのMC(インスタンス名はug_mc)に書いたスクリプト
onClipEvent (enterFrame) {
dainyuY= (idoY-this._y)/5;
this._y += dainyuY;
}

でも、<ケース2>の方で同様に初期値を設定しないで試すと
これはやはり、パブリッシュ設定Flash8で書き出すと
作動しません。初期値が必要なことがわかります。
<ケース2>
●MC(インスタンス名はug_mc)に書いたスクリプト
onClipEvent (enterFrame) {
dainyuY=dainyuY*0.8+(idoY-this._y)/3;
this._y += dainyuY;
}

そこで、質問です(2つあります。すみません)。

【質問1】
初期値がなくても動く場合と動かない場合の違いの理屈を、
どう理解すればいいのか、知りたいのです。
※基本的に、すべての場合で初期値を設定しておいて
損や間違いにはならないと思いますが。

【質問2】
<ケース1>の場合は、そもそも変数dainyuYを作らなくて
onClipEvent (enterFrame) {
this._y += (idoY-this._y)/5;
}
というふうにダイレクトに代入しても
ちゃんと同じように動作します。

しかし、<ケース2>の場合は、そういうわけにはいきません。
ちゃんとdainyuYに代入してから、this._y に入れていかないと
動作しませんでした。(↓これではダメ)
onClipEvent (enterFrame) {
this._y += dainyuY*0.8+(idoY-this._y)/3;
}

この違いも、同様にわかりません。どういう風に理解したら
いいのですか?

長々とすみません。
もしわかる方がいらっしゃったら教えてください。
宜しくお願いします。
ひろゆき
Åê¹ÆNo.36562
投稿日時: 2007-11-29 23:32
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 変数の代入と初期値の必要性について質問です
まず、「Flash MX 2004でハマりがちな問題点」を
もう1度お読みになることでしょう。

次に、問題となりそうな変数を trace して、
その値がどのように変化するのか、見てみることではないでしょうか?

また、質問は整理された方が良いように思います。
整理されていなければ、質問も捉えづらくなるでしょう。


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

kogua
Åê¹ÆNo.36563
投稿日時: 2007-11-29 23:49
半人前
居住地:
投稿: 51
使用環境:
WindowsXPsp3,FlashCS3
Re: 変数の代入と初期値の必要性について質問です
ひろゆきさん
早い回答ありがとうございます。

ですが、その返答は酷いんじゃないでしょうか?

質問は、整理して最後に
【質問1】という風にまとめています。

また、具体的にスクリプトも書いていますし
質問のポイントも具体的に書いているでしょう?
(そのせいで逆に長くなってしまってるのは
申し訳ないと思っています)

また、「Flash MX 2004でハマりがちな問題点」をよく読んで・・・
と言っていますが、それを読んで
わからない、と書いているでしょう?

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

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 変数の代入と初期値の必要性について質問です
引用:
ですが、その返答は酷いんじゃないでしょうか?

もう少し整理のしかたもあると思いますが。

F-site | Flash MX 2004でハマりがちな問題点」を読むと、
変数の値が与えられていない場合、変数が undefined になります。

このとき、Flash Player 6 以前では、その変数を 0 (数値)として扱ってくれたものが、
Flash Player 7 以降では、NaN (非数値)として扱われるので、
計算ができなくなることが書かれています。

ということは、数値であるかないか、というのが重要だということです。
であれば、動かない場合というのは、どこかで、数値でなくなっている可能性があるということですから、
それを trace して、その結果から、考察してみるということが必要ではないでしょうか?
それだけでも、回答者側の負担が減ると思いますが。

次に、「初期値」とおっしゃっていますが、
ここには、初期値になるべきものが2つあるので、
次のように、4パターンで検証する必要があるように思います。
# 一度に8パターンは多いので、まず[ケース1]だけ。

_root に配置したボタン(ムービークリップではない)のスクリプト
on (rollOver) {
	ug_mc.idoY = 150;
}
on (rollOut) {
	ug_mc.idoY = 100;
}



[ケース1-A]
onClipEvent (load) {
	idoY = 100;
	dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = (idoY - this._y)/5;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
100,0
100,0
100,0
150,10		(マウスオーバー)
150,8
150,6.4
	(中 略)
150,0.130000000000001
150,0.110000000000002
150,0.0899999999999977
	(以下略)
idoY, dainyuY ともに、常に数値として得られる。
問題なく ug_mc が動く。


[ケース1-B]
onClipEvent (load) {
	//idoY = 100;
	dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = (idoY - this._y)/5;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
undefined,NaN
undefined,NaN
undefined,NaN
150,10		(マウスオーバー)
150,8
150,6.4
	(中 略)
150,0.130000000000001
150,0.110000000000002
150,0.0899999999999977
	(以下略)
idoY, dainyuY ともに、マウスオーバー後は、数値として得られる。
問題なく ug_mc が動くように見えるが、
マウスオーバー後に、ボタンから idoY, dainyuY の値が送られているために、
動いているのであって、問題がないスクリプトとは言えない。
特に、注意したいのは、dainyuY が undefined ではなく、NaN になっている点。


[ケース1-C]
onClipEvent (load) {
	idoY = 0;
	//dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = (idoY - this._y)/5;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
100,0
100,0
100,0
150,10		(マウスオーバー)
150,8
150,6.4
	(中 略)
150,0.130000000000001
150,0.110000000000002
150,0.0899999999999977
	(以下略)
idoY, dainyuY ともに、常に数値として得られる。
ただし、ここでは、新たな疑問(*1)が生まれるはず。
dainyuY は、初期値を与えていないのに、なぜ、0 の値を持っているのか。
これは、初期値を与えなくとも、idoY, this._y の値から計算できるため。


[ケース1-D]
onClipEvent (load) {
	//idoY = 100;
	//dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = (idoY - this._y)/5;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
undefined,NaN
undefined,NaN
undefined,NaN
150,10		(マウスオーバー)
150,8
150,6.4
	(中 略)
150,0.130000000000001
150,0.110000000000002
150,0.0899999999999977
	(以下略)
idoY, dainyuY ともに、マウスオーバー後は、数値として得られる。
問題なく ug_mc が動くように見えるが、
マウスオーバー後に、ボタンから idoY, dainyuY の値が送られているために、
動いているのであって、問題がないスクリプトとは言えない。
特に、注意したいのは、dainyuY が undefined ではなく、NaN になっている点。
また、疑問*1 と同じ問題が潜んでいることに注意したい。


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

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

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 変数の代入と初期値の必要性について質問です
[ケース2-A]
onClipEvent (load) {
	idoY = 100;
	dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = dainyuY*0.8 + (idoY - this._y)/3;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
100,0
100,0
100,0
150,16.6666666666667		(マウスオーバー)
150,24.45
150,22.5266666666667
	(中 略)
150,0.27082636291856
150,0.183327757001517
150,0.0633288722678799
150,-0.0493369021856999
150,-0.122802855081893
150,-0.131575617398846
	(以下略)
idoY, dainyuY ともに、常に数値として得られる。
問題なく ug_mc が動く。


[ケース2-B]
onClipEvent (load) {
	//idoY = 100;
	dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = dainyuY*0.8 + (idoY - this._y)/3;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
undefined,NaN
undefined,NaN
undefined,NaN
150,NaN		(マウスオーバー)
150,NaN
150,NaN
	(中 略)
150,NaN
150,NaN
150,NaN
	(以下略)
idoY のみ、マウスオーバー後に、数値として得られる。
ところが、dainyuY が NaN となっているため、ug_mc が動かない。
特に、注意したいのは、dainyuY が undefined ではなく、NaN になっている点。
[ケース1]と異なるのは、マウスオーバー後に、idoY の値が得られても、
dainyuY が NaN のままであること。


[ケース2-C]
onClipEvent (load) {
	idoY = 0;
	//dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = dainyuY*0.8 + (idoY - this._y)/3;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
100,NaN
100,NaN
100,NaN
150,NaN		(マウスオーバー)
150,NaN
150,NaN
	(中 略)
150,NaN
150,NaN
150,NaN
	(以下略)
idoY のみ、常に数値として得られる。
ところが、dainyuY が NaN となっているため、ug_mc が動かない。
特に、注意したいのは、dainyuY が undefined ではなく、NaN になっている点。
[ケース1]と異なるのは、マウスオーバー後に、idoY の値が得られても、
dainyuY が NaN のままであること。


[ケース2-D]
onClipEvent (load) {
	//idoY = 100;
	//dainyuY = 0;
}
onClipEvent (enterFrame) {
	dainyuY = dainyuY*0.8 + (idoY - this._y)/3;
	trace([idoY, dainyuY]);
	this._y += dainyuY;
}
trace 結果
undefined,NaN
undefined,NaN
undefined,NaN
150,NaN		(マウスオーバー)
150,NaN
150,NaN
	(中 略)
150,NaN
150,NaN
150,NaN
	(以下略)
idoY のみ、マウスオーバー後に、数値として得られる。
ところが、dainyuY が NaN となっているため、ug_mc が動かない。
特に、注意したいのは、dainyuY が undefined ではなく、NaN になっている点。
[ケース1]と異なるのは、マウスオーバー後に、idoY の値が得られても、
dainyuY が NaN のままであること。


dainyuY が undefined ではなく、NaN になっていることについて。

[ケース1]
dainyuY = (idoY - this._y)/5;

ここで、idoY が undefined だと、
dainyuY = (undefined - this._y)/5;
となり、dainyuY を計算できなくなってしまう。なので、NaN。

[ケース2]
dainyuY = dainyuY*0.8 + (idoY - this._y)/3;

idoY が undefined である場合、dainyuY が NaN であることは前述の通りだが、

しかし、dainyuY が undefined である場合は、idoY が与えられても、
dainyuY = (undefined*8 + (100 - this._y)/3;
となり、dainyuY を計算できなくなってしまう。

dainyuY の値は、dainyuY それ自体の値を用いているので、
一度 NaN になってしまった dainyuY は、NaN から抜け出せない。



表面的に、動く動かないというだけではなく、
その内部的な処理についての疑問を解決するには、
どのような計算が行われているのか、trace して確認することでしょう。


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

kogua
Åê¹ÆNo.36566
投稿日時: 2007-11-30 1:21
半人前
居住地:
投稿: 51
使用環境:
WindowsXPsp3,FlashCS3
Re: 変数の代入と初期値の必要性について質問です
回答ありがとうございます。

非常によくわかりました。
trace()の重要性も感じました。

そして、
「しかし、dainyuY が undefined である場合は、idoY が与えられても、
dainyuY = (undefined*8 + (100 - this._y)/3;
となり、dainyuY を計算できなくなってしまう。」

ということから、【質問2】の答えもわかりました。
直接this._yに入れても意味がないですね。

すごく面倒な作業をしていただいて
申し訳ないです。今後もう少し勉強します。
感謝です。

最後に、もう一つだけ質問してもいいですか?

気になってたのは、今回例として書いたような方法のスクリプトで
onClipEvent (enterFrame) で、その中の何かに
数値を代入して終わった場合、trace()した出力画面でも
わかるように、すごい桁の数値が延々と代入し続けられてるじゃないですか?これって、やはり問題ですか?

ずっと表示している間、アニメーションは動いてなくても
裏では数値が代入し続けられてる、ってことですよね?

たとえそれが「0」であっても
延々と0を入れ続けてる。

こうなるスクリプトは避けた方がいいんでしょうか?
それとも、このぐらいなら、問題ないような仕様に
なってるんでしょうか?
ひろゆき
Åê¹ÆNo.36567
投稿日時: 2007-11-30 1:37
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 変数の代入と初期値の必要性について質問です
引用:
onClipEvent (enterFrame) で、その中の何かに
数値を代入して終わった場合、trace()した出力画面でも
わかるように、すごい桁の数値が延々と代入し続けられてるじゃないですか?これって、やはり問題ですか?

すごい桁の数値が出力されることに関しての疑問ですか?
それとも、延々と続くことに関しても疑問ですか?

後者だとすると、
onClipEvent(enterFrame) というものがそういうものだからですね。

Flash ActionScript Helper: システムイベント(内部イベント)

ある一定の数値以下になれば、移動することを止めさせることはできます。

指定座標に減速しながら近づくMC。

計算そのもの止めさせるのであれば、
onEnterFrame を用いれば、止めることはできます。

Flash ActionScript Helper: ムービークリップのイベントハンドラ
目的地に近づく (1)
目的地に近づく (3)

しかし、今回のように、外部から指定位置を変更するような場合には、
計算自体を止めるには、スクリプトも一工夫必要になると思います。


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

kogua
Åê¹ÆNo.37581
投稿日時: 2008-2-14 2:20
半人前
居住地:
投稿: 51
使用環境:
WindowsXPsp3,FlashCS3
Re: 変数の代入と初期値の必要性について質問です
レスが大変遅くなってすみません。

失礼いたしました。

値が近くなったら、目的の値にしてやる方法ですね。
参考になります。

また、イベントハンドラメソッドでonEnterFrameにしておいて
目的が達成したら、打ち消す、という方法は知っていたのですが
私は今までundefinedでやっていたので、野中さんのF-SiteのTipsと合わせてdeleteで消す方がいいんだということを知りました。
ありがとうございます。

やはり、その方がスマートですよね。

その処理はある程度知っていたのですが、
ただ、気になったのは
収束させるオブジェクトが多い場合などに
つい面倒で、計算させっぱなしにすることが多くて
裏で0.00012547...という風に桁数の多い近似値を
代入し続けているのが、どのくらい悪いことなのか
知りたかったのです。

プログラムの世界に疎いもので
そういったやり方が
かなりタブーなのか、それとも
そんなに問題ない程度なのか。

はっきりした答えはないことかもしれませんが
感覚的でもいいので、意見が聞ければなーと
思った次第です。

とにかく、どうもありがとうございました。


ひろゆき
Åê¹ÆNo.37582
投稿日時: 2008-2-14 2:31
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 変数の代入と初期値の必要性について質問です
引用:
koguaさんは書きました:
つい面倒で、計算させっぱなしにすることが多くて
裏で0.00012547...という風に桁数の多い近似値を
代入し続けているのが、どのくらい悪いことなのか
知りたかったのです。

計算しっぱなしにさせておくということは、
見た目上は、何ら変化がないように見えたとしても、
裏では計算し続けているわけですから、負荷がかかるはずです。

例えば、複数のものを動かすなどの場合には、その負荷が、
目に見えて、動作が遅くなるようなことが発生する恐れがあるように思います。

片付けが面倒で、そのゴミが少ないうちは問題がないように思えますが、
目につくような量になってくれば、
面倒などとは言ってられなくなるのではないでしょうか?


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

kogua
Åê¹ÆNo.37607
投稿日時: 2008-2-14 19:44
半人前
居住地:
投稿: 51
使用環境:
WindowsXPsp3,FlashCS3
Re: 変数の代入と初期値の必要性について質問です
やっぱりそうですよね。

ありがとうございました。

参考になりました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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