2016-08-02 50 views
0

所以基本上我期待着随机选择4种不同颜色的球之一进入场景,每个场景都有一个动画,物理属性和运动间距,我已经编码。我不确定如何制作阵列,然后从4个彩球的阵列中随机选择,以便随机选择一个球进入场景。 为了让它更清楚我在这里要求的一些代码(我只在这个代码中使用两个球,所以你不必多读):如何从快速的精灵阵列中选择

var moveandremove = SKAction()<这是在我的ballScene.swift

的产卵runBlock是内部didMovetoView

让产卵= SKAction.runBlock({ ()在

 self.allballs() 

    }) 

    let delay = SKAction.waitForDuration(2.0) 
    let SpawnDelay = SKAction.sequence([spawn, delay]) 
    let spawndelayforever = SKAction.repeatActionForever(SpawnDelay) 
    self.runAction(spawndelayforever) 

    let distance = CGFloat(brnball.frame.width * 20 + brnball.frame.width) 
    let moveball = SKAction.moveByX(-distance, y: 0, duration: NSTimeInterval(0.003 * distance)) 
    let removeball = SKAction.removeFromParent() 
    moveandremove = SKAction.sequence([moveball]) 

} 


func allballs() { 

    TextureAtlasblk = SKTextureAtlas(named: "blkball") 

    for i in 1...TextureAtlasblk.textureNames.count{ 

     var Name = "blkball_\(i)" 
     blkarray.append(SKTexture(imageNamed: Name)) 
    } 

    blkball = SKSpriteNode(imageNamed: "blkball_1") 
    blkball.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame)) 
    blkball.zPosition = 7 
    blkball.setScale(0.1) 

    self.addChild(blkball) 

    blkball.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(blkarray, timePerFrame: 0.2))) 

    //brownball 

    TextureAtlasbrn = SKTextureAtlas(named: "brnball") 

    for i in 1...TextureAtlasbrn.textureNames.count{ 

     var Name = "brnball_\(i)" 
     brnarray.append(SKTexture(imageNamed: Name)) 
    } 

    brnball = SKSpriteNode(imageNamed: "brnball_1") 
    brnball.position = CGPoint(x: CGRectGetMidX(self.frame) + 50, y: CGRectGetMidY(self.frame)) 
    brnball.zPosition = 7 
    brnball.setScale(0.1) 

    self.addChild(brnball) 

    brnball.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(brnarray, timePerFrame: 0.2))) 

这是我可怕的起点,在试图让一个数组从每个球的选择(这是我allballs()函数中):

VAR ballarray:NSMutableArray的= [blkball,brnball,yelball,bluball]

runAction(moveandremove) 

我是新来的迅速和漂亮的无望,将是真棒,如果有人可以帮助我:)

感谢

回答

1

这是我很难找到你正在谈论的阵列您码。不过,我仍然可以告诉你如何。

比方说,我们有一个[Int]

let ints = [10, 50, 95, 48, 77] 

我们想要得到该数组的随机选取的元素。正如你可能已经知道的那样,你可以使用带有元素索引的下标运算符来访问数组中的元素,例如, ints[2]返回95。所以如果你给下标随机索引,数组中的一个随机项会被返回!

让我们看看我们如何生成一个随机数。

arc4random_uniform函数返回0到1之间的均匀分布的随机数。请注意,该函数将UInt32作为参数,返回值的类型相同。所以,你需要做一些铸造:

let randomNumber = Int(arc4random_uniform(UInt32(ints.count))) 

随着randomNumber,我们可以在阵列中访问随机元素:

let randomItem = ints[randomNumber] 

尝试将此技术应用于您的情况。

这里是要做到这一点,以及一个通用的方法:

func randomItemInArray<T> (array: [T]) -> T? { 
    if array.isEmpty { 
     return nil 
    } 

    let randomNumber = Int(arc4random_uniform(UInt32(array.count))) 
    return array[randomNumber] 
} 

注意,如果传入的数组为空,则返回nil

+0

这就是它,你的传奇!谢谢 :) – Youngiysh27

0

您可以对Array返回一个随机元素进行扩展。

extension Array { 
    func randomElement() -> Element { 
    let i = Int(arc4random_uniform(UInt32(count - 1))) 
    return self[i] 
    } 
} 

你可以更进一步,允许一个函数直接应用于一个随机元素。

mutating func randomElement(perform: (Element) -> Element) { 
    let i = Int(arc4random_uniform(UInt32(count - 1))) 
    self[i] = perform(self[i]) 
} 

当使用引用类型数组时,可以使用此函数。

func randomElement(perform: (Element) ->()) { 
    let i = Int(arc4random_uniform(UInt32(count - 1))) 
    perform(self[i]) 
}