2016-10-23 11 views
0

私は繰り返し生成されたSKSpriteNodeを持っています。私は乱数ジェネレータを作成し、その戻り値を別のスプライトイメージに関連付けることを試みました。ただし、動作しません。数値はランダムに生成されますが、 "2"が返されてもSKSpriteNodeは "Fire Barrel 1"として描画されます。SKSpriteNodeは乱数配列では機能しません

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) { 

} 
} 

答えて

3

あなたの問題は、あなたが "変数シャドウイング" と呼ばれるものをやっている

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

です。 randomValueはクラスインスタンスレベルにも存在しますが、ここではletを使用するため、ローカルスコープのバージョンが宣言されています。

self.valueの実際の値は、0であるInt()です。なぜ「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 
} 
+0

は、これをありがとう働く非常に明確な指示と説明、非常に感謝します。 –

関連する問題