精灵套装 - 面对英雄? (旋转到另一个节点的方向)

时间:2014-05-08 07:48:14

标签: objective-c sprite-kit

我有两个spriteNodes英雄和敌人,两者都应用了矩形physicsBody。 在更新中,当英雄到达某个点时,例如hero.position.y< = 300我希望敌人旋转并在英雄向下移动时面对英雄。

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

提前致谢。

2 个答案:

答案 0 :(得分: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)并尝试了解上述代码的工作原理。

答案 1 :(得分:0)

您可以使用SKNode的xScale属性使sprite面向另一个方向。这可以通过设置:

来完成
sprite.xScale = -1.0;

然而,事实证明这会导致physicsBody出现问题,从这个问题可以看出:

Flipped x-scale breaks collision handling (SpriteKit 7.1)

此问题的解决方案由JKallio提供。

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