XNA - 更改矩形位置

时间:2013-07-30 09:45:08

标签: c# xna move collision pong

在我的乒乓球比赛中,我有一个球和两个桨。我想要它,以便在ball.ballRect.x < 5true时,score.greenScore增量如下:score.greenScore++;

这很有效,但我也想要让球回到屏幕的中心。

所以在Game1.cs中我这样做了:

public void ScoreAdder()
    {
        if (ball.ballRect.X < 5)
        {
            score.blueScore++;
            ball.ballRect = new Rectangle((int)400, (int)250, ball.ballTexture.Width, ball.ballTexture.Height);
        }

    }

它会回到中心并添加分数,但现在它不会听到碰撞。

在我的Ball.cs中我只绘制矩形,如:

spriteBatch.Draw(ballTexture, ballRect, Color.White);

因为当我使用Vector2位置时,球甚至不会出现在屏幕上。

2 个答案:

答案 0 :(得分:1)

当你将球重新打到中心时,你重置了Position吗?

您可以利用此属性,Position指向Rectangle,反之亦然。

public Vector2 BallPosition
{
    get
    {
        return ballPosition;
    }
    set
    {
        ballRectangle.X = value.X;
        ballRectangle.Y = value.Y;
        ballPosition = value;
    }
}
private Vector2 ballPosition

我不确定你如何处理碰撞和一切,但每当你设置位置它会设置矩形,你也可以尝试相反,你设置矩形,它将与位置同步。

答案 1 :(得分:1)

我不知道你是如何封装球逻辑的,但是我可以尝试这样做。使用这样的类可以保证球的所有内部逻辑都在一个位置,这样就可以根据位置和边界预测得到的绘图矩形。没有更多的消失球使用vector2!

public class Ball
{
private Vector2 _position;
private Vector2 _velocity;
private Point _bounds;

public Vector2 Position { get { return _position; } set { _position = value; } }
public Vector2 Velocity { get { return _velocity; } set { _velocity = value; } }
public int LeftSide { get { return (int)_position.X - (_bounds.X / 2); } }
public int RightSide { get { return (int)_position.X + (_bounds.X / 2); } }
public Rectangle DrawDestination
{
    get
    {
        return new Rectangle((int)_position.X, (int)_position.Y, _bounds.X, _bounds.Y);
    }
}

public Ball(Texture2D ballTexture)
{
    _position = Vector2.Zero;
    _velocity = Vector2.Zero;
    _bounds = new Pointer(ballTexture.Width, ballTexture.Height);
}

public void MoveToCenter()
{
    _position.X = 400.0f;
    _position.Y = 250.0f;
}

public void Update(GameTime gameTime)
{
    _position += _velocity;
}
}

然后在您的更新/绘制代码中:

class Game
{
void Update(GameTime gameTime)
{
    // ...

    ball.Update(gameTime);

    if(ball.LeftSide < LEFT_BOUNDS)
    {
        score.blueScore++;      
        ball.MoveToCenter();
    }
    if(Ball.RightSide > RIGHT_BOUNDS)
    {
        score.greenScore++;
        ball.MoveToCenter();
    }

    // ...
}

void Draw(GameTime gameTime)
{
    // ...

    _spriteBatch.Draw(ballTexture, ball.DrawDestination, Color.White);

    // ...
}
}

记住还要按经过的帧时间调整球的速度。