我试图使球反弹出顶部和底部'墙'我的用户界面时,创建一个二维乒乓克隆。
这是我的游戏。

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会更深入一些。也有与之相关的。

08-06 06:19