SKAction:如何动画随机重复动作

时间:2014-02-19 05:04:36

标签: ios sprite-kit

我想重复SKAction,但每次重复都有随机值。我已阅读this question here,其中显示了一种方法。但是,我希望我的精灵动作能够动画,而不是简单地改变它的位置。我提出的一个解决方案是运行一系列操作,最后一个操作以递归方式调用我的move方法:

- (void)moveTheBomber {
    __weak typeof(self) weakSelf = self;

    float randomX = //  determine new "randomX" position

    SKAction *moveAction = [SKAction moveToX:randomX duration:0.25f];
    SKAction *waitAction = [SKAction waitForDuration:0.15 withRange:0.4];
    SKAction *completionAction = [SKAction customActionWithDuration:0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
        [weakSelf moveTheBomber];
    }];

    SKAction *sequence = [SKAction sequence:@[moveAction, waitAction, completionAction]];

    [self.bomber runAction:sequence];
}

递归调用这个方法对我来说感觉'icky',但鉴于我对SpriteKit的经验有限,这似乎是实现这一目标最明显的方法。

如何在屏幕上永久动画精灵的随机移动?

3 个答案:

答案 0 :(得分:7)

没有花里胡哨,但我认为这应该可以帮助你:

编辑:抱歉应该是:

SKAction *randomXMovement = [SKAction runBlock:^(void){
    NSInteger xMovement = arc4random() % 20;
    NSInteger leftOrRight = arc4random() % 2;
    if (leftOrRight == 1) {
        xMovement *= -1;
    }
    SKAction *moveX = [SKAction moveByX:xMovement y:0 duration:1.0];
    [aSprite runAction:moveX];
}];

SKAction *wait = [SKAction waitForDuration:1.0];
SKAction *sequence = [SKAction sequence:@[randomXMovement, wait]];
SKAction *repeat = [SKAction repeatActionForever:sequence];
[aSprite runAction: repeat];

答案 1 :(得分:2)

是的,你可以使用一个很棒的动作。

因此,不要执行当前的runAction执行此操作:

[self.bomber runAction:[SKAction repeatActionForever:sequence]];

您还需要将moveAction moveToX:值更改为arc4random

答案 2 :(得分:0)

由于随机函数仅计算一次,因此无法将其放入序列或repeatForever SKAction中。引用:Why doesn't the call to the random function work in the sequence?

一个很好的 Swift 答案:

func newLocation(_ circle: SKShapeNode) {
    circle.run(SKAction.move(to: randomPosition(), duration: 2), completion: {
        [weak self] in self?.newLocation(circle)
    })
}

使用randomPosition()

func randomPosition() -> CGPoint {
    let height = Int(self.view?.frame.height ?? 0)
    let width = Int(self.view?.frame.width ?? 0)

    let randomPosition = CGPoint(x: Int.random(in: 0..<width), y: Int.random(in: 0..<height))

    return randomPosition
}

run操作的完成一次又一次地调用了自己,并带有一个新的计算出的随机位置。