如何在Sprite Kit中旋转精灵节点?

25

我正在制作一个游戏,但在旋转精灵节点方面遇到了麻烦, 这是我的代码; 我需要添加什么来使它旋转,比如说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];

3
非常简单,只需添加以下代码行: platform.zRotation = M_PI/4.0; 再见 - Vince
7个回答

75

不使用actions,只需这样做:

sprite.zRotation = M_PI / 4.0f;

而在 Swift 4 中:

sprite.zRotation = .pi / 4

3
这应该是被接受的答案。没有必要运行一个持续时间为零的动作来旋转一个精灵。 - Reza Shirazian

20

您可以创建旋转的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];  

15
sprite.zRotation = M_PI_4;

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

不是同一件事。

即使持续时间为0,运行SKAction也会以非常短的时间进行动画更改。更改zRotation将在新的旋转中显示它。

为什么这很重要:如果您添加了新的精灵,在其上执行[SKAction rotateByAngle:]将在精灵进入视图时创建闪烁/难看的外观。

如果精灵在屏幕上并且您想旋转它,则更改zRotation的效果不如使用rotatebyAngle:即使持续时间为0也是如此。


1
这是一个重要的区别。 - JaredH

13

使用预定义的值会更快:

sprite.zRotation = M_PI_4;

math.h中的这些预定义常量可用作字面值,并可用于减少像M_PI / 4.0这样的值的实际处理。


2
胡说八道。这将导致相同的编译代码并且需要相同的时间(差异是微不足道的)。话虽如此,没有理由不使用M_PI_4 - trojanfoe
哦,谢谢你澄清这个问题。我不知道M_PI/4将被预编译为反映与M_PI_4相同的值。 - ZeMoon

7
在Swift 4中,我让我的旋转方式是:
sprite.zRotation =  .pi / 2 // 90 degrees
sprite.zRotation =  .pi / 4 // 45 degrees

6

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

sprite.zRotation = .pi / 4

或者如果你喜欢操作:

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

你也可以使用 CGFloat.pi / 4 - aopsfan

3
//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...

请在你的回答中添加更多细节。 - Anantha Raju C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接