在不同的函数

时间:2015-05-04 21:08:03

标签: ios swift sprite-kit

我很快乐,似乎无法掌握这个概念: 我需要在一个函数中创建一个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,这将使两种方法都能访问加电图标。但这是一个好习惯吗?

2 个答案:

答案 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() {}
}

希望有所帮助:)