【问题标题】:Sprite-kit - Facing the hero? ( rotating to the direction of another node)Sprite-kit - 面对英雄? (旋转到另一个节点的方向)
【发布时间】:2014-05-08 07:48:13
【问题描述】:

我有两个 spriteNodes 英雄和敌人,都应用了矩形物理体。 在更新中,当英雄到达某个点时,例如 hero.position.y

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

提前致谢。

【问题讨论】:

  • 您可以使用 SKSpriteNode 的 xScale 属性。将 xScale 设置为 -1.0 将使精灵面朝另一个方向。
  • 但是,这可能会导致精灵的physicsBody出现问题。

标签: objective-c sprite-kit


【解决方案1】:

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

- (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) 并尝试了解上面的代码是如何工作的。

【讨论】:

  • 这不会使精灵倒置吗?
  • 这是假设您的游戏是自上而下的。我假设是因为您引用了 Apple 的 Adventure 演示。
  • 哦,好的。那么这将是合适的。
  • 感谢 henryeverett ,一个 101 初学者问题,那么你如何在更新中使用该代码:我有以下 ` [self enumerateChildNodesWithName:@"enemy" usingBlock:^(SKNode *敌人, BOOL *stop) { ` if (hero.position.y
  • 它告诉你,你还没有在“enemy”类中实现一个名为 toFaceNode: 的方法。确保您已在 .m 文件中正确实现该方法并在 .h 文件中引用它。 developer.apple.com/library/mac/documentation/cocoa/conceptual/…
【解决方案2】:

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

sprite.xScale = -1.0;

但是,这已被证明会导致physicsBody 出现问题,从这个问题可以看出:

Flipped x-scale breaks collision handling (SpriteKit 7.1)

JKallio 给出了这个问题的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多