Как отличить узел от другого файла, кроме GameScene?

Я ноб, поэтому, простите меня, если это очень простой вопрос. Я создаю свое первое приложение, и это игра. Код стал слишком большим для одного файла (раздражает постоянно подниматься и опускаться). Поэтому я поместил свои функции в другой файл. Проблема в том, что addChild не работает из другого файла. В моей игре, когда игрок останавливается в определенном месте, должен быть вызван узел. Если функция находится в файле GameScene.swift, она работает отлично, но если функция находится в любом другом быстром файле, то Node вызывается, но не отображается. Я знаю, что объект был вызван, потому что, если игрок попадает в одно и то же место во второй раз, игра заканчивается сообщением о том, что я пытаюсь применить объект, который уже запущен.

Узел, который я хочу вызвать, помещается внутри Struct, поэтому доступен из любой части моего кода.

Есть правильный способ бросить узел из другого файла?

Пример, чтобы понять это. Следующий код работает красиво. Я касаюсь квадрата и появляется другой квадрат

    //  GameScene.swift
//  teste1

import SpriteKit

struct myStruct {

static let myNode : SKShapeNode = SKShapeNode(rectOfSize: (CGSizeMake(100,100)), cornerRadius: 5)
static let myGameScene = GameScene()

}

class GameScene: SKScene {

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

        myStruct.myNode.position = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame)) + 150)
        myStruct.myNode.fillColor = SKColor.redColor()

        let button : SKShapeNode = SKShapeNode(rectOfSize: (CGSizeMake(100,100)), cornerRadius: 5)
        button.position = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame)))
        button.fillColor = SKColor.greenColor()
        button.name = "button"

        addChild(button)



    } // end DidMoveToView


  func addNode () {

    addChild(myStruct.myNode)

    }

    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {


        let touch = touches //as!  Set
        let location = touch.first!.locationInNode(self)
        let node = self.nodeAtPoint(location)

        // +++ BUTTON: DICE +++
        if (node.name == "button") {

            addNode()
        }
    }

} //end GameScene



Но невозможно сделать то же самое из другого файла. Скажем, я передаю функцию addNode() в другой быстрый файл следующим образом:

    //  otherFile.swift
//  teste1


import SpriteKit

func addNode () {

    myStruct.myGameScene.addChild(myStruct.myNode)

}

Когда я прикасаюсь к значку "кнопка", это происходит, но если я коснусь второго раза:

    2016-01-17 09:54:54.641 teste1[954:24089] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent:  name:'(null)' accumulatedFrame:{{460.64999, 482.64999}, {102.7, 102.7}}'
*** First throw call stack:

0
источник поделиться
1 ответ

Вы используете ключевое слово static для элементов в своей структуре. Это означает, что у вас есть только один экземпляр элементов в вашем приложении (это всегда один и тот же объект). Это приводит к тому, что вы снова добавляете тот же узел в ту же сцену.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос