swift - SKSpriteNode 不适用于随机数数组

标签 swift sprite-kit arc4random

我有一个重复生成的 SKSpriteNode。我创建了一个随机数生成器,并尝试将返回值与不同的 Sprite Image 相关联。但是,它不起作用。数字是随机生成的,但即使返回“2”,SKSpriteNode 也会绘制为“Fire Barrel 1”。

class GameScene: SKScene {

var firstObstacle = SKSpriteNode()
var player = SKSpriteNode()
var randomValue = Int()

override func didMove(to view: SKView) {

    createPlayer()

    let delay = SKAction.wait(forDuration: 3)
    let repeatingAction = SKAction.run(repeatingSequence)
    let sequence = SKAction.sequence([ delay, repeatingAction ] )
    run(SKAction.repeatForever(sequence))

}

func randomSelector() {
    let array = [0, 1, 2, 3]
    let randomValue = Int(arc4random_uniform(UInt32(array.count)))
    print(array[randomValue])
}

func createPlayer() {
    player = SKSpriteNode(imageNamed: "Player")
    player.setScale(0.4)
    player.position = CGPoint(x: -player.size.width, y: 0)
    player.zPosition = 1
    addChild(player)
}

func createObstacle() {

    if randomValue == 2 {

        firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 2")

    }

    else {

        firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 1")

    }

    firstObstacle.position = CGPoint(x: self.frame.width / 2, y: -self.frame.height / 2 + firstObstacle.size.height / 2)
    firstObstacle.zPosition = 1
    addChild(firstObstacle)
}

func repeatingSequence() {
    randomSelector()
    createObstacle()

    let moveObstacle = SKAction.moveBy(x: -self.frame.width - firstObstacle.size.width, y: 0, duration: 5)
    firstObstacle.run(moveObstacle)
}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func update(_ currentTime: TimeInterval) {

}
}

最佳答案

你的问题是

let randomValue = Int(arc4random_uniform(UInt32(array.count)))

你正在做所谓的“变量阴影”。 randomValue 也存在于类实例级别,但在这里因为您使用 let 声明了一个本地作用域版本。

self.value 的实际值为 Int(),即 0。因此它是“First Barrel l”。

您使用的通用设计并不是很好。除非你有一些真正的理由需要保存 randomValue,否则你不应该将它设为类实例变量。而是通过参数传递它。

这看起来像:

func randomSelector() -> Int {
    let array = [0, 1, 2, 3]
    return  Int(arc4random_uniform(UInt32(array.count)))
}

func createObstacle(type:Int) {
    if (type == 2) {
        // Type 2 stuff
    } else {
        // Other stuff
    }

    // Rest of your stuff
}

createObstacle(type: randomSelector())

尽管鉴于其工作原理,您甚至不需要参数,您可以这样做:

func createObstacle() {
    if (randomSelector() == 2) {
        // Type 2 stuff
    } else {
        // Other stuff
    }

    // Rest of your stuff
}

关于swift - SKSpriteNode 不适用于随机数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206084/

相关文章:

ios - swift 删除项目后如何重新填充数组

swift - Swift 中的导航 Controller

ios - SKShapeNode 或其他东西上的 anchor

ios - 对 SKShapeNode 元素的数组进行排序

iOS 8 游戏中心错误

c - 消除模偏差 : how is it achieved in the arc4random_uniform() function?

ios - arc4random_uniform() 的操作系统要求

ios - 随机数生成语法正确,但 CPU 使用率达到 100% 并且其他应该同时发生的事情没有发生

swift - reloadRows 无法正常工作

string - 在 Swift 中操作字符串