2015-05-04 13 views
0

我对swift很陌生,似乎无法理解这个概念: 我需要在一个函数中创建一个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创建SKSpriteNode()?我知道我可以在更高级别上定义SKSpriteNode,这样可以使两种方法都可以访问加电图标。但这是一种好的做法吗?

回答

0

有多种方法可以做到这一点。正如你所说的,你可以在更高层次上定义变量,以使其可以访问所有功能。你也可以在你的课程的扩展中声明它。例如,你可以在你的文件迅速下(虽然我习惯于在Objective-C用这个,我不知道这是否是最适合你的情况下):

extension MyScene 
{ 
    var SKSpriteNode *myNode; 
} 

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

您可以根据您的规格选择两种方法之一。如果你在各种其他功能中使用它,宣布伊娃可能是一个更好的选择。如果您描述的功能完整,那么使用该名称可能是更好的选择。至于你对声明ivars(实例变量)的做法的问题,它绝对是普遍和被接受的做法。他们有功能的原因:)

+0

您的代码没有任何意义:d – LinusGeffarth

+0

我才意识到他是用快捷。应该可能更新我的答案哈。 – Andriko13

+0

你使用Swift吗?因为这仍然看起来相当不对... – LinusGeffarth

0

目前,你创建SKSpriteNode在一个方法,使其只能访问该方法。

有可以共享SKSpriteNode不同的方式好像回到它并调用其他方法,并把它的节点,但最简单的将是的方法之外创建它。所以,下方喜欢你的类声明显示:

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

希望帮助:)

+0

好的,在类中创建节点并使用函数将其添加到场景中是可接受的做法吗?出于某种原因,我觉得这样做很sl but,但我会努力的。谢谢。 –

+0

假设方法** A **将其添加到视图中,那么需要首先调用** A **以使Node出现在屏幕上。但是每次修改节点时都会保存更改。所以** A **将节点移动到y = 10。然后方法** B **将它填充到y = 10的节点上。明白我的意思吗?哦,如果你用我的解决方案,请确保给我信贷;) – LinusGeffarth