2016-07-26 68 views
-1

我使用下面的代碼來生成一個隨機的SKTexture並將它分配給一個SKSpriteNode。給多個SKNode隨機生成SKTexture給出相同的輸出

var spriteTexture = [(SKTexture, String)]() 

     spriteTexture.append((SKTexture(imageNamed: "red"), "red")) 
     spriteTexture.append((SKTexture(imageNamed: "blue"), "blue")) 
     spriteTexture.append((SKTexture(imageNamed: "green"), "green")) 

let rand = Int(arc4random_uniform(UInt32(spriteTexture.count))) 
     let chosenSprite = spriteTexture[rand].0 as SKTexture 
     let spriteName = spriteTexture[rand].1 
     let spriteSkin = chosenSprite 

我使用此代碼將SKTexture分配給SKSpriteNode。

let Sprite1 = SKSpriteNode(texture: spriteSkin) 
let Sprite2 = SKSpriteNode(texture: spriteSkin) 

該代碼工作正常,並始終生成隨機圖像...但是,Sprite1和Sprite2總是具有相同的隨機圖像!

如何確保每個SKSpriteNode都有自己的「隨機」圖像?

感謝:d

回答

0

你的皮膚是平等的,因爲你只有一個隨機數。

func getRandomSkin() -> SKTexture { 
    let rand = Int(arc4random_uniform(UInt32(spriteTexture.count))) 
    let chosenSprite = spriteTexture[rand].0 as SKTexture 
    return chosenSprite 
} 

let randomSkin1 = getRandomSkin() 
let randomSkin2 = getRandomSkin() 

let sprite1 = SKSpriteNode(texture: randomSkin1) 
let sprite2 = SKSpriteNode(texture: randomSkin2) 

UPDATE 如果你想要的名字:

func getRandomSkinNode() -> SKSpriteNode { 
    let rand = Int(arc4random_uniform(UInt32(spriteTexture.count))) 
    let chosenSprite = spriteTexture[rand].0 as SKTexture 
    let spriteName = spriteTexture[rand].1 
    let spriteNode = SKSpriteNode(texture: chosenSprite) 
    spriteNode.name = spriteName 
    return spriteNode 
} 

let sprite1 = getRandomSkinNode() 
let sprite2 = getRandomSkinNode() 
+0

這是完美的!但我需要「let spriteName = spriteTexture [rand] .1」代碼,因爲我使用它來爲我的SKSpriteNode指定名稱。 – Questions

+0

@Questions檢查我的更新 –

+0

此代碼有兩個問題: 1)每次啓動getRandomSkinNode時生成一個新的SKSpriteNode,所以它只是不改變紋理,但改變了所有的精靈:如果你已經定製了你的節點,你失去了所有的屬性。 2)這個代碼每個節點只啓動一次函數,所以它是一樣的張貼在OP問題的。 –

0

記住這是iOS中(而不是隻在iOS版)是態度不好給大寫你的屬性。

你可以簡單地做:

let rand = randomNumber(0...(spriteTexture.count-1)) 
let chosenSprite = spriteTexture[rand].0 as SKTexture 
let spriteName = spriteTexture[rand].1 
let spriteSkin = chosenSprite 
... 
let sprite1 = SKSpriteNode() 
if let skin = spriteSkin { 
    sprite1.texture = spriteSkin 
} 

func randomNumber(range: Range<Int> = 1...6) -> Int { 
    let min = range.startIndex 
    let max = range.endIndex 
    return Int(arc4random_uniform(UInt32(1 + max - min))) + min 
} 

根據您的意見

把你的精靈在一個陣列通過使全局變量:

var spritesArray : [SKSpriteNode]! 

然後填充您的陣列並啓動scheduleTimer(在本例中爲每10秒啓動一次):

... 
spritesArray = [sprites1,sprites2] 
var changeTxtTimer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: Selector("changeTxt"), userInfo: nil, repeats: true) 

func changeTxt() { 
    print("change textures...") 
    for sprite in spritesArray { 
     let rand = randomNumber(0...(spriteTexture.count-1)) 
     let chosenSprite = spriteTexture[rand].0 as SKTexture 
     let spriteName = spriteTexture[rand].1 
     sprite.texture = chosenSprite 
     sprite.name = spriteName 
    } 
} 
+0

我改,你說什麼,但我得到這個錯誤「意外發現零而展開的可選值」上線「sprite1.texture = spriteSkin「 – Questions

+0

這意味着你的spriteSkin是零 –

+0

我分配」sprite1.texture = spriteSkin「,但我仍然得到相同的隨機圖像sprite1和sprite2 – Questions

相關問題