首页 文章

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

提问于
浏览
0

我是个菜鸟,所以,如果这是一个非常基本的问题,请原谅我 . 我正在创建我的第一个应用程序,这是一个游戏 . 代码对于一个文件来说太大了(一直都很烦人) . 所以我将我的功能放在其他文件中 . 问题是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

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

相关问题