在我的乒乓球比赛中,我有一个球和两个球拍。我希望当ball.ballRect.x < 5
是true
时,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);
// ...
}
}
记住还要通过经过的帧时间来调节球的速度。