как получить доступ ко всем моим вражеским узлам одновременно

У меня есть 6 спрайтов врагов в игре SpriteKit. Я хочу иметь доступ ко всем из них, как к «врагам», чтобы они появлялись на сцене в случайном порядке. Я пытался сделать это:

class GameScene: SKScene {

var redBox = SKSpriteNode(imageNamed: "redBox")
var greenBox = SKSpriteNode(imageNamed: "greenBox")
var blueBox = SKSpriteNode(imageNamed: "blueBox")
var magentaBox = SKSpriteNode(imageNamed: "magentaBox")
var cyanBox = SKSpriteNode(imageNamed: "cyanBox")
var yellowBox = SKSpriteNode(imageNamed: "yellowBox")

func randomBox() -> SKSpriteNode {

    let boxes = [redBox, greenBox, blueBox, magentaBox, cyanBox, yellowBox]
    let count = boxes.count
    var randomOne = Int(arc4random_uniform(UInt32(count)))
    var randomBox = boxes[randomOne]

    return randomBox
}

var oneBox: SKSpriteNode = randomBox()
}

Но в oneBox Xcode выдает ошибку и говорит: «отсутствует параметр № 1 в вызове».

Как правильно выбрать случайный узел?

РЕДАКТИРОВАТЬ: мой код, вызывающий эту ошибку:

class GameScene: SKScene {
//boxes
var redBox = SKSpriteNode(imageNamed: "redBox")
var greenBox = SKSpriteNode(imageNamed: "greenBox")
var blueBox = SKSpriteNode(imageNamed: "blueBox")
var magentaBox = SKSpriteNode(imageNamed: "magentaBox")
var cyanBox = SKSpriteNode(imageNamed: "cyanBox")
var yellowBox = SKSpriteNode(imageNamed: "yellowBox")
var oneBox:SKSpriteNode!


func randomBox() -> SKSpriteNode {

    let boxes = [redBox, greenBox, blueBox, magentaBox, cyanBox, yellowBox]
    let count = boxes.count
    var randomOne = Int(arc4random_uniform(UInt32(count)))
    var randomBox = boxes[randomOne]

    return randomBox
}

//random for Y
func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}

func random(#min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
}


override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    var oneBox: SKSpriteNode = randomBox()

    func addUpperBoxes() {
let middleY = random(min: size.height/2, max: size.height - size.height/3)
oneBox.position = CGPoint(x: size.width + oneBox.size.width/2, y: middleY)
addChild(oneBox)
let middleDuration = random(min: CGFloat(1.5), max: CGFloat(2.5))

let middleMove = SKAction.moveTo(CGPoint(x: -oneBox.size.width/2, y: middleY), duration: NSTimeInterval(middleDuration))
let middleMoveDone = SKAction.removeFromParent()
oneBox.runAction(SKAction.sequence([middleMove, middleMoveDone]))
    }

    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(addUpperBoxes),
            SKAction.waitForDuration(0.5)
            ])
        ))
}

person TimurTim    schedule 17.08.2015    source источник
comment
Вам нужно переместить оператор oneBox = ... в такой метод, как didMoveToView или touchesBegan.   -  person 0x141E    schedule 17.08.2015
comment
Значит, нет возможности сделать oneBox доступным во всех частях игры? Что, если я положу его в didMoveToView, а он мне понадобится в Update??   -  person TimurTim    schedule 17.08.2015
comment
Определите его после var yellow... как var oneBox:SKSpriteNode!, а затем инициализируйте в didMoveToView. Затем вы можете получить к нему доступ в update.   -  person 0x141E    schedule 17.08.2015
comment
Хорошо! Большое спасибо! Еще один вопрос: если я получаю доступ к этим узлам через oneBox, мне все еще нужно делать self.addChild(yellowBox); self.addChild(redBox) и т. д., или будет достаточно добавить addChild(oneBox)?   -  person TimurTim    schedule 17.08.2015
comment
Это зависит от того, чего вы пытаетесь достичь. Очевидно, что addChild добавит ящики на сцену, поэтому добавлять их следует только тогда, когда они нужны в игре. Вы можете добавить поле с помощью oneBox, но убедитесь, что вы добавили поле только один раз, иначе приложение выйдет из строя.   -  person 0x141E    schedule 17.08.2015
comment
Вот что случилось со мной секунду назад. Я попытался сделать линию случайных коробок, перемещающихся от правого края к левому, один за другим. Приложение вылетело, и я получил ошибку Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'cyanBox' (50 x 50)], но я не понимаю почему, я сделал только addChild(oneBox).   -  person TimurTim    schedule 17.08.2015
comment
Вам нужно будет придумать способ предотвратить повторное выделение уже выбранного поля.   -  person 0x141E    schedule 17.08.2015
comment
То есть я не могу одновременно иметь на сцене 2 или более одинаковых узла? Странно но мне эта ошибка говорила об одном ящике, а на экране был другой ящик   -  person TimurTim    schedule 17.08.2015
comment
Возможно, вам следует создать новый экземпляр SKSpriteNode в randomBox и назначить узлу случайный цвет. Тогда у вас может быть несколько ящиков в сцене одного цвета.   -  person 0x141E    schedule 17.08.2015
comment
Я не понимаю, это не работает! Все, что я хочу, это выбрать случайный узел и заставить его двигаться, насколько это сложно? Я нашел ваш ответ по той же проблеме, попытался реализовать его и потерпел неудачу с та же ошибка.   -  person TimurTim    schedule 17.08.2015