【问题标题】:SKPhysicsBody(bodies: collisionBitMask does not workSKPhysicsBody(身体:collisionBitMask 不起作用
【发布时间】:2017-06-13 08:41:00
【问题描述】:

我有需要为单个纹理创建两个 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) 没有检测到我的小猫何时击中子节点。我可以看到它正在发生的调试模式,但委托不会打印,如果我为父物理体指定 collisionBitMaskcontactTestBitMask 它可以工作,但我的目标是将它们分成两部分 * 我试过用关节和两种不同的纹理,性能太差了

这些是 kitty 的值

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

【问题讨论】:

    标签: swift sprite-kit sprite skphysicsbody


    【解决方案1】:

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

    “孩子的属性,例如质量或摩擦力,是 忽略。仅使用子实体的形状。”

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

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

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

    所以你最好要么用某种关节连接 2 个物理体(如果你不知道如何做到这一点,请提出一个新问题)或使用其他方法来确定你的对象的哪个部分有被小猫咬了。

    【讨论】:

    • 是的,加入多个实体只会加入路径,而不是属性
    • 我会制作小猫 2 个 SKNode,这样它就可以有 2 个 SKPhysicsBodies
    • 感谢您的回复...这清楚地表明,如果我们将精灵视为单个物理体,是否有一种简单的方法可以找到被击中的位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2014-09-20
    • 2010-10-23
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多