0

在我的乒乓球比赛中,我有一个球和两个球拍。我想要它,以便当ball.ballRect.x < 5is时truescore.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位置时,球甚至不会出现在屏幕上。

4

2 回答 2

1

Position当你将球重生到中心时,你有没有重置?

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

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

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

于 2013-07-30T15:58:58.587 回答
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);

    // ...
}
}

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

于 2013-07-30T21:21:27.843 回答