【发布时间】:2015-08-20 16:48:34
【问题描述】:
我在场景工具包中创建了一个 3D 场景,该场景包括一个被隐形墙包围的区域,我想将物理对象抛入该区域,以使它们一旦进入就无法逃脱。我打算通过以下方式实现这一点:
- 创建墙对象
- 创建一个“固化器”,可以整齐地嵌入墙内
- 将每个对象的
isInScene变量设置为 false - 将它们对准固化器的模糊方向
- 每次更新时,如果一个对象正在接触固化器但没有接触墙壁,我会更改其碰撞掩码以包括墙壁并将
isInScene设置为 true,这样我就不必再次检查它了。李>
这通常看起来效果很好,但每隔一段时间(很遗憾地经常)我就会突然出现 EXC_BAD_ACCESS 错误。有问题的方法似乎是contactTestBetweenBody,我用它来确定在关闭正常碰撞检测时物体何时接触墙壁或固化器。这对于防止物体简单地从墙壁物体的外部反弹是必要的。
这里有一小段代码来说明。顺便说一句,“对象”是一个结构,它保留了对节点的引用以及其他有用的细节:
if let solid = solidifier?.physicsBody, let wall = walls?.physicsBody {
let world = scene.physicsWorld
for i in 0 ..< objects.count {
if objects[i].isInScene == false, let body = objects[i].node.physicsBody {
let contactSolidifier = world.contactTestBetweenBody(body, andBody: solid, options: nil)
if contactSolidifier != nil {
let contactWall = world.contactTestBetweenBody(body, andBody: wall, options: nil)
if contactWall == nil {
objects[i].isInScene = true
body.collisionBitMask = CollisionMask.allSolids.rawValue
}
}
}
}
}
【问题讨论】:
-
我遇到了同样的问题:使用
contactTest时出现 EXC_BAD_ISSUE :s