我遇到需要为单个纹理创建两个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何时命中子节点。我可以看到它正在发生的调试模式但代表不会打印,如果我为父物理实体指定collisionBitMask
,contactTestBitMask
它可以工作但我的目标是将它们分成两个
*我尝试使用关节和两种不同的纹理,表现如此糟糕
这些是kitty
的值 physicsBody!.categoryBitMask = category_kitty
physicsBody!.contactTestBitMask = category_wagon | category_border | category_train
physicsBody!.collisionBitMask = category_border | category_wagon | category_train
答案 0 :(得分:1)
根据Apple:https://developer.apple.com/documentation/spritekit/skphysicsbody/1519736-init
“儿童的特性,如质量或摩擦力,是 忽略。只使用子体的形状。“
这意味着当您通过以下方式创建新的physicsBody时,不会保留您在2个单独的物理实体上设置的bitMasks:
physicsBody=SKPhysicsBody(bodies: [leftBigBox,rightSmallBox])
(正如KnightOfdragon所说,它只使用数组中物理实体的形状来创建新物理实体的形状。然后你必须设置新物理实体的所有属性 - 无使用的物体的属性使用)。
所以你可能最好用某种联合加入2个物理体(如果你不知道怎么做,问一个新问题)或者使用其他方法确定你的对象的哪个部分被小猫击中。