Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不同功能中添加/删除SKSpriteNode_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 在不同功能中添加/删除SKSpriteNode

Ios 在不同功能中添加/删除SKSpriteNode,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我对斯威夫特还不熟悉,似乎无法理解这个概念: 我需要在一个函数中创建一个SKSpriteNode,然后在另一个函数中删除它,我不知道如何对它进行编码,以便删除函数可以访问在另一个函数中创建的元素。情况:一个通电节点被创建并显示在屏幕上。英雄收集电源,并在屏幕底部添加一个图标。然后,玩家可以触摸通电图标使用它,然后该图标应从屏幕上移除。 我将尝试在下面的代码中说明我的意思 func createPowerUp() { var powerUpNode = SKSpriteNode("..."

我对斯威夫特还不熟悉,似乎无法理解这个概念: 我需要在一个函数中创建一个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()中创建的SKSpritEndode?我知道我可以在更高的级别上定义SKSpriteNode,这将使两种方法都可以访问通电图标。但这是一种好的做法吗?

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

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


您可以根据您的规范从两种方法中选择一种。如果您在其他各种函数中使用它,那么声明ivar可能是一个更好的选择。如果您描述的功能已完成,那么使用名称可能是更好的选择。至于您关于声明IVAR(实例变量)实践的问题,它肯定是常见且公认的实践。它们之所以具有此功能,是因为:)

目前,您在一个方法中创建了您的
SKSpriteNode
,该方法只允许该特定方法访问

有不同的方法可以共享
SKSpriteNode
,比如返回它并调用另一个方法并将其传递给节点,但最简单的方法是在方法之外创建它。因此,在类声明的正下方,如图所示:

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

希望这能有所帮助:)

我刚意识到他在使用swift。也许应该更新我的答案哈。你能告诉我什么看起来不对劲吗?我使用苹果文档来编写这里的所有代码。这只是一个快速的伪代码,让你了解我正在尝试做什么,它不是真实的代码,但它是用swift编写的。谢谢,创建更高版本,使函数能够完美工作,出于某种原因,我认为有理由不这样做(尽管我不知道原因是什么。)不,这样做被称为声明实例变量。这样,您可以访问所有函数和子类中的特定变量。好的,在类中创建节点并使用函数将其添加到场景中是可以接受的做法?出于某种原因,我觉得这样做很草率,但我愿意。谢谢s、 假设方法A将其添加到视图中,那么A将(逻辑上)添加到视图中需要首先调用节点才能在屏幕上显示该节点。但每次修改该节点时,该更改都将被保存。因此A将节点移动到y=10。然后方法B在y=10的节点上执行该操作。明白我的意思吗?哦,如果您使用我的解决方案,请确保为我提供积分;)
class myClass {
    //declare node here
    func doStuff() {}
}