2014-05-08 35 views
2

我有两个spriteNodes英雄和敌人,都用矩形physicsBody应用。 在更新中,当英雄到达某个点时,例如hero.position.y < = 300我希望敌人旋转并向下移动时面对英雄。雪碧套件 - 面对英雄? (旋转到另一个节点的方向)

我发现的唯一示例代码是Adventure from Apple,它有一个faceTo类,但我发现使用它非常复杂。我正在寻找一个很好和干净的解决方案。

在此先感谢。

+0

您可以使用SKSpriteNode的xScale属性。将xScale设置为-1.0将使精灵以另一种方式面对。 – ZeMoon

+0

但是,这可能会导致sprite的physicsBody出现问题。 – ZeMoon

回答

2

最基本的实现应该是这个样子:

- (void)rotateNode:(SKNode *)nodeA toFaceNode:(SKNode *)nodeB { 

    CGFloat angle = atan2f(nodeB.position.y - nodeA.position.y, nodeB.position.x - nodeA.position.x); 

    if (nodeA.zRotation < 0) { 
     nodeA.zRotation = nodeA.zRotation + M_PI * 2; 
    } 

    [nodeA runAction:[SKAction rotateToAngle:angle duration:0]]; 
} 

您了解正在发生的事情是很重要的。查阅并阅读atan2(http://en.wikipedia.org/wiki/Atan2)并尝试了解上述代码的工作原理。

+0

这不会使精灵颠倒吗? – ZeMoon

+0

这是假设你的游戏是从上到下的角度。我假设自从你引用了Apple的Adventure演示版本。 – henryeverett

+0

哦,好的。那么这将是合适的。 – ZeMoon

0

您可以使用SKNode的xScale属性使精灵以另一种方式面对。这可以通过设置来完成:

sprite.xScale = -1.0; 

然而,这已被证明会导致问题与physicsBody,从这个问题可以看出:

Flipped x-scale breaks collision handling (SpriteKit 7.1)

这个问题的方法是在那里由JKallio给出。

他建议保持你的精灵作为另一个SKNode(应用physicsBody)的子元素,并在需要的地方更改子节点的xScale属性。这也是我在自己的项目中使用的。