0

如何在场景中为 SKLabel 的位置设置动画?

我尝试了以下方法,但似乎没有用:

[SKView animateWithDuration:0.3
                                  delay:0.0
                                options:UIViewAnimationOptionCurveEaseOut
                             animations:^{
                                 newBestLabel.position = CGPointMake(CGRectGetMinX(self.frame)+70, CGRectGetMaxY(self.frame)-30);
                             }
                             completion:^(BOOL finished){}];

[UIView animateWithDuration:0.3
                                  delay:0.0
                                options:UIViewAnimationOptionCurveEaseOut
                             animations:^{
                                 newBestLabel.position = CGPointMake(CGRectGetMinX(self.frame)+70, CGRectGetMaxY(self.frame)-30);
                             }
                             completion:^(BOOL finished){}];

在 viewDidLoad 它开始于:

newBestLabel.position = CGPointMake(CGRectGetMinX(self.frame)+70, CGRectGetMaxY(self.frame)+30);

这里有什么问题?

4

2 回答 2

3

SKLabelNode不继承自UIView,这不是在 SpriteKit 中处理动画的方法。相反,您应该通过创建SKAction并将其应用于节点来处理此问题:

SKLabelNode *label = [SKLabelNode labelNodeWithFontNamed:@"Avenir"];
label.position = CGPointMake(30, 200);
label.text = @"Lorem Ipsum";
[self addChild:label];

SKAction *moveLabel = [SKAction moveByX:100 y:0 duration:2.0];
[label runAction:moveLabel];

与您的代码中的坐标不同,但我相信您可以从这里获取它。如果更符合您的要求,还有一个 moveTo: 操作。

于 2014-04-20T10:45:32.720 回答
3

因为SKLabelNode是SKNode的子类,您可以使用名为runAction:的方法并传入一个SKAction来满足您的需要。

// create an instance of SKAction
SKAction *moveLabel = [SKAction moveByX:0.0 y:30.0 duration:1.2];

// tell labelNode to run the action
[newBestLabel runAction:moveLabel];

值得注意的是,SpriteKit使用的坐标系与UIKit不同。因此,在上面的代码中,正 x 值将向右移动,正 y 值将向上移动!

有很多方法可以满足您的需要,还有更多,可以在SKAction 类参考中找到

于 2014-04-20T10:46:27.447 回答