在不同的函数中添加/删除 SKSpriteNode

Add / Remove SKSpriteNode in different function

我是 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,这将使两种方法都可以访问开机图标。但这是一个好习惯吗?

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

extension MyScene
{
    var SKSpriteNode *myNode;
}

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

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

目前,您在一个方法中创建了 SKSpriteNode,该方法仅供特定方法访问。

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

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

希望对您有所帮助:)