2016-12-26 9 views
1

У меня есть 5 skspritesnodes, я хочу создать 1 случайный узел за раз, я знаю, что мне нужно использовать arc4random, но примеры ive попробовали, похоже, не работают. Идентификатор как переменную я могу затем ввести где-либо мне нужно начать нерест случайным образом ищет «монстр»случайный выбор узла skspritenode для создания из 5 спрайтов

var bird0 = SKSpriteNode(imageNamed: "back_bird") 
var bird1 = SKSpriteNode(imageNamed: "blue_bird") 
var bird2 = SKSpriteNode(imageNamed: "green_bird") 
var bird3 = SKSpriteNode(imageNamed: "purple_bird") 
var bird4 = SKSpriteNode(imageNamed: "orange_bird") 

У меня есть множество physicsbody для каждого, размера, ЭСТ. все задано минусом возможность случайным образом выбрать один, чтобы выйти

+2

Общее примечание: если ваши имена переменных содержат увеличивающиеся число почти всегда лучше использовать массив. Это упрощает весь «выбор случайного». – luk2302

ответ

1

Вам нужно поместить спрайты в массив. Затем вы можете получить доступ к случайному элементу в этом массиве.

Вот функция, которая возвращает случайную птицу.

func randomBird() -> SKSpriteNode { 
    let array = [bird0, bird1, bird2, bird3, bird4] 
    return array[Int(arc4random_uniform(UInt32(array.count)))] 
} 

Вы можете также поместить все птицы в массиве и удалить переменные bird0, bird1, bird2 и так далее:

let birds = [ 
    SKSpriteNode(imageNamed: "back_bird"), 
    SKSpriteNode(imageNamed: "blue_bird"), 
    SKSpriteNode(imageNamed: "green_bird"), 
    SKSpriteNode(imageNamed: "purple_bird"), 
    SKSpriteNode(imageNamed: "orange_bird") 
] 

Тогда birds[Int(arc4random_uniform(UInt32(array.count)))] поможет вам случайную птицу.

+0

это не было исправлено «UInt32 (birds.count), а затем, если я« исправлю »его, он говорит, что это« значение знака cannon для типа SKspritenode с индексом типа UInt32 » – TroyDeJ

+0

@TroyDeJ Я отредактировал свой ответ. Если это так, пожалуйста, подумайте о том, чтобы принять его, нажав на галочку! Также я рекомендую вам установить SwiftRandom pod: https://github.com/thellimist/SwiftRandomhttps://github.com/thellimist/SwiftRandom – Sweeper

+0

извините за то, что вы новичок, но как вы его интегрируете, поскольку «птицы [Int (arc4random_uniform (UInt32 (array.count))]]' isnt узел, но int – TroyDeJ

2

В дополнение к ответу Sweeper, вы можете сделать расширение:

import SpriteKit 
import GameplayKit 

extension Array { 
    var randomElement: Element { 
     return self[Int(arc4random_uniform(UInt32(count)))] 
    } 
} 

и использовать его как это:

class GameScene: SKScene { 

    let sprites = [ 
     SKSpriteNode(color: .brown, size: CGSize(width:100,height:100)), 
     SKSpriteNode(color: .blue, size: CGSize(width:100,height:100)), 
     SKSpriteNode(color: .red, size: CGSize(width:100,height:100)), 
     SKSpriteNode(color: .green, size: CGSize(width:100,height:100)), 
     ] 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesBegan(touches, with: event) 

     if let randomBird = sprites.randomElement.copy() as? SKSpriteNode{ 

      if let location = touches.first?.location(in: self){ 
       randomBird.position = location 
       addChild(randomBird) 
      } 
     } 
    } 
} 
+0

Зачем хранить узлы в массиве, когда все, что вы делаете копирует их? В итоге вы будете использовать _n_ узлы, которые никогда не используются. – Epsilon

+0

@ Epsilon Это (копирование) было моим способом позволить нескольким экземплярам OP появляться несколько раз вместо того, чтобы добавлять их только один раз (потому что узел может иметь только одного родителя). Фактически это было расширение, которое позволяет немного удобнее получить случайный элемент. Имеют смысл? – Whirlwind

+0

Я понимаю, почему вы скопировали узлы.Моя проблема связана с самим массивом. Я думаю, что функция с оператором switch имеет больше смысла. – Epsilon