SKPhysicsBody(机构:collisionBitMask不起作用

时间:2017-06-13 08:41:01

标签: swift sprite-kit sprite skphysicsbody

我遇到需要为单个纹理创建两个SKPhysicsBody的情况,因为碰撞响应需要不同

 let leftBigBox = SKPhysicsBody(rectangleOf :CGSize(width: 490, height: 90) , center:bCenterPoint )

    leftBigBox.contactTestBitMask = category_kitty
    leftBigBox.categoryBitMask = category_train
    leftBigBox.collisionBitMask = category_kitty | category_track

    let rightSmallBox = SKPhysicsBody(rectangleOf :CGSize(width: 100, height: 45) , center:sCenterPoint )
   rightSmallBox.categoryBitMask = category_wagon
   rightSmallBox.collisionBitMask = category_kitty | category_track
   rightSmallBox.contactTestBitMask = category_kitty

    physicsBody=SKPhysicsBody(bodies: [leftBigBox,rightSmallBox])

但是didBegin(_ contact: SKPhysicsContact)没有检测到我的kitty何时命中子节点。我可以看到它正在发生的调试模式但代表不会打印,如果我为父物理实体指定collisionBitMaskcontactTestBitMask它可以工作但我的目标是将它们分成两个 *我尝试使用关节和两种不同的纹理,表现如此糟糕

这些是kitty

的值
 physicsBody!.categoryBitMask = category_kitty
 physicsBody!.contactTestBitMask = category_wagon | category_border | category_train
 physicsBody!.collisionBitMask =  category_border | category_wagon | category_train

1 个答案:

答案 0 :(得分:1)

根据Apple:https://developer.apple.com/documentation/spritekit/skphysicsbody/1519736-init

  

“儿童的特性,如质量或摩擦力,是   忽略。只使用子体的形状。“

这意味着当您通过以下方式创建新的physicsBody时,不会保留您在2个单独的物理实体上设置的bitMasks:

physicsBody=SKPhysicsBody(bodies: [leftBigBox,rightSmallBox])

(正如KnightOfdragon所说,它只使用数组中物理实体的形状来创建新物理实体的形状。然后你必须设置新物理实体的所有属性 - 无使用的物体的属性使用)。

所以你可能最好用某种联合加入2个物理体(如果你不知道怎么做,问一个新问题)或者使用其他方法确定你的对象的哪个部分被小猫击中。