尝试为突破游戏定义桨上的位置以创建更好的球碰撞物理
trying to define location on paddle for breakout game to create better ball collision physics
所以我想弄清楚如何将球拍的矩形分开,这样我就可以在球拍上定义可以击球的不同点。我想做的是,如果球被击中球拍的左侧或右侧,那么球的方向将略有变化,而不是每次都遵循完全相同的路径。
这是我的桨 class(我开始编写我在 isboxcolliding 方法中需要的代码,但卡住了并感到困惑):
class Ball
{
Texture2D texture;
Vector2 position;
Vector2 speed;
Rectangle bounds;
Rectangle screenBounds;
Random rnd = new Random();
bool collisionWithBrick; // Prevents rapid brick removal.
public Ball(Texture2D texture, Rectangle screenbounds) // Constructor
{
this.texture = texture;
this.screenBounds = screenbounds;
}
public int Width
{
get { return texture.Width; }
}
public int Height
{
get { return texture.Height; }
}
public Rectangle Bounds
{
get
{
bounds = new Rectangle((int)position.X, (int)position.Y,
Width, Height);
return bounds;
}
}
public void SetStartBallPosition(Rectangle paddle)
{
position.X = paddle.X + (paddle.Width - Width) / 2;
position.Y = paddle.Y = paddle.Y - Height;
bounds = Bounds;
if (rnd.Next(0, 2) < 1)
speed = new Vector2(-200.0f, 200.0f); // Move ball left.
else
speed = new Vector2(200.0f, -200.0f); // Move Ball Right.
}
internal void Deflection(MultiBallBrick multiBallBrick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
internal void Deflection(ReinforcedBrick reinforcedBrick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.Silver);
}
// Check if our ball collides with the right paddle.
public void IsBoxColliding(Rectangle paddle)
{
if (bounds.Intersects(paddle))
{
int center = paddle.Center.X - bounds.Center.X;
if (center > )
{
speed.Y *= -1;
speed.X = speed.X * 1.5f;
}
}
/*if (paddle.Intersects(bounds)) // Bounds = our ball
{
position.Y = paddle.Y - Height;
speed.Y *= - 1; // Reverse the direction of the ball.
}*/
}
public void Update(GameTime gameTime)
{
collisionWithBrick = false;
position += speed * (float)gameTime.ElapsedGameTime.TotalSeconds;
// Check to see if the ball goes of the screen.
if (position.X + Width > screenBounds.Width) // Right side
{
speed.X *= -1;
position.X = screenBounds.Width - Width;
}
if (position.X < 0) // Left side
{
speed.X *= -1;
position.X = 0;
}
if (position.Y < 0) // Top
{
speed.Y *= -1;
position.Y = 0;
}
}
public bool OffBottom()
{
if (position.Y > screenBounds.Height)
return true;
return false;
}
public void Deflection(Brick brick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
}
}
如有任何帮助,我们将不胜感激!
您不一定需要拆分碰撞矩形。您可以通过以下信息来检查碰撞是在左侧还是右侧。
- 碰撞发生时的碰撞点或球的中心位置,姑且称之为
Vector2 collisionPoint
- 桨的中心位置,我们称之为
Vector2 paddleCentrePosition
只有在球拍不旋转的情况下才有效。
Vector2 difference = collisionPoint - paddleCentrePosition;
if(difference.x > 0) {
/*Right side of the paddle*/
}
else if(difference.x < 0) {
/*Left side of the paddle*/
}
else{
/*The exact same position*/
}
所以我想弄清楚如何将球拍的矩形分开,这样我就可以在球拍上定义可以击球的不同点。我想做的是,如果球被击中球拍的左侧或右侧,那么球的方向将略有变化,而不是每次都遵循完全相同的路径。
这是我的桨 class(我开始编写我在 isboxcolliding 方法中需要的代码,但卡住了并感到困惑):
class Ball
{
Texture2D texture;
Vector2 position;
Vector2 speed;
Rectangle bounds;
Rectangle screenBounds;
Random rnd = new Random();
bool collisionWithBrick; // Prevents rapid brick removal.
public Ball(Texture2D texture, Rectangle screenbounds) // Constructor
{
this.texture = texture;
this.screenBounds = screenbounds;
}
public int Width
{
get { return texture.Width; }
}
public int Height
{
get { return texture.Height; }
}
public Rectangle Bounds
{
get
{
bounds = new Rectangle((int)position.X, (int)position.Y,
Width, Height);
return bounds;
}
}
public void SetStartBallPosition(Rectangle paddle)
{
position.X = paddle.X + (paddle.Width - Width) / 2;
position.Y = paddle.Y = paddle.Y - Height;
bounds = Bounds;
if (rnd.Next(0, 2) < 1)
speed = new Vector2(-200.0f, 200.0f); // Move ball left.
else
speed = new Vector2(200.0f, -200.0f); // Move Ball Right.
}
internal void Deflection(MultiBallBrick multiBallBrick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
internal void Deflection(ReinforcedBrick reinforcedBrick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, Color.Silver);
}
// Check if our ball collides with the right paddle.
public void IsBoxColliding(Rectangle paddle)
{
if (bounds.Intersects(paddle))
{
int center = paddle.Center.X - bounds.Center.X;
if (center > )
{
speed.Y *= -1;
speed.X = speed.X * 1.5f;
}
}
/*if (paddle.Intersects(bounds)) // Bounds = our ball
{
position.Y = paddle.Y - Height;
speed.Y *= - 1; // Reverse the direction of the ball.
}*/
}
public void Update(GameTime gameTime)
{
collisionWithBrick = false;
position += speed * (float)gameTime.ElapsedGameTime.TotalSeconds;
// Check to see if the ball goes of the screen.
if (position.X + Width > screenBounds.Width) // Right side
{
speed.X *= -1;
position.X = screenBounds.Width - Width;
}
if (position.X < 0) // Left side
{
speed.X *= -1;
position.X = 0;
}
if (position.Y < 0) // Top
{
speed.Y *= -1;
position.Y = 0;
}
}
public bool OffBottom()
{
if (position.Y > screenBounds.Height)
return true;
return false;
}
public void Deflection(Brick brick)
{
if (!collisionWithBrick)
{
speed.Y *= -1;
collisionWithBrick = true;
}
}
}
}
如有任何帮助,我们将不胜感激!
您不一定需要拆分碰撞矩形。您可以通过以下信息来检查碰撞是在左侧还是右侧。
- 碰撞发生时的碰撞点或球的中心位置,姑且称之为
Vector2 collisionPoint
- 桨的中心位置,我们称之为
Vector2 paddleCentrePosition
只有在球拍不旋转的情况下才有效。
Vector2 difference = collisionPoint - paddleCentrePosition;
if(difference.x > 0) {
/*Right side of the paddle*/
}
else if(difference.x < 0) {
/*Left side of the paddle*/
}
else{
/*The exact same position*/
}