iOS Pong开发,碰撞检测

时间:2012-01-13 22:30:18

标签: objective-c ios collision-detection

我处于完成第一个可用的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 one)的问题,但是当我为另一个拨片执行相同的操作时不起作用我不知道那是怎么回事。

另外它会产生另一个问题,有时会出现球被球塞入的情况 - 所以我正在寻找整个物体的定义,而不仅仅是一方?

我希望你能提供帮助。

2 个答案:

答案 0 :(得分:2)

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

首先,你要等到球与桨重叠,然后再将其计算为触摸。当球接触球拍时,听起来你真的想让球开始向另一个方向移动,而不是当它与球相交时。 CGRectIntersectsRect在返回true之前一直等到它们重叠。如果你通过调用CGRectInset使一个矩形变大一个像素,你的测试将在球到达那个球拍时返回true - 到那时,将有一个像素与展开矩形重叠。测试看起来像这样:

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

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

最后,如果您想对两个拨片使用黑客攻击,请反转游戏另一侧的比较符号。

答案 1 :(得分:0)

我猜你的乒乓球是垂直播放的,所以一个拨片位于屏幕顶部而另一个位于底部?

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

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

注意我是如何使用&gt;签名并减去高度而不是添加它。

相关问题