5

ブレークアウト ゲームのメイン テクスチャとして 1 つのスプライト シート イメージを使用しています。画像はこれです:

breakout_sprite_sheet

を使用して同じテクスチャから 2 つの要素を作成しているため、私のコードは少し混乱してPointVectorますRectangle

Texture2D sheet;

Point paddleSize = new Point(112, 24);
Point paddleSheetPosition = new Point(0, 240);
Vector2 paddleViewportPosition;
Rectangle paddleRectangle;

Point ballSize = new Point(24, 24);
Point ballSheetPosition = new Point(160, 240);
Vector2 ballViewportPosition;
Rectangle ballRectangle;
Vector2 ballVelocity;

私の初期化も少し混乱しますが、期待どおりに動作します:

paddleViewportPosition = new Vector2((GraphicsDevice.Viewport.Bounds.Width - paddleSize.X) / 2, GraphicsDevice.Viewport.Bounds.Height - (paddleSize.Y * 2));
paddleRectangle = new Rectangle(paddleSheetPosition.X, paddleSheetPosition.Y, paddleSize.X, paddleSize.Y);

Random random = new Random();
ballViewportPosition = new Vector2(random.Next(GraphicsDevice.Viewport.Bounds.Width), random.Next(GraphicsDevice.Viewport.Bounds.Top, GraphicsDevice.Viewport.Bounds.Height / 2));
ballRectangle = new Rectangle(ballSheetPosition.X, ballSheetPosition.Y, ballSize.X, ballSize.Y);
ballVelocity = new Vector2(3f, 3f);

そして図面:

spriteBatch.Draw(sheet, paddleViewportPosition, paddleRectangle, Color.White);
spriteBatch.Draw(sheet, ballViewportPosition, ballRectangle, Color.White);

問題は、次のコードを使用して衝突を適切に検出できないことです。

if(ballRectangle.Intersects(paddleRectangle))
{
    ballVelocity.Y = -ballVelocity.Y;
}

私は何を間違っていますか?

4

1 に答える 1

4

sourceRectanglesスプライト シート テクスチャに基づいて衝突をテストしています。これらの長方形 ( paddleRectangle、 ) は、テクスチャ座標ballRectangleで定義されます。つまり、スプライトがシート上にある場所です。これらの長方形の衝突をテストしても意味がありません。

衝突にはスクリーン座標を使用する必要があります。つまり、スクリーン位置で定義されたさまざまな長方形が必要です。

Rectangle paddleViewportRectangle = new Rectangle(paddleViewportPosition.X, 
                                              paddleViewportPosition.Y, 
                                              paddleSize.X, 
                                              paddleSize.Y);

Rectangle ballViewportRectangle = new Rectangle(ballViewportPosition.X,
                                                ballViewportPosition.Y,
                                                ballSize.X,
                                                ballSize.Y);

if(ballViewportRectangle.Intersects(paddleViewportRectangle))
{
    ballVelocity.Y = -ballVelocity.Y;
}
于 2012-12-17T23:20:28.380 に答える