2015-05-19 121 views
0

我有一个名为Player的SKNode的子类,它几乎包括这个:http://hub.ae/blog/2014/03/26/soft-body-physics-jellyusing-spritekit/转换为swift(有一些变化)。我允许用户用他的手指用下面的代码移动玩家节点:locationInNode返回错误的结果

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() 
} 

*作为一个说明,在“世界”变种你看到的只是另一个SKNode。 'player'是这个节点的孩子。

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

我该如何解决这个问题?我发现将场景的定位点设置为0.5可以解决此问题,但是,'player'节点的物理主体会变得混乱。

回答

0

我有同样的问题,但我不记得,如果它是我如何修复它。尝试改变这一点:

世界>自

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) 
} 
+0

这部分工作。当我点击播放器节点上方时,它会向错误的方向移动,但是当我点击它时,节点会正确移动。 下面是发生了什么的示例:http://gyazo.com/b968913c3ebd482dbc20bf54b869d071 我很感激帮助。 – Aaron

+0

您是否检查了触摸的坐标?他们是否正确? 必须尝试'moveBy'动作? – Darvydas

+0

经过一番调查,我认为也许问题是我的'节点中心'功能(这被称为将相机对准播放器)。我相信这正在改变正确的坐标(并且在没有运行该功能的情况下进行测试后,它似乎正在工作)。你知道解决这个问题的方法吗?功能在这里:http://pastebin.com/QRpQmLab(由于字符限制而粘贴) – Aaron