我是个菜鸟,所以,如果这是一个非常基本的问题,请原谅我。 我正在创建我的第一个应用程序而且它是一款游戏。代码对于一个文件来说太大了(一直都很烦人)。所以我将我的功能放在其他文件中。 问题是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:
答案 0 :(得分:0)
对结构中的元素使用static关键字。这意味着您的应用程序中只有一个元素实例(它始终是同一个对象)。这导致您再次将同一节点添加到同一场景。