在我的乒乓球比赛中,我有一个球和两个桨。我想要它,以便在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
位置时,球甚至不会出现在屏幕上。
答案 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);
// ...
}
}
记住还要按经过的帧时间调整球的速度。