gpt4 book ai didi

c# - 2D 碰撞检测表现有趣

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:53 25 4
gpt4 key购买 nike

我已经启动并运行了一个简单的 BreakOut 游戏(垂直,沿底部划桨),但碰撞检测有点不对劲。我正在使用 Rectangle.Intersect 来初步检查球是否完全与给定的砖 block 相交,然后它是否还有 4 个 Intersect 调用来检查球是垂直碰撞(砖 block 的侧面,左 + 右)还是水平碰撞(砖的顶部+底部)。在某些情况下,当球在 2 block 水平相邻砖 block 的交叉点附近以锐角与砖 block 碰撞时,它会将两 block 砖 block 移开并继续向上。我认为这是碰撞的两倍。我强行退出了 foreach 循环,该循环在找到矩形时检查矩形是否相交,但这并没有解决问题。

这是在游戏类的主要 Update() 函数中:

        foreach (Brick brick in bricks)
{
if (brick.CheckCollision(ball))
{
break;
}
}

这是 Brick.CheckCollision() 函数:

    public bool CheckCollision(Ball ball)
{
if (alive && ball.Bounds.Intersects(location))
{
alive=false;
ball.Deflection(this);
return true;
}
return false;
}

这是 Ball.Deflection() 函数。在这里,我使用没有宽度/高度的矩形来标记砖 block 的侧面。不确定这是否是正确的方法:

    public void Deflection(Brick brick)
{
//For vertical collision (top or bottom of brick) invert Y motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, brick.Location.Right - brick.Location.Left, 0)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Bottom, brick.Location.Right - brick.Location.Left, 0)))
{
motion.Y *= -1;
return;
}
//For horizontal collision (left or right side of brick) invert X motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Right, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)))
{
motion.X *= -1;
return;
}
}

我假设我犯了一个明显的逻辑错误,但如果可以改进一般方法,我洗耳恭听!

最佳答案

通过与 itsme86 在评论中的讨论,我已经解决了我的问题。我添加了日志记录(由 bmm6o 推荐)并确认这是由于球在一帧中在 block 内移动太远而在下一帧仍然部分位于相邻 block 内而导致的碰撞加倍。我决定保持逻辑简单,当我反转它的方向时,只需将球移回它相交的 block 的边缘。这是在中间没有 Draw() 函数的情况下完成的,以免产生口吃效果。我很难观察到任何跳跃或卡顿,所以如果有的话,它是不可见的。

关于c# - 2D 碰撞检测表现有趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309043/

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