如何在[SKAction rotateBy:duration:]期间获得正确的zRotation

时间:2015-07-05 10:27:34

标签: ios objective-c sprite-kit

我正在为一个节点运行一个永远重复的rotateBy动作,偶尔我想得到节点的当前轮换。但是zRotation总是返回0.如何为这个节点获得正确的zRotation?

编辑:所以我最后要做的是创建自定义轮播操作,而不是使用Sprite Kit的默认操作。更复杂,更难以扩展,但它做我想要的,可以封装在每个节点自己的类中。

2 个答案:

答案 0 :(得分:3)

我相信你获得0的原因是因为你正在使用动画。在模拟中的每个步骤都不更新正在进行动画的节点的属性。您需要在更新方法中手动旋转节点或创建物理主体并设置角速度。使用实时运动将允许您在模拟的每个步骤中持续监视节点的属性。

您可以在我的回答here中看到使用实时动画模拟旋转的示例(尽管更复杂)。

答案 1 :(得分:0)

如果将以下内容粘贴到新项目中,您应该会看到zRotation属性随时间的变化。在180度/秒的旋转速率和60 FPS的情况下,zRotation每次更新变化约3度。

@implementation GameScene {
    SKSpriteNode *sprite;
}

-(void)didMoveToView:(SKView *)view {        
    self.scaleMode = SKSceneScaleModeResizeFill;

    sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    sprite.xScale = 0.5;
    sprite.yScale = 0.5;
    sprite.position = CGPointMake (CGRectGetMidX(view.frame),CGRectGetMidY(view.frame));

    SKAction *action = [SKAction rotateByAngle:M_PI duration:1];

    [sprite runAction:[SKAction repeatActionForever:action]];

    [self addChild:sprite];
}

-(void)didEvaluateActions {
    // Wrap at 360 degrees
    CGFloat angle = fmod(sprite.zRotation*180/M_PI, 360.0);
    NSLog(@"%g",angle);
}

@end