2
votes

I am trying to build a simple obstacle jumping app. I want the image for the obstacle to be picked randomly from a set of images. I have tried using a combination of the arc4random_uniform function and switch case but that doesn't seem to update the SKSpriteNode. What am i doing wrong?

class PlayScene: SKScene, SKPhysicsContactDelegate{
      ...
      var block3 = SKSpriteNode(imageNamed: "lion")
      ....
}


override func update(currentTime: NSTimeInterval) {
     .....
     blockRunner()
    }


func blockRunner() {

        var imageNamedAnimal = ""
        var randomIndex = arc4random_uniform(2)
        switch(randomIndex) {
        case 0 : imageNamedAnimal = "turtle"
        case 1: imageNamedAnimal = "lion"
        default: imageNamedAnimal = "turtle"
        }

        block3 = SKSpriteNode(imageNamed: imageNamedAnimal)
        .....
        }   

At what point should i try to set the random image? Block3 seems to pick the lion image always which i had sent at the beginning of the code despite the fact that imageNamedAnimal shows random values in each frame.

2
Are you trying to create multiple obstacles or just one that changes over time? - 0x141E
i have one obstacle and i want to change its image randomly over time. - newbiedev

2 Answers

0
votes

You are creating a new SKSpriteNode when you call the initializer, but you never add it to the view. Instead, you can change the image in the sprite by setting its texture, like this:

block3.texture = SKTexture(imageNamed: imageNamedAnimal)
0
votes

You can avoid loading the images each time you change the character by creating and storing the images as textures. Here's an example of how to do that:

Create an array to store the textures

var textures = [SKTexture]()

In didMoveToView, create and store the textures

textures.append(SKTexture(imageNamed: "turtle"))
textures.append(SKTexture(imageNamed: "lion"))
textures.append(SKTexture(imageNamed: "rhino"))
...

In the blockRunner method, add the following

 // Randomly select a character
 let rand = Int(arc4random_uniform(UInt32(textures.count)))
 let texture = textures[rand] as SKTexture

 block3.texture = texture
 // Optionally, resize the sprite
 block3.size = texture.size()