我正处于完成我的第一个可用 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;
}
}
当我像这样使用它时,球(麦克风)有点到达 Racket (plosina)并开始以另一种方式移动,在 Racket 的中间。 我的编程老师设法通过添加 .frame.size.height 而不是我以前使用过的 .frame 来解决其中一个桨(_b 一个)的这个问题,但是当我为另一个桨做同样的事情时没用我不知道那是怎么回事。
此外,它还会产生另一个问题,有时会出现球被 Racket 卡住的情况 - 所以我正在寻找整个对象的定义,而不仅仅是一侧?
我希望你能帮上忙。
最佳答案
我可以在这里看到三个潜在的问题。
第一个是你要等到球与 Racket 重叠才算触碰。听起来你真的想在球接触 Racket 时开始向另一个方向移动,而不是在球与 Racket 相交时。 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;
}
}
第二个潜在问题与球的速度有关。没有看到所有的代码,我不知道这是否是一个问题。如果球一次可以移动超过一个像素,它很容易重叠——甚至穿过—— Racket 而不被击中检测。您可以添加很多逻辑更改来解决这个问题,但最简单的解决方案可能是确保球一次移动不超过一个像素。
最后,如果您想对两个桨都使用 hack,请在游戏的另一侧反转比较符号。
关于objective-c - iOS Pong 开发,碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858131/