我有一个spritekit场景,上面有各种对象。我希望能够围绕用户的触摸事件在一个大圆圈中删除这些对象。在我的touchesBegan函数中,我有以下代码创建一个物理实体并检查它是否与任何对象联系:
var bigNode = SKShapeNode(circleOfRadius: 100)
bigNode.position = touchLocation!
var bigCircle = SKPhysicsBody(circleOfRadius: 100, center: touchLocation!)
bigNode.physicsBody = bigCircle
bigNode.strokeColor = SKColor.yellowColor()
bigNode.zPosition = CGFloat.max
bigNode.physicsBody?.dynamic = false
bigNode.physicsBody?.categoryBitMask = ColliderType.Beam.rawValue
bigNode.physicsBody?.contactTestBitMask = ColliderType.Target.rawValue
bigNode.physicsBody?.collisionBitMask = ColliderType.Target.rawValue
bigNode.name = "temp"
gameLayer.addChild(bigNode)
if let targets = bigNode.physicsBody?.allContactedBodies(){
for target in targets{
removeTarget(target as? SKPhysicsBody, location: target.position)
}
}
我只画圆圈,所以我可以明确地看到模拟器中应该联系的内容。调用bigNode.physicsBody?.allContactedBodies()
总是返回一个空数组,即使我可以清楚地看到圆中有对象。
spritekit是否需要勾选update
或类似的内容才能填充该数组?我在这里做错了什么?
有关详细信息,请参阅目标的位掩码
target.physicsBody?.categoryBitMask = ColliderType.Target.rawValue
target.physicsBody?.contactTestBitMask = ColliderType.Target.rawValue | ColliderType.Wall.rawValue | ColliderType.Beam.rawValue
target.physicsBody?.collisionBitMask = ColliderType.Wall.rawValue | ColliderType.Target.rawValue | ColliderType.Beam.rawValue
这是我的对手枚举:
enum ColliderType: UInt32 {
case Target = 1
case Beam = 2
case Wall = 4
}
答案 0 :(得分:1)
根据我的理解,当你触摸某个地方时:你创建一个区域(bigNode),从中移除每个节点(目标)。
allContactedBodies
将返回此正文与联系的SKPhysicsBody对象数组。但是,这显然是在update
方法中运行。这在处理时间上非常昂贵。
那就是说,你可能想尝试一下。但你也可以尝试坚持使用didBeginContact
方法。