我有一个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)
}
}
答案 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)