【问题标题】:Add / Remove SKSpriteNode in different function在不同的函数中添加/删除 SKSpriteNode
【发布时间】:2015-07-14 10:07:08
【问题描述】:

我对 swift 不熟悉,似乎无法理解这个概念: 我需要在一个函数中创建一个 SKSpriteNode,然后在另一个函数中将其删除,我无法完全了解如何对其进行编码,以便删除函数可以访问在另一个函数中创建的元素。情况: 一个上电节点被创建并显示在屏幕上。英雄收集能量并在屏幕底部添加一个图标。然后玩家可以触摸电源图标来使用它,然后图标应该从屏幕上移除。 我将尝试在下面的代码中说明我的意思。

func createPowerUp() {
    var powerUpNode = SKSpriteNode("...")//add node to screen for player to collect
    addChild(powerUpNode)
}

func playerCollectsPowerUp() {
    let powerUpIcon = SKSpriteNode("...")//add icon to bottom of screen
    addChild(powerUpIcon)
}

func usePowerUp() {
    powerUpIcon.removeFromParent()//This is my error, powerUpIcon is not defined

func touchesEnded() {
    usePowerUp()
}

那么,我该如何构造它,以便 usePowerUp() 可以访问我在 playerCollectsPowerUp() 中创建的 SKSpriteNode ?我知道我可以在更高级别上定义 SKSpriteNode,这将使这两种方法都可以访问电源图标。但这是一个好习惯吗?

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    有多种方法可以做到这一点。正如您所说,您可以在更高级别定义变量以使其可供所有函数访问。你也可以在你的类的扩展中声明它。例如,您可以在 swift 文件中执行以下操作(虽然我习惯于在 Objective-C 中使用它,但我不确定这是否最适合您):

    extension MyScene
    {
        var SKSpriteNode *myNode;
    }
    

    获取相同节点的另一种方法是使用所有 SKNode 的name 属性。例如,您可以通过执行powerUpNode.name = @"My Beauty" 来设置名称。在您的usePowerup 函数中,您可以执行var SKSpriteNode powerUpIcon = self.childNodeWithName("My Beauty"),其中powerUpIcon 现在是您之前命名的节点(请记住,如果命名其他节点,您需要使用此方法跟踪节点名称)。

    您可以根据自己的规格选择两种方法之一。如果您在各种其他功能中使用它,则声明 ivar 可能是更好的选择。如果您描述的功能是完整的,那么使用名称可能是更好的选择。至于您关于声明 ivars(实例变量)的做法的问题,这绝对是常见且公认的做法。他们有这个功能是有原因的:)

    【讨论】:

    • 我刚刚意识到他正在使用 swift。可能应该更新我的答案哈。
    • 你能告诉我什么看起来不对劲吗?我使用苹果文档在这里编写了所有代码。
    • 这只是一个快速的伪代码,让您了解我想要做什么,它不是真正的代码,但它在 swift 中。
    • 谢谢,创造更高的功能完美运行,出于某种原因,我认为有理由不这样做(虽然我无法弄清楚那个原因是什么。)
    • 不,这样做称为声明实例变量。这样您就可以访问所有函数和子类中的特定变量。
    【解决方案2】:

    目前,您在一个方法中创建您的SKSpriteNode,该方法只能由该特定方法访问。

    您可以通过多种方式共享SKSpriteNode,例如返回它并调用另一个方法并将Node 传递给它,但最简单的方法是在方法之外创建它。因此,就在您的类声明下方,如下所示:

    class myClass {
        //declare node here
        func doStuff() {}
    }
    

    希望有帮助:)

    【讨论】:

    • 好的,在类中创建节点并使用函数将其添加到场景中是可以接受的做法吗?出于某种原因,这样做对我来说感觉很草率,但我会去做。谢谢。
    • 假设方法 A 将其添加到视图中,然后(逻辑上)需要首先调用 A 以使节点出现在屏幕。但是每次修改节点时,都会保存该更改。所以 A 将节点移动到 y=10。然后方法 B 在 y=10 上的节点上进行填充。明白我的意思吗?哦,如果你选择我的解决方案,请务必给我荣誉;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多