我想重复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的经验有限,这似乎是实现这一目标最明显的方法。
如何在屏幕上永久动画精灵的随机移动?
答案 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操作的完成一次又一次地调用了自己,并带有一个新的计算出的随机位置。