【问题标题】:iOS Pong Development, Collision DetectioniOS Pong 开发,碰撞检测
【发布时间】:2012-01-14 07:03:02
【问题描述】:

我在完成我的第一个可用 iOS 应用程序的后期阶段。 我正在创建一个简单的 Pong 游戏,我正在使用 CGRectIntersectsRect 进行简单的碰撞检测,但我遇到了一个问题。

if(CGRectIntersectsRect(mic.frame,plosina_a.frame)) {
        if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) {
            RychlostMice.y = -RychlostMice.y;
        }
    }
    if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) {
        if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) {
            RychlostMice.y = -RychlostMice.y;
        }
    }

当我像这样使用它时,球(麦克风)会到达桨板(plosina)并开始在桨板中间以另一种方式移动。 我的编程老师设法通过添加 .frame.size.height 而不是我以前使用过的 .frame 来解决其中一个桨(_b 桨)的这个问题,但是当我对另一个桨做同样的事情时没用,不知道怎么回事。

此外,它还会产生另一个问题,有时球会卡在桨中 - 所以我正在寻找整个物体的定义,而不仅仅是一侧?

希望你能帮上忙。

【问题讨论】:

  • 顶部是 _a 桨,底部是 _b 桨?如果是这样,也许可以尝试扭转你对桨 _a 的 _b.frame.size.height 所做的事情,如果这有意义的话
  • 没有_a在游戏区域的底部,_b在顶部。
  • 仍然尝试反转它,因为我认为 Nick Lockwood 建议使用 - 而不是 +
  • 我不确定,但我认为如果我用 be 反转它不会改变任何东西,_b 仍然是一个运行良好的那个。

标签: objective-c ios collision-detection


【解决方案1】:

我可以在这里看到三个潜在的问题。

首先,您要等到球与球拍重叠后才算触球。听起来你真的想在球接触桨时开始球向另一个方向移动,而不是在它与桨相交时。 CGRectIntersectsRect 等到它们重叠后才返回 true。如果您通过调用 CGRectInset 使任一矩形变大一个像素,则一旦球到达该球拍,您的测试将返回真——到那时,将有一个像素与扩展矩形重叠。测试如下所示:

if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_a.frame)) {
    if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}
if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_b.frame)) {
    if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}

第二个潜在问题与球的速度有关。没有看到所有的代码,我不知道这是否是一个问题。如果球一次可以移动超过一个像素,它很容易与球拍重叠,甚至穿过球拍,而不会检测到击球。您可以添加许多逻辑更改来解决此问题,但最简单的解决方案可能是确保球一次移动不超过一个像素。

最后,如果您想对两个桨都使用 hack,请在游戏的另一端反转比较符号。

【讨论】:

  • 好吧,我不确定它是否可以一次移动超过一个像素,我通过 CGPointMake 给球一个速度,我给它一个 X 和 Y 轴的速度。无论哪种方式,当我使用 CGRectInset 时,它都会在重叠之前检测到球,而 CGRectIntersectsRect 没有?
  • 我颠倒了比较符号,它使 _b 桨正常工作(或我认为它应该如何工作),但 _a 桨看起来仍然像球重叠
  • 看看移动球的方程——它可能类似于 x = x + dx,对于 y 也类似。如果 abs(dx) 可以大于 1,则一次可以将其移动多个像素。
  • 我有一个球速度的 CGPoint。我给它一个 x 和 y 的浮点数 CGPoint BallVelocity = CGPointMake(BallVelocityX, BallVelocityY); 定义了浮点数的值,每个都大于 1,老实说我从来没有真正弄清楚如果它每次都移动那个数量的像素或其他东西到底意味着什么..(您在这里使用的是纯 n00b,抱歉),但我不明白这可能是什么等式找出它是否大于 1。
  • 你用什么代码来更新球的位置?您添加或减去的值是否大于 1?
【解决方案2】:

我猜你的乒乓球是垂直打的,所以一个桨在屏幕顶部,另一个在底部?

如果您需要垂直镜像另一个桨的逻辑。现在,您对顶部和底部桨使用相同的逻辑,但对于底部桨,您可能需要类似以下内容

if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) {
    if(mic.center.y > (plosina_b.center.y - plosina_b.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}

请注意我如何使用 > 符号并减去高度而不是添加高度。

【讨论】:

  • 好吧 plosina_b 是一个以某种方式起作用的..如果我按照你说的做它仍然可以工作,但如果我将它应用于 plosina_a 它就不会工作..我试着扭转 >符号和减法,但如果我在 plosina_a 碰撞检测中使用减法,它只会简单地通过。
  • 它仍然不能解决球有时会卡在桨内的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多