Swift中的SKSpriteNodes发生了碰撞,即使没有设置碰撞位掩码

3
scorenode = SKSpriteNode()
    scorenode.size = CGSize(width: self.frame.width * 0.2, height: 1)
    scorenode.physicsBody = SKPhysicsBody(rectangleOf: scorenode.size)
    scorenode.color = .red
    scorenode.physicsBody?.affectedByGravity = false
    scorenode.physicsBody?.isDynamic = false

    scorenode.physicsBody?.categoryBitMask = PhysicsCategory.score
    scorenode.physicsBody?.contactTestBitMask = PhysicsCategory.circle
    scorenode.physicsBody?.collisionBitMask = 0


    obstaclePair = SKNode()
    obstaclePair.name = "obstaclePair"

    rightObstacle = SKSpriteNode(imageNamed:"square")
    rightObstacle.size = CGSize(width: self.frame.width * 0.8, height: self.frame.height / 10)

    rightObstacle.color = oColor
    rightObstacle.colorBlendFactor = 1.0
    rightObstacle.physicsBody = SKPhysicsBody(rectangleOf: rightObstacle.size)

    rightObstacle.physicsBody?.categoryBitMask = PhysicsCategory.obstacle
    rightObstacle.physicsBody?.collisionBitMask = PhysicsCategory.circle
    rightObstacle.physicsBody?.contactTestBitMask = PhysicsCategory.circle
    rightObstacle.physicsBody?.isDynamic = false

    leftObstacle = SKSpriteNode(imageNamed:"square")
    leftObstacle.size = CGSize(width: self.frame.width * 0.8 , height: self.frame.height / 10)
    leftObstacle.physicsBody = SKPhysicsBody(rectangleOf: leftObstacle.size)

    leftObstacle.color = oColor
    leftObstacle.colorBlendFactor = 1.0
    leftObstacle.physicsBody?.categoryBitMask = PhysicsCategory.obstacle
    leftObstacle.physicsBody?.collisionBitMask = PhysicsCategory.circle
    leftObstacle.physicsBody?.contactTestBitMask = PhysicsCategory.circle
    leftObstacle.physicsBody?.isDynamic = false
    circle = SKSpriteNode(imageNamed: "Circle")


circle.size = CGSize(width: 50, height: 50)
    circle.position = CGPoint(x: self.frame.width / 2, y: self .frame.height / 4)
    circle.color = .blue
    circle.colorBlendFactor = 1.0
    circle.physicsBody = SKPhysicsBody(circleOfRadius: circle.frame.height / 2)
    circle.physicsBody?.categoryBitMask = PhysicsCategory.circle
    circle.physicsBody?.collisionBitMask = PhysicsCategory.obstacle
    circle.physicsBody?.contactTestBitMask = PhysicsCategory.obstacle | PhysicsCategory.score
    circle.physicsBody?.affectedByGravity = false
    circle.physicsBody?.isDynamic = true
    circle.zPosition = 10

这是我的项目中的物理部分,我有一个圆形SKSpritenode和一个得分节点SKSpritenode。它们不应该发生碰撞,我也没有为它们都设置一个碰撞位掩码,但它们仍然发生碰撞。我做错了什么?


我建议您发布“PhysicsCategory”的定义。 - 0x141E
我将与@0x141E一起前往,类别编号可能有误,障碍物可能是3,这不是一个有效的类别编号。 - Knight0fDragon
4
默认情况下,所有物体都会相互碰撞。碰撞位掩码默认拥有所有比特设置。因此,当两个物体相交时,物理引擎会对该物体的碰撞位掩码和其他物体的类别位掩码执行逻辑“与”运算。如果结果为非零值,则会发生碰撞。所以像其他人所说的那样,检查类别并记住碰撞位掩码的默认值是0xffffffff。在这里阅读更多:https://dev59.com/h10Z5IYBdhLWcg3wvSd2#31111039 - Whirlwind
请查看此链接 - http://stackoverflow.com/documentation/sprite-kit/6261/sknode-collision/24162/simple-sprite-kit-project-showing-collisions-contacts-touch-events,这是一个示例项目,展示如何通过帮助函数checkPhysics()来管理碰撞,该函数将分析您的物理设置并告诉您什么会发生碰撞或接触。 - Steve Ives
这是倒过来的吗? - Knight0fDragon
显示剩余2条评论
2个回答

2

你拥有

 static let circle : UInt32 = 0x1 << 1
 static let obstacle : UInt32 = 0x1 << 1
 static let score : UInt32 = 0x1 << 1

你需要进行以下操作:
static let circle : UInt32 = 0x1 << 0
static let obstacle : UInt32 = 0x1 << 1
static let score : UInt32 = 0x1 << 2

是的,我很久以前就意识到了,但还是谢谢你的回答。 - Repardeimaj

0

如果您在得分节点上没有进行任何物理相关的操作,为什么不将其设置为LabelNode并将其中的物理元素删除呢?


1
分数节点可能是他用来触发得分的节点,而不是标签。 - Knight0fDragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接