【发布时间】:2017-05-21 21:26:25
【问题描述】:
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的定义 -
那是因为 isDynamic 属性。
-
我要使用@0x141E,类别编号可能是错误的,障碍物可能是3,这不是有效的类别编号
-
默认情况下,一切都与一切发生冲突。默认情况下,碰撞位掩码已设置所有位。因此,当两个对象相交时,物理引擎会在此身体的碰撞位掩码和其他身体的 categoryBitMask 之间执行逻辑与。如果结果为非零值,则会发生冲突。所以就像其他人说的那样,检查类别并记住碰撞位掩码的默认值为 0xffffffff。在这里阅读更多:stackoverflow.com/a/31111039
-
看这里 - stackoverflow.com/documentation/sprite-kit/6261/… 的示例项目,该项目展示了如何使用辅助函数 checkPhysics() 管理碰撞,该函数将分析您的物理设置并告诉您什么会发生碰撞或接触什么。
标签: swift sprite-kit collision skspritenode