我试图使球反弹出顶部和底部'墙'我的用户界面时,创建一个二维乒乓克隆。
这是我的游戏。
public void CheckBallPosition()
{
if (ball.Position.Y == 0 || ball.Position.Y >= graphics.PreferredBackBufferHeight)
ball.Move(true);
else
ball.Move(false);
if (ball.Position.X < 0 || ball.Position.X >= graphics.PreferredBackBufferWidth)
ball.Reset();
}
现在我在我的球里用这个。
public void Move(bool IsCollidingWithWall)
{
if (IsCollidingWithWall)
{
Vector2 normal = new Vector2(0, 1);
Direction = Vector2.Reflect(Direction,normal);
this.Position += Direction;
Console.WriteLine("WALL COLLISION");
}
else
this.Position += Direction;
}
它可以工作,但我使用的是手动输入的法线,我想知道如何计算屏幕顶部和底部的法线?
最佳答案
好吧,我就是这样处理的
public void CheckBallPositionAndMove()
{
if (ball.Position.Y <= 0 || ball.Position.Y >= graphics.PreferredBackBufferHeight)
ball.HandleWallCollision();
ball.Move();
if (ball.Position.X < 0 || ball.Position.X >= graphics.PreferredBackBufferWidth)
ball.Reset();
}
//In Ball.cs:
private void HandleWallCollision(Vector2 normal)
{
Direction.Y *= -1; //Reflection about either normal is the same as multiplying y-vector by -1
}
private void Move()
{
this.Position += Direction;
}
但是,请注意,使用此“离散”碰撞检测,您要等到球移动过屏幕的顶部/底部之后才能检测到碰撞;发生在“帧之间”的碰撞可能会明显关闭,特别是在球移动很快的情况下。如果您使用这种碰撞检测方法来检测与桨叶的碰撞,则这是一个特别的问题,因为如果球移动得足够快,则球有可能通过桨叶向右移动!
解决这个问题的办法是使用所谓的Continuous Collision Detection。ccd通常比离散碰撞检测要复杂得多;幸运的是,pong足够简单,这样做ccd只会稍微复杂一些。然而,你仍然需要扎实的高中代数知识来解方程。
如果您还感兴趣,可以在this lecture中对ccd有一个很好的解释,this GameDev article会更深入一些。也有与之相关的。