随机化节点移动持续时间

时间:2015-06-15 19:23:08

标签: swift sprite-kit skspritenode skaction

我正在使用SpriteKit制作游戏,我有一个节点在屏幕上来回移动并重复使用代码:

    let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: 1.5)
    let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: 1.5)
    let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
    let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))
    let moveBackAndForth = SKAction.repeatActionForever(SKAction.sequence([texRight, moveRight, texLeft, moveLeft,]))
    Drake1.runAction(moveBackAndForth)

我试图弄清楚我可以用什么方法随机化持续时间。每次moveBackandForth运行时,我希望它使用不同的持续时间重新运行(在游戏中,而不是在游戏之间)。如果有人可以给我一些示例代码尝试我会非常感激。

arc4Random也可以正常使用,但它不会在游戏中随机化,只能在游戏之间进行。

2 个答案:

答案 0 :(得分:1)

当您运行类似于示例的操作并使用arc4Random随机化持续时间参数时,实际上就会发生这种情况:

  • 设置随机持续时间并将其存储在操作中。
  • 然后在给定持续时间的序列中重复使用动作。

因为动作按原样重复使用,持续时间参数随时间保持不变,移动速度不随机化。

解决这个问题的一种方法(我个人更喜欢)就是创建一个“递归动作”,或者更好的说,创建一个运行所需序列的方法并以递归方式调用它:

import SpriteKit

class GameScene: SKScene {

    let  shape = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 20, height: 20))

    override func didMoveToView(view: SKView) {


       shape.position = CGPointMake(CGRectGetMidX(self.frame) , CGRectGetMidY(self.frame)+60 )

       self.addChild(shape)

       move()
    }


    func randomNumber() ->UInt32{

        var time = arc4random_uniform(3) + 1
        println(time)
        return time
    }

    func move(){

        let recursive = SKAction.sequence([

            SKAction.moveByX(frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
            SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
            SKAction.runBlock({self.move()})])

        shape.runAction(recursive, withKey: "move")
    }

}

要停止操作,请删除其键(“移动”)。

答案 1 :(得分:0)

我没有任何可以立即尝试的项目。

但你可能想尝试这个:

let action = [SKAction runBlock:^{
    double randTime = 1.5; // do your arc4random here instead of fixed value
    let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: randTime)
    let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: randTime)
    let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
    let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))

    let sequence = SKAction.sequence([texRight, moveRight, texLeft, moveLeft])

    Drake1.runAction(sequence)
}]; 

let repeatAction = SKAction.repeatActionForever(action)

Drake1.runAction(repeatAction)

如果有帮助,请告诉我。