2016-07-26 81 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

相关问题