在不同的函数中添加/删除 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() {}
}
希望对您有所帮助:)
我是 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() {}
}
希望对您有所帮助:)