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