2016-08-02 2 views
0

Итак, в основном я ищу, чтобы выбрать один из 4 разных цветных шариков наугад, чтобы войти в сцену, каждая из которых имеет анимацию, физические свойства и движение. & Интервал, который у меня уже есть закодированы. Я не уверен точно, как сделать массив, а затем выбрать случайным образом из массива 4 цветных шаров , так что у меня есть один шар, выбранный наугад, чтобы войти в сцену. Для того, чтобы было более понятно, что я спрашиваю здесь некоторый код (я использую только два мяча в этом коде, так что вы не должны читать больше):Как выбрать из массива спрайтов в swift

вар 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() функция):

вар ballarray: NSMutableArray = [blkball, brnball, yelball, bluball]

runAction(moveandremove) 

Я новичок в быстрой и довольно безнадежным, было бы удивительным, если кто-то может помочь мне :)

Благодарности

ответ

1

Это трудно для меня, чтобы найти массив, который вы говорите в вашем код. Но, тем не менее, я все еще могу показать вам, как это сделать.

Допустим, мы имеем [Int]:

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

И мы хотим, чтобы случайно выбранный элемент этого массива.

Как вы уже знаете, вы используете оператор индекса с индексом элемента для доступа к элементу массива, например. ints[2]95. Поэтому, если вы укажете случайный индекс для индекса, будет возвращен случайный элемент в массиве!

Посмотрим, как мы можем создать случайное число.

Функция arc4random_uniform возвращает равномерно распределенное случайное число от 0 до единицы, меньшее значение параметра. Обратите внимание, что эта функция принимает параметр 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

Вы можете сделать и расширение для массива, которое возвращает случайный элемент.

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]) 
} 
Смежные вопросы