Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 获取一个SKSpriteNode的位置_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 获取一个SKSpriteNode的位置

Ios 获取一个SKSpriteNode的位置,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有一个SKSpriteNode(称之为gem),它使用SKAction序列在屏幕上移动。我想知道宝石与我的玩家精灵碰撞时的确切位置 到目前为止,我所知道的是什么不起作用。我曾尝试在didBeginContact中使用firstBody.node?.position,但出于某种原因,它给出了gem首次加载时的位置,而不是碰撞发生的位置。我也尝试过使用我的播放器的位置,因为当gem和player碰撞时,它们非常接近,-结果是可以的,但没有我想要的那么准确 我不确定代码是否有用,但在这里,以防万一

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

到目前为止,我所知道的是什么不起作用。我曾尝试在didBeginContact中使用firstBody.node?.position,但出于某种原因,它给出了gem首次加载时的位置,而不是碰撞发生的位置。我也尝试过使用我的播放器的位置,因为当gem和player碰撞时,它们非常接近,-结果是可以的,但没有我想要的那么准确

我不确定代码是否有用,但在这里,以防万一

为宝石制作动画

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)
   }
}
好吧,这不是真的 […]这给了我gem首次加载的位置,而不是碰撞发生的位置

那发生了什么事? 节点的位置表示为相对于其父节点的位置

因此,如果您有一个
SKScene
,并且每个节点都是它的直接子节点,那么就没有问题了

但是,如果有多个级别的节点(如
场景
节点a
>
节点b
),则需要将节点的坐标从其父节点转换为场景

那我怎么才能得到这个职位呢? 在SpriteKit中,这可以非常容易地完成


guard let scene=node.scene else{fatalError("在您的
didBeginContact
中等待,您的
contact
变量有一个名为的属性。您可以尝试
contact.contactPoint
。这将为您提供碰撞的位置。这对您有用吗?谢谢@CharlesCaldwell-contactPoint非常接近我想要的,并且在某个时候肯定会有用。您很好ht-gem是SKNode BARGER的子代,SKNode BARGER是SKNode world的子代。所以,让firstBodyInWorld=BARGER.convertPoint(firstBody.node!.position,toNode:world.scene!)给我我想要的。谢谢!记住,当gem和玩家接触时,你不能保证firstBody=gem和secondBody=player,这两种情况都可能发生。