【问题标题】:How to rotate a sprite node in sprite kit?如何在精灵套件中旋转精灵节点?
【发布时间】:2013-10-23 18:42:14
【问题描述】:

我正在制作游戏,但在旋转精灵节点时遇到问题, 这是我的代码;我必须添加什么来转动它,比如说 45 度?。

SKSpriteNode *platform = [SKSpriteNode spriteNodeWithImageNamed:@"YellowPlatform.png"];
platform.position = CGPointMake(CGRectGetMidX(self.frame), -200+CGRectGetMidY(self.frame));
platform.size = CGSizeMake(180, 10);
platform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:platform.size];
platform.physicsBody.dynamic = NO;
[self addChild:platform];

【问题讨论】:

  • 很简单,只要加上下面这行代码:platform.zRotation = M_PI/4.0;再见

标签: ios sprite-kit rotation


【解决方案1】:

您为旋转创建 SKAction 并在节点上运行该操作。 例如:

//M_PI/4.0 is 45 degrees, you can make duration different from 0 if you want to show the rotation, if it is 0 it will rotate instantly
SKAction *rotation = [SKAction rotateByAngle: M_PI/4.0 duration:0]; 
//and just run the action
[yourNode runAction: rotation];  

【讨论】:

    【解决方案2】:

    只需执行此操作而不使用操作:

    sprite.zRotation = M_PI / 4.0f;
    

    在 Swift 4 中:

    sprite.zRotation = .pi / 4
    

    【讨论】:

    • 这应该是公认的答案。不需要为了旋转精灵而运行一个持续时间为零的动作。
    【解决方案3】:

    使用预定义的值会更快:

    sprite.zRotation = M_PI_4;
    

    math.h 中的这些预定义常量可作为文字使用,可用于减少对 M_PI / 4.0 等值的实际处理

    【讨论】:

    • 废话。它将产生相同的编译代码并花费相同的时间(差异将无法估量)。话虽如此,没有理由不使用M_PI_4
    • 哦,感谢您解决这个问题。我不知道 M_PI/4 将被预编译以反映与 M_PI_4 相同的值。
    【解决方案4】:
    sprite.zRotation = M_PI_4;
    

    [sprite runAction:[SKAction rotateByAngle:M_PI_4 duration:0]];
    

    不一样。

    即使持续时间为 0,运行 SKAction 也会为更改设置动画,它会在很短的时间内完成。更改 zRotation 将在新的旋转中显示它。

    为什么这很重要:如果您在其上添加新的精灵,[SKAction rotateByAngle:] 将在精灵出现在视图中时创建闪烁/丑陋。

    如果精灵在屏幕上并且你想旋转它,改变 zRotation 将不如 rotatebyAngle: 即使持续时间为 0。

    【讨论】:

    • 这是一个重要的区别。
    【解决方案5】:

    在 Swift 4 中,我的旋转方式是

    sprite.zRotation =  .pi / 2 // 90 degrees
    sprite.zRotation =  .pi / 4 // 45 degrees
    

    【讨论】:

      【解决方案6】:
      //rotates player node 90 degrees
      player.zRotation = CGFloat(M_PI_2)*3;
      //rotates 180 degrees
      player.zRotation = CGFloat(M_PI_2)*2;
      //rotates 270 degrees
      player.zRotation = CGFloat(M_PI_2)*1;
      //rotates 360 degrees (where it was originally)
      player.zRotation = CGFloat(M_PI_2)*4;
      //rotates 315 degrees
      player.zRotation = (CGFloat(M_PI_2)*1)/2;
      and so on...
      

      【讨论】:

      • 为您的答案添加更多细节
      【解决方案7】:

      对于 SWIFT 3 / SWIFT 4 版本,您可以使用下一个:

      sprite.zRotation = .pi / 4
      

      或者如果你喜欢动作:

      let rotateAction = SKAction.rotate(toAngle: .pi / 4, duration: 0)
      sprite.run(rotateAction)
      

      【讨论】:

      • 你也可以使用CGFloat.pi / 4