获取SKSpriteNode

时间:2016-06-07 19:51:41

标签: ios swift sprite-kit

我有一个SKSpriteNode(称之为gem),它使用SKAction序列在屏幕上移动。当它与我的玩家精灵发生碰撞时,我想获得宝石的确切位置。

到目前为止我所知道的是什么都不起作用。我尝试在didBeginContact中使用firstBody.node?.position但是出于某种原因,这给了我宝石首次加载时的位置,而不是碰撞发生的位置。我也试过使用我的玩家的位置,因为宝石和玩家在碰撞时非常接近, - 结果还可以,但不像我想的那么准确。

我不确定代码是否会有所帮助,但在这里,以防万一...

动画宝石

let moveGem = SKAction.moveByX(-distance - 25, y: 0.0, duration: NSTimeInterval(speedOfGem * distance))
let removeGem = SKAction.removeFromParent()
moveAndRemove = SKAction.sequence([moveGem, removeGem])

尝试获得职位

func didBeginContact(contact: SKPhysicsContact) {
   let firstBody = contact.bodyA
   let secondBody = contact.bodyB

   if firstBody.categoryBitMask == PhysicsCategory.gem && secondBody.categoryBitMask == PhysicsCategory.player 
   {
      print(firstBody.node!.position)
   }
}

1 个答案:

答案 0 :(得分:2)

好的,这不是真的

  

[...]这给了我宝石首次加载时的位置,而不是碰撞发生的位置。

然后发生了什么?

节点的位置与其父节点相关。

所以如果你有一个SKScene并且每个节点都是它的直接子节点那么就没有问题了。

但是,如果您有多个级别的节点(例如scene> nodeA> nodeB),则需要将节点的坐标从其父节点转换为场景。

那我怎么能得到这个位置?

在SpriteKit中,这可以非常轻松地完成

guard let scene = node.scene else { fatalError("Wait  this node is not inside a scene!?") }
let position = node.convertPoint(node.position, toNode: scene)
print(position)