如何从其他文件中转换节点而不是GameScene?

时间:2016-01-17 12:13:50

标签: swift file sprite-kit addchild

我是个菜鸟,所以,如果这是一个非常基本的问题,请原谅我。 我正在创建我的第一个应用程序而且它是一款游戏。代码对于一个文件来说太大了(一直都很烦人)。所以我将我的功能放在其他文件中。 问题是addChild不能从其他文件中工作。在我的游戏中,当玩家停在特定的地方时,必须调用一个节点。如果函数位于" GameScene.swift"文件它完美地工作,但如果该函数在任何其他swift文件,则调用节点,但不显示。我知道该对象被调用,因为如果玩家第二次碰到同一个地方,游戏就会发出一条消息,说我试图投射已经投射过的物体。

我想要调用的节点放在一个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()传递给其他swift文件,如下所示:


    //  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:

1 个答案:

答案 0 :(得分:0)

对结构中的元素使用static关键字。这意味着您的应用程序中只有一个元素实例(它始终是同一个对象)。这导致您再次将同一节点添加到同一场景。