我很快乐,似乎无法掌握这个概念: 我需要在一个函数中创建一个SKSpriteNode,然后在另一个函数中删除它,我无法完全知道如何对它进行编码,以便remove函数可以访问在另一个函数中创建的元素。情况:创建加电节点并在屏幕上显示。英雄收集电源,并在屏幕底部添加一个图标。然后,播放器可以触摸加电图标以使用它,然后应该从屏幕上移除图标。 我将尝试在下面的代码中说明我的意思。
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,这将使两种方法都能访问加电图标。但这是一个好习惯吗?
答案 0 :(得分:0)
有多种方法可以做到这一点。如您所述,您可以在更高级别定义变量,以使其可供所有函数访问。您也可以在课程的扩展中声明它。例如,您可以在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(实例变量)的实践的问题,它绝对是常见且被接受的实践。他们有这样的功能是有原因的:)
答案 1 :(得分:0)
目前,您在方法中创建了SKSpriteNode
,只允许该特定方法访问该方法。
您可以通过不同的方式分享SKSpriteNode
,例如返回它并调用其他方法并将其传递给Node,但最简单的方法是在方法之外创建。所以,就在你的类声明下面如下所示:
class myClass {
//declare node here
func doStuff() {}
}
希望有所帮助:)