gpt4 book ai didi

c# - XNA - Pong Clone - 撞墙时反射球?

转载 作者:太空狗 更新时间:2023-10-30 00:57:38 25 4
gpt4 key购买 nike

在创建 2D Pong 克隆时,我试图让球从我的 UI 的顶部和底部“墙”反弹。这是我的 Game.cs

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();
}

目前我正在我的 Ball.cs 中使用它

    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;
}

但是请注意,使用这种“离散的”碰撞检测,您要等到球移过屏幕的顶部/底部后才检测碰撞; 在“帧之间”发生的碰撞可能会明显偏离,特别是当球快速移动时。如果您使用这种碰撞检测方法来检测,这尤其是一个问题与 Racket 碰撞,因为如果球移动得足够快,球有可能直接穿过 Racket !

这个问题的解决方案是使用所谓的Continuous Collision Detection。 . CCD 通常比离散碰撞检测复杂得多;幸运的是,pong 很简单,做 CCD 只会稍微复杂一点。但是,您仍然需要扎实地掌握高中代​​数知识才能求解方程。

如果你还有兴趣,在this lecture中对CCD有很好的解释。 , 和 this GameDev article更深入一点。还有many questions与它有关。

关于c# - XNA - Pong Clone - 撞墙时反射球?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4671201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com