SpriteKit Physicsbody和.allContactedBodies()的时间

时间:2015-02-26 21:19:30

标签: ios swift sprite-kit

我有一个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
}

1 个答案:

答案 0 :(得分:1)

根据我的理解,当你触摸某个地方时:你创建一个区域(bigNode),从中移除每个节点(目标)。

allContactedBodies将返回此正文与联系的SKPhysicsBody对象数组。但是,这显然是在update方法中运行。这在处理时间上非常昂贵。

那就是说,你可能想尝试一下。但你也可以尝试坚持使用didBeginContact方法。