iOS Pong开发,碰撞检测

问题描述:

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

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

当我使用这样的球(MIC)排序到达桨(plosina),并开始在挡板的中间排序移动的其他方式。 我的编程老师通过添加.frame.size.height而不是刚刚使用过的.frame,但是当我为另一个桨做同样的事情时,设法解决了其中一个桨(_b一个)的问题它不起作用,我不知道那是怎么回事。

此外,它创造了另一个问题,有时候会出现一种情况,即球被挡在桨中 - 所以我正在寻找整个对象的定义,而不仅仅是一边?

我希望你能帮忙。

+0

顶部是_a桨,底部是_b桨?如果是这样的话,也许可以尝试将_b.frame.size.height替换为_a.frame.size.height,如果这很有意义 – 2012-01-13 22:34:45

+0

没有_a位于游戏领域的底部,而_b位于顶部。 – 2012-01-13 22:39:11

+0

仍然尝试颠倒它,所以我认为尼克洛克伍德建议使用'-'而不是'+' – 2012-01-13 22:44:40

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

如果您需要垂直镜像其他桨的逻辑。现在您正在使用的顶部和底部拨片相同的逻辑,但对于底部桨,你可能需要像下面而不是

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

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

+0

好plosina_b是一个以某种方式工作..如果我做你说什么它仍然会工作,但如果我将它应用到plosina_a它只是不会工作..我试着扭转>符号并减去,但是如果我在plosina_a碰撞检测中使用减法,它只会简单地通过。 – 2012-01-13 22:49:05

+0

而且它仍然没有解决问题,因为球在挡板内卡住了。 – 2012-01-13 22:52:12

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

首先,您在等待球重叠桨之前将其计为触摸。这听起来像是你真的希望当球接触到桨时开始朝另一个方向移动球,而不是当它与球相交时。 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; 
    } 
} 

第二个潜在的问题与球的速度有关。没有看到所有的代码,我不知道这是否是一个问题。如果球可以一次移动超过一个像素,那么它可能很容易重叠 - 甚至通过 - 没有命中检测的桨。有很多逻辑变化可以用来处理这个问题,但最简单的解决方案可能是确保一次只能移动一个像素以上的球。

最后,如果您想对两个桨使用hack,请颠倒游戏另一端的比较标志。

+0

好吧,我不知道它是否可以一次移动多个像素,我通过CGPointMake给出球的速度,我给它X和Y轴的速度。 无论哪种方式,当我使用CGRectInset它检测重叠之前哪个CGRectIntersectsRect没有球? – 2012-01-13 23:00:21

+0

我颠倒了比较标志,它使_b桨正常工作(或我认为它应该如何工作),但_a桨看起来仍然像球重叠 – 2012-01-13 23:01:21

+0

看看移动球的方程 - 很可能像x = x + dx,类似于y。如果abs(dx)可以大于1,则可以一次将其移动多个像素。 – Mike 2012-01-13 23:05:40