XNA-更改矩形位置



在我的乒乓球比赛中,我有一个球和两个球拍。我希望当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位置时,球甚至不会出现在屏幕上。

当你将球重新发射到中心时,你是否重置了Position

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

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

我不确定如何处理碰撞和所有事情,但无论何时设置"位置",它都会设置矩形,你也可以尝试相反的方法,设置矩形,它会与位置同步。

我不知道你是如何封装球逻辑的,但下面是我可以尝试的方法。使用这样的类可以保证球的所有内部逻辑都在一个地方,这样就可以根据位置和边界预测生成的绘图矩形。不再使用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);
    // ...
}
}

记住还要通过经过的帧时间来调节球的速度。

相关内容

  • 没有找到相关文章

最新更新