ElapsedGameTime
2007年07月28日
【講座005】スプライトの速度
Updateメソッドに書き加えられたのは、次の1行でした。
UpdateSprite(gameTime);
これは、UpdateSpriteメソッドを実行する、ということを意味していますが、構造化プログラミング(って懐かしい言葉だな)では、できるかぎり大雑把にプログラムの構造を理解できるように、こうやって、詳細処理は別に書く、ということを行います。
ですから、実処理はUpdateSpriteに書かれているわけですね。そういうわけで、UpdateSpriteメソッドを見ていくわけですが、今回はスプライトを動かしている式を見てみます。たった、1行の解説ですが、XNAのゲームプログラミングでは重要なポイントになるはずです。
UpdateSpriteメソッドの最初の1行は次のようなものでした。
spritePosition += spriteSpeed *
(float)gameTime.ElapsedGameTime.TotalSeconds;
ここで、C#の文法を勉強しましょう。
x += a;
と書かれている場合には、xにはaが加えられます。
y -= b;
と書かれている場合には、yからはbが引かれます。これと同義の文は、
y += -b;
ということになります。たとえば、
x += 10;
であれば、xには10が加えられるし、
y += -3.7;
であれば、yには-3.7が加えられる、すなわち、yから3.7が引かれます。ということは、先の文を解釈すると、
「spritePositionに、spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSecondsが加えられる」となるわけです。
spritePositionには初期値(0, 0)が設定されていて、Drawメソッドで、この位置にスプライトが描画されることを意味していました。このspritePositionに下線の部分の計算結果が足され、スプライトの場所が変わっていくことを意味しています。
ところで、spriteSpeedは(50.0, 50.0)を入れてありました。その先の(float)gameTime.ElapsedGameTime.TotalSecondsってなんでしょうか?それを理解しなければなりません。そこで、このElapsedGameTimeにカーソルを合わせて、[F1]でHelpを呼んでみます。
gameTime.ElapsedGameTime は最後にUpdateが実行されたときから、これまでに経過した時間を意味しているようです。で、ついでに言うと、TimeSpan構造体なので、そのプロパティに、TotalSecondsってのがありまして、秒の単位で値を返してくれるわけですから、「gameTime.ElapsedGameTime.TotalSecondsは、最後のUpdateからどのくらい経過したかを表している(秒単位)」となります。
また、TotalSecondsはdouble型で定義されています。speedSpriteのVector2クラスのメンバーは、float型なので、型がそろっていないと掛け算がうまくいかないことがあります。このため、(float)というのを付けて、speedSpriteと掛け算を行っているわけですね。
これは何を意味しているのでしょうか?実は、speedSpriteっていうスプライトの動くスピードを表している変数は、「秒速」を意味していた、ということになります。ですから、前回のUpdateから、今回のUpdateまでの経過時間を速度に掛け算することで、スプライトを動かす量(ピクセル数)を求めた、ということになります。
ゲームプログラミングにおいては、キャラクタをどのくらいのスピードで動かすのか、というのは非常に重要な問題です。昔、BASICでゲームを作ったことがある方ならば、
for t = 0 to 100: Next t
などという構文を挟んで、キャラクタの動かすスピードを調整したことがあるのではないでしょうか。こういった無駄なループを回して、時間調節を行うテクニックがあったのですが、コンピュータの性能が格段に上がった現在、このような方法を使うことは無意味です。そこで、算数の時間に習った
(距離)=(時間)×(速度)
を使って、動かすスピードを求めていく手法が現在では一般的です。
UpdateSpriteメソッドは、もう少し続きます。このまま、単に足すだけですと、ウインドウの外にスプライトが出てしまいますから、ウィンドウの枠が壁となって跳ね返るアルゴリズムが必要になってくるわけですね。それを次回に見ていきましょう。
UpdateSprite(gameTime);
これは、UpdateSpriteメソッドを実行する、ということを意味していますが、構造化プログラミング(って懐かしい言葉だな)では、できるかぎり大雑把にプログラムの構造を理解できるように、こうやって、詳細処理は別に書く、ということを行います。
ですから、実処理はUpdateSpriteに書かれているわけですね。そういうわけで、UpdateSpriteメソッドを見ていくわけですが、今回はスプライトを動かしている式を見てみます。たった、1行の解説ですが、XNAのゲームプログラミングでは重要なポイントになるはずです。
UpdateSpriteメソッドの最初の1行は次のようなものでした。
spritePosition += spriteSpeed *
(float)gameTime.ElapsedGameTime.TotalSeconds;
ここで、C#の文法を勉強しましょう。
x += a;
と書かれている場合には、xにはaが加えられます。
y -= b;
と書かれている場合には、yからはbが引かれます。これと同義の文は、
y += -b;
ということになります。たとえば、
x += 10;
であれば、xには10が加えられるし、
y += -3.7;
であれば、yには-3.7が加えられる、すなわち、yから3.7が引かれます。ということは、先の文を解釈すると、
「spritePositionに、spriteSpeed * (float)gameTime.ElapsedGameTime.TotalSecondsが加えられる」となるわけです。
spritePositionには初期値(0, 0)が設定されていて、Drawメソッドで、この位置にスプライトが描画されることを意味していました。このspritePositionに下線の部分の計算結果が足され、スプライトの場所が変わっていくことを意味しています。
ところで、spriteSpeedは(50.0, 50.0)を入れてありました。その先の(float)gameTime.ElapsedGameTime.TotalSecondsってなんでしょうか?それを理解しなければなりません。そこで、このElapsedGameTimeにカーソルを合わせて、[F1]でHelpを呼んでみます。
gameTime.ElapsedGameTime は最後にUpdateが実行されたときから、これまでに経過した時間を意味しているようです。で、ついでに言うと、TimeSpan構造体なので、そのプロパティに、TotalSecondsってのがありまして、秒の単位で値を返してくれるわけですから、「gameTime.ElapsedGameTime.TotalSecondsは、最後のUpdateからどのくらい経過したかを表している(秒単位)」となります。
また、TotalSecondsはdouble型で定義されています。speedSpriteのVector2クラスのメンバーは、float型なので、型がそろっていないと掛け算がうまくいかないことがあります。このため、(float)というのを付けて、speedSpriteと掛け算を行っているわけですね。
これは何を意味しているのでしょうか?実は、speedSpriteっていうスプライトの動くスピードを表している変数は、「秒速」を意味していた、ということになります。ですから、前回のUpdateから、今回のUpdateまでの経過時間を速度に掛け算することで、スプライトを動かす量(ピクセル数)を求めた、ということになります。
ゲームプログラミングにおいては、キャラクタをどのくらいのスピードで動かすのか、というのは非常に重要な問題です。昔、BASICでゲームを作ったことがある方ならば、
for t = 0 to 100: Next t
などという構文を挟んで、キャラクタの動かすスピードを調整したことがあるのではないでしょうか。こういった無駄なループを回して、時間調節を行うテクニックがあったのですが、コンピュータの性能が格段に上がった現在、このような方法を使うことは無意味です。そこで、算数の時間に習った
(距離)=(時間)×(速度)
を使って、動かすスピードを求めていく手法が現在では一般的です。
UpdateSpriteメソッドは、もう少し続きます。このまま、単に足すだけですと、ウインドウの外にスプライトが出てしまいますから、ウィンドウの枠が壁となって跳ね返るアルゴリズムが必要になってくるわけですね。それを次回に見ていきましょう。