2016-08-02 52 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]) 
}