*=

2007年07月29日

【講座006】壁の跳ね返り

UpdateSpriteメソッドの前回の続きをみていきましょう。

int MaxX = graphics.GraphicsDevice.Viewport.Width
  - myTexture.Width;

int MinX = 0;
int MaxY = graphics.GraphicsDevice.Viewport.Height
  - myTexture.Height;

int MinY = 0;


図で理解した方がいいので、下図をみてください。

WindowSize







スプライトを表示する際には、スプライトの左上の座標を使うのですが、その最小値、最大値を、それぞれ(MinX, MinY)と(MaxX, MaxY)で表しています。

左上が(0,0)であることは、もういいとして、それを(MinX, MinY)に入れているのはわかると思います。右下の最大値の方をどうやって求めているか、ということが重要です。

ウィンドウの幅は、graphics.GraphicsDevice.Viewport.Widthで得られ、
ウィンドウの高さは、graphics.GraphicsDevice.Viewport.Heightで得られます。
そこから、スプライトの幅・高さ(myTexture.Width・myTexture.Height)をそれぞれ引いたところを(MaxX, MaxY)としているわけですね。

さて、続いて、if〜else if構文が2つ続きます。これはC#の書き方ですが、他の言語でも似たような書き方をよくします。プログラムでは非常に一般的なので、ちょっと勉強しましょう。

if (条件1)
{
  処理1
}
else if (条件2)
{
  処理2
}

となっているのですが、「条件1が満たされていれば(真だったら、とか、Trueだったら、という言い方をすることもあります。)、処理1を行います。もし、条件1が満たされていなかったら(偽だったら、とか、Falseだったら、といったりします。)、条件2を判断し、条件2が満たされていたら、処理2を行います。」という構文です。
この構文のポイントは、「処理1と処理2が同時に実行されることはなく、かつ、どちらも実行されないこともある」ということです。

さて、実際には何が書かれているのでしょうか。1つ目のif〜else if構文を見てみましょう。

if (spritePosition.X > MaxX)
{
  spriteSpeed.X *= -1;
  spritePosition.X = MaxX;
}
else if (spritePosition.X < MinX)
{
  spriteSpeed.X *= -1;
  spritePosition.X = MinX;
}

条件1は「spritePosition.X > MaxX」ですね。これは、「スプライトが右の壁をこえてしまったか?」を意味します。前回の講座でやりましたが、すでにspritePositionには、動く量が加えられていることに注意してください。
もし、スプライトが右の壁を越えてしまっていたら、スプライトのスピードは左右反転(この場合は右→左になるわけですが)しろ、となっています。これは、

spriteSpeed.X *= -1;

がそれを意味していますが、前回の+=と、同様に

x *= a;

と書かれていると、x に a を掛ける、ということを意味していますから、spriteSpeed.X に -1 が掛けられるということになります。より、具体的には、spriteSpeed.X が右の壁を越えてしまうときには、50.0が入っていたはずですから、spriteSpeed.X は -50.0 が入れられたのと同じことになります。

そして、右の壁を越えてしまってはいけませんから、

  spritePosition.X = MaxX;

として、スプライトの位置を壁にぶつかった状態にしてしまいます。

続いて、条件1が満たされていなかったときには、条件2を判断します。条件2は「spritePosition.X < MinX」です。これは「左の壁を越えてしまったか?」を判断しています。これが満たされていた場合には、またスピードを左右逆転(今回の場合は、左→右への反転)して、スプライトの位置を左の壁にぶつかった状態にしています。

いかがでしょうか?同様のことがY軸方向でも行われます。

if (spritePosition.Y > MaxY)
{
  spriteSpeed.Y *= -1;
  spritePosition.Y = MaxY;
}
else if (spritePosition.Y < MinY)
{
  spriteSpeed.Y *= -1;
  spritePosition.Y = MinY;
}

こちらもX軸と同様ですから、同じように考えてみてください。ウィンドウの枠を壁に見立てて、スプライトが跳ね返る、という処理を行っていることがわかります。

これで、このサンプルの解説は終わりになりますが、ちょっと時間をもらって、その後、いくつか改造をしてみたいと思います。


dmatsu2005 at 07:31コメント(0)トラックバック(0) 
livedoor プロフィール

アロハ

痩せないと死ぬよっていう宣告を受けてしまったので、ダイエットに目覚めたプログラマー(約95kg)

広告

レンタルサーバーなら使えるねっと


Google AdSense
Google検索
訪問者数
  • 今日:
  • 昨日:
  • 累計:

オススメの書籍