防止SKPhysicsBody向上推SKSpriteNode

时间:2016-03-28 02:42:57

标签: swift sprite-kit sprite skspritenode skphysicsbody

我目前有两个相互叠加的SKSpriteNodes(白色部分是一个,棕色圆圈部分是另一个):

enter image description here

白色部分位于圆形棕色精灵节点顶部的1/3处。在图片中,棕色圆形部分已经应用了SKPhysicsBody,如周围的浅蓝色轮廓所示。当我在顶部椭圆形白色部分周围添加一个SKPhysicsBody时,它将它向上推,而不是在我想要的位置。

enter image description here

我怎样才能让一个SKPhysics身体覆盖两个精灵体,但没有物理身体相互推动,使白色部分向上移动?我希望白色部分保持在第一张图像中的位置。

感谢任何人的帮助!

这是我用于SKPhysicsBody的代码:

//  create, position, scale & add the round body
roundBody = SKSpriteNode( imageNamed: "roundBody" )
roundBody.position     = CGPoint( x: 207, y: 70 )
roundBody.zPosition    = 1
roundBody.xScale       = 0.3
roundBody.yScale       = 0.3
//  add sprite node to view
self.addChild( roundBody )

// create, position, scale & add the head
theHead!.position    = CGPoint( x: 207, y: roundBody.frame.maxY / 1.15 )
theHead!.zPosition   = 2
theHead!.xScale      = 0.3
theHead!.yScale      = 0.3

//  setting up a SKPhysicsBody for the round body
roundBody.physicsBody = SKPhysicsBody( circleOfRadius: roundBody.size.width / 4 )
roundBody.physicsBody!.dynamic = true
roundBody.physicsBody!.affectedByGravity  = true
roundBody.physicsBody!.allowsRotation = false
roundBody.physicsBody!.pinned = false

//  setting up a SKPhysicsBody for the head
theHead!.physicsBody = SKPhysicsBody(circleOfRadius: theHead!.size.width / 2 )
theHead!.physicsBody!.dynamic = true
theHead!.physicsBody!.affectedByGravity = false
theHead!.physicsBody!.allowsRotation = false
theHead!.physicsBody!.pinned  = false

3 个答案:

答案 0 :(得分:1)

如果您不希望它移动,请将其.dynamic属性设置为false。然后其他物体可能会或可能不会反弹/碰撞(取决于它们的collisionBitMask),但它不会因为那些碰撞而移动。

答案 1 :(得分:1)

我能够弄清楚,如果你使用SKPhysicsJointPin,它会完成我需要的确切事情! (这基本上是将一个精灵头钉在它身上并分享一个物理体)

let joinTogether = SKPhysicsJointPin.jointWithBodyA(
                    roundBody.physicsBody!,
                    bodyB:theHead!.physicsBody!,
                    anchor: GPointMake(CGRectGetMidX(roundBody.frame), 
                    CGRectGetMinY(theHead!.frame)))

scene!.physicsWorld.addJoint(joint)

希望这可以帮助将来的某个人!

答案 2 :(得分:1)

您自己的答案是正确的,也是更好的解决方案,但只是进一步解释。

物体碰撞的原因是默认情况下物理体的碰撞位掩码被设置为所有类别,这意味着它将与所有物体碰撞。在您的代码中,您没有打电话

roundBody.physicsBody?.collisionBitMask = ...

这就是它使用默认值的原因。

要改变它,你可以给你的身体和头部一个不同的collisionBitMask。 我确定你处理碰撞时迟早会处理这个问题

另外作为一个小提示,除非你有物理机构,否则最好不要强行拆开它,即使你知道它们存在。所以你应该更换你的!用?只要有可能。