2

我有两个图像:大理石和障碍物。我想确保大理石不能翻过障碍物。如果弹珠碰到障碍物的边缘,则应将其设置为先前的坐标,这样看起来弹珠就停在障碍物的边缘。那是什么代码?我的代码:

CGRect obstacleBounceFrame = [_obstacleBounce frame];
CGRect intersectionWithObstacleBounce = CGRectIntersection(marbleFrame, obstacleBounceFrame);
if(CGRectIsNull(intersectionWithObstacleBounce)) {
    // Not touching yet - null intersection
} else {


}

有人可以给我这样做的理论吗?

谢谢马蒂斯

在此处输入图像描述

4

2 回答 2

2

您可以像这样保存弹珠的先前位置:

CGRect previousPosition = marbleFrame.frame;

在下一次迭代中,如果大理石撞到墙壁,则将其框架设置为。

其他解决方案是检查从哪一侧发生碰撞(顶部、左侧、右侧或向下),这很容易比较交叉点矩形(例如,如果交叉点矩形顶部大于右侧,则表示从顶部碰撞或向下)并在进入之前将大理石框架放在它旁边。

或者,你可以在 iOS7 中使用很棒的 SpriteKit,它真的很容易做到,但仅适用于 iOS7 设备。

于 2013-06-25T15:01:40.590 回答
1

首先,碰撞检测不是一件容易正常工作的事情,因此您可能需要查看一些外部库,例如 ObjectiveChipmunk 或 Box2d。

话虽如此,您可以在 else 语句中添加一些内容。可以这么说,一般的方法是“将对象移回”,具体取决于他所击中的边界。如果他与左边界相撞,则将他向右移动 x 个单位,如果他撞到顶部边界,则将他向下移动 x 个单位,等等。

另一种可能的解决方案是跟踪对象的“有效”位置,一旦它与墙壁发生碰撞,就将对象返回到之前的位置。

于 2013-06-25T15:07:03.530 回答