locationInNode返回错误的结果

时间:2015-05-19 17:45:49

标签: ios swift sprite-kit

我有一个名为Player的SKNode子类,其中几乎包括:http://hub.ae/blog/2014/03/26/soft-body-physics-jellyusing-spritekit/转换为swift(稍作修改)。我已经允许用户用他的手指移动播放器节点,并使用以下代码:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    player.runAction(SKAction.moveTo(touch.locationInNode(world), duration: 1))
}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    player.runAction(SKAction.moveTo(touch.locationInNode(world), duration: 1))
}

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) {
    player.removeAllActions()
}

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    player.removeAllActions()
}

*作为一个说明,&#39;世界&#39; var你看到的只是另一个SKNode。 &#39;播放&#39;是这个节点的孩子。

这看起来应该有效,但节点会向非常奇怪的方向移动。这是它的外观示例: http://gyazo.com/87b0d09101bbbfd3ac0f2a3cdbf42e4c

我该如何解决这个问题?我发现将场景的锚点设置为0.5修复了这个问题,然而然后是“玩家”的物理主体。节点搞砸了。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,但我不记得是否是我如何解决它。尝试更改此内容:

  

世界&gt;自

player.runAction(SKAction.moveTo(touch.locationInNode(world), duration: 1))

要:

player.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 1))

如果我错了,请告诉我:)

修改

将锚点设置为(0.5,0.5)并将这两种方法写入节点的中心位置。

override func didSimulatePhysics() {
    camera.position = CGPointMake(player.position.x, player.position.y);
    centerOnNode(camera)
}

func centerOnNode(node: SKNode){
    var positionInScene : CGPoint = convertPoint(node.position, fromNode: node.parent)
    world.position = CGPointMake(world.position.x - positionInScene.x, world.position.y - positionInScene.y)
}