- ベストアンサー
x1 = x2; x2 = this._x;
FlashのActionScript勉強中のものです。これまでプログラミングの経験などはないものです。 よろしくお願いします。 Flashでマウスで対象のMCボールを投げるというtipsの中で下記のように書かれています。 「 投げたときのスピードや方向は何を求めれば計算できるかといえば、ボールを離した時の位置と、その直前の位置がわかりさえすれば求めることができます。 簡単にするために横方向、つまりx方向だけを考えることにします。ボールを離した時の位置(仮にx2とします。)、その直前の位置(仮にx1とします)がわかれば、x方向のスピードはx2-x1で求めることができます。 ボールを離した時のx2の位置はそのままボールの現在位置ですので、すぐわかりますが、 その直前の位置はどうやればわかるでしょうか? 結論から言うと直前の位置x1に前回計算したx2の位置を代入してやります。そうすると、常にx1はx2の直前の値が入ることになります。スクリプトで書くとこうなります。 x1 = x2; x2 = this._x; speed = (x2-x1); この3行の式をこの順番で延々計算を繰り返していると考えると、x2には現在の位置、x1には前回計算したときの現在位置つまり直前の位置が入っていることになります。そして、x方向のスピードspeedは常にx2とx1との差として求められています。 」 とあるのですが、なぜ x1 が直前の数値となるのかが上手く理解出来ません。 仮に _xが 1fpsで_x=5 2fpsで_x=10 3fpsで_x=20 4fpsで_x=40 5fps(現地点)で_x=55 だったとして、x1もx2も55という事なのでは??と思ってしまいます。 なぜ、x1に直前の値(例では4fpsでの_x=40)がx1に入ることになるのでしょうか? ご教授いただきたく思います。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#2です。 説明の数値が変になっています。 > なぜそうなるかを1フレームずつ考えます。 ~ ~ > あとは繰り返しです。 の間を訂正させてください。 ----訂正↓-------------------------------- なぜそうなるかを1フレームずつ考えます。 1フレームで_x=5 … x1 = ? , x2=5 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 は何も定義されていません。 したがって,x1 も未定義 undefined になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 5 となります。 2フレームで_x=10 … x1 = 5 , x2=10 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 の値は前のフレームで代入された値 5 になっています。 したがって,x1 = 5 になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 10 となります。 3フレームで_x=20 … x1 = 10 , x2=20 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 の値は前のフレームで代入された値 10 になっています。 したがって,x1 = 10 になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 20 となります。 あとは繰り返しです。 ------------------------------------------- すみません。 以上,訂正でした。
その他の回答 (2)
#1の方の書かれていることで良いと思います。 例で説明します。 まず訂正で, > 1fpsで_x=5 > 2fpsで_x=10 … … と書かれていますが, fps はフレームレートの単位で frame per second (○ フレーム毎秒)のことです。 フレームレートは変化させないので,単にフレームという意味だとします。 1フレームで_x=5 2フレームで_x=10 3フレームで_x=20 4フレームで_x=40 5フレーム(現地点)で_x=55 物体が上のような座標を通過したとして, 1フレームごとに x1 = x2; x2 = this._x; speed = (x2-x1); が実行されたとすると, x1 と x2 には次のような値が入ります。 1フレームで_x=5 … x1 = ? , x2=5 2フレームで_x=10 … x1 = 5 , x2=10 3フレームで_x=20 … x1 = 10 , x2=20 4フレームで_x=40 … x1 = 20 , x2=40 5フレーム(現地点)で_x=55 … x1 = 40 , x2=55 なぜそうなるかを1フレームずつ考えます。 1フレームで_x=5 … x1 = ? , x2=5 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 は何も定義されていません。 したがって,x1 も未定義 undefined になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 5 となります。 2フレームで_x=10 … x1 = 5 , x2=10 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 の値は 10 になっています。 したがって,x1 = 10 になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 10 となります。 3フレームで_x=20 … x1 = 10 , x2=20 x1 = x2; で x1 には x2 が代入されますが, この時点で x2 の値は 20 になっています。 したがって,x1 = 20 になります。 x2 = this._x; で x2 には,現在のx座標の値が入るので, x2 = 20 となります。 あとは繰り返しです。 プログラムは普通上から実行されます。 もしかかれているプログラムが, x2 = this._x; x1 = x2; speed = (x2-x1); であれば, ご質問で書かれているように,x1 と x2 は常に等しくなります。 1フレームで_x=5 … x1 = 5 , x2=5 2フレームで_x=10 … x1 = 10 , x2=10 3フレームで_x=20 … x1 = 20 , x2=20 4フレームで_x=40 … x1 = 40 , x2=40 5フレーム(現地点)で_x=55 … x1 = 55 , x2=55 x2 = this._x; x1 = x2; ではなく, x1 = x2; x2 = this._x; なので,x1 と x2 の値は常に1フレーム分の差が開きます。
- tux_the_penguin
- ベストアンサー率42% (69/163)
シンプルに考えてみましょう 数学でA=2と言うときには 「A と 2 は等しい」 と読みますね ところがプログラミングでは 「A は 2 になる」と読みます。 (「Aに2を代入する」と書いてある本も多いと思います。同じ意味です) …なので一行めの x1=x2; は「x1の値はx2が今持っているものになる」で、二行めの x2=this._x; は「x2の値は現時点でのxの位置になる」です。そして3行めで「speedの値はx2からx1を引いたものになる」わけです。 今、5フレーム目だとしてxの位置が55だったとしても、まだ処理をしてないので、x2には4フレーム目で導き出したxの位置の値が入っているわけです。そしてこの状態で一行めの処理を始めます。 こんな説明でなにかわかることがあればいいのですが。
お礼
sassakunさん、tux_the_penguinさん、ご回答ありがとうございます。 1fps(_x =?) x1(未) = x2(未); x2(未) = this._x;(未) speed = (x2 - x1); (未)-(未) == (未) 2fps(_x =5) x1(未) = x2(未); x2(5) = this._x;(5) speed = (x2 - x1); (5)-(未) == (5) 3fps(_x =10) x1(5) = x2(5); x2(10) = this._x;(10) speed = (x2 - x1); (10)-(5) == (5) 4fps(_x =15) x1(10) = x2(10); x2(15) = this._x;(15) speed = (x2 - x1); (15)-(10) == (5) 5fps(_x =20) x1(15) = x2(15); x2(20) = this._x;(20) speed = (x2 - x1); (20)-(15) == (5) という感じで書き出しして一つ一つ書き出して順に確認してみて、理解出来た気がします。変数で代入する時は右から左へ計算が流れるようなかたちとなるところなどがポイントのような感じがしました。 大変参考になりました。 ご回答ありがとうございました。