当前位置: 首页 > 知识库问答 >
问题:

如何从GameScene以外的其他文件投射节点?

糜昌胤
2023-03-14

我是noob,所以,原谅我,如果这是一个非常基本的问题。我正在创建我的第一个应用程序,它是一个游戏。对于一个文件来说,代码变得太大了(总是上下移动很烦人)。所以我把我的函数放在另一个文件里。问题是addChild不能从其他文件工作。在我的游戏中,当玩家停在一个特定的地方时,必须调用一个节点。如果该函数在“GameScene.swift”文件中,那么它工作得很好,但是如果该函数在任何其他swift文件中,那么该节点被调用,但是不显示。我知道这个物体被调用是因为如果玩家第二次击中同一个地方,游戏会崩溃,并显示一条消息说我正在试图施放一个已经施放的物体。

我要调用的节点放置在结构中,因此可以从我代码的任何部分访问。

有一种从其他文件强制转换节点的正确方法吗?

一个说明清楚的例子。波纹管代码运行良好。我触摸正方形和其他正方形出现


    //  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个答案

党星鹏
2023-03-14

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

 类似资料:
  • 问题内容: 我有下表,其中的表是空的,我正在尝试填充: 要填充的源数据是我从外部CSV文件填充的临时表: 我想做的是用中的值填充。该字段可以直接复制,但是我不太确定如何获取正确的内容(可以使用tmp_table.langname确定language.id)和(tmp_table.tplname,tmp_table.source,tmp_table.domain一起使用)确定template.id)

  • 问题内容: 如果文件中有一组方法,是否可以将这些文件包含在另一个文件中,但不带任何前缀(即文件前缀)调用它们? 所以,如果我有: 我怎么这样称呼它: 问题答案: 您将需要将其他文件作为模块导入,如下所示: 如果您不想在函数名称前加上模块名称,请执行以下操作: 如果要导入模块的所有成员,请执行以下操作: 编辑: 这是Dive Into Python 的精彩一章,在该主题上有更深入的介绍。

  • 问题内容: 我有一个包含多个Maven模块的项目 MockIFSClient 访问为 因此 IFSClientTest 运行鳍,因为它们在同一包中。 问题? 尝试访问相同代码的 调用,但现在失败,因为 services / pom.xml 具有以下依赖性 题 我要做出什么改变 这样也可以从不同的模块访问它 问题答案: 这个答案帮助我正确了 如何从Java中的类路径真正读取文本文件 我将代码更改为

  • 问题内容: 我将一个序列化为一个文件,并将该文件传输到另一台计算机上的另一个系统。 而且由于接收文件的系统是不同的,所以我没有相同的类,而是具有完全相同的结构但使用不同的包的类。 当我使用 从文件中读出我有一个。 如何避免这种异常?是否仅在接收列表时需要在其他系统中创建相同的包结构? 问题答案: 是的,您可以做三件事之一。 用相同的包名称创建相同的类 创建一个接口(当然,在两台计算机上都使用相同的

  • 问题内容: 如何在Python中导入其他文件? 我到底该如何导入特定的文件呢? 如何导入文件夹而不是特定文件? 我想根据用户输入在运行时动态加载Python文件。 我想知道如何从文件中仅加载一个特定部分。 例如,在我有: 尽管这给了我中的所有定义,但也许我只想要一个定义: 我要从import语句中添加些什么? 问题答案: 是Python中的新增功能,用于以编程方式导入模块。它只是一个包装器,请参见

  • 我不能运行Nginx,因为端口80已经在监听docker代理服务。 我想在端口8800而不是默认端口80上运行Nginx。 因此,我编辑了默认文件,如下所示; 但是,即使在重新启动后,我仍然无法使其按预期工作。 我做错了什么,如何解决? 下面是我得到的错误; ● nginx。服务-高性能web服务器和反向代理服务器已加载:已加载(/lib/systemd/system/nginx.service;