2016-01-22 110 views
2

所以我对SpriteKit和Swift非常陌生,并且我不太了解节点背后的概念(或者对于这个问题,在sprite-kit中的任何东西)。我要求你向我解释节点的概念。了解SpriteKit节点的概念

我更习惯于为每个节点创建一个不同的变量实例(比如创建一个数组),这使我能够非常明确地引用任何单个节点。然而,在sprite工具包中,这似乎并不是这种情况,因为您只需创建一次,然后使用addChild调用它的多个实例即可。 (比我一直在做的更好......)

这有点让我难以想象,因为我主要不明白我如何测试一个场景或者其他东西,或者单独引用它们。例如,我试图得到一个对象从现场移除与removeFromParent(),但我不如何实现这样的:

if(enemy.position.x == 0) 
{ 
SKAction.removeFromParent() 
} 

之前,我会为循环设置一个,检查每一个敌人但这是超效率的。我想我会在物理引擎提供的更新方法中做到这一点,但就像我说我不知道​​如何调用它。

所以我的问题基本上是让你向我解释这里发生了什么的概念。假装我完全不了解这类编程知识(我几乎不知道这一点),如果你能把它分解给我,就像我五岁那样会很棒:D!

谢谢!

+2

SO不是教程网站,它是一个特定问题和答案的网站,如果你想了解SpriteKit,我建议你看看http://www.raywenderlich.com/ – Knight0fDragon

+0

@ KnightOfDragon - 我无法反驳更多。 SO是这种性质问题的理想场所。这里有大量的编码员愿意传授他们的知识。 SO需要以主要方式减仓。 – zeeple

+0

本质上,你不必跟踪每个节点(在一个数组等),因为当一个节点涉及到一些有趣的事情(碰撞,触及某事,某人用手指触摸它等)时,你的代码将被传递涉及有趣事件的节点。对于'enemy.position.x == 0'示例,可以使用enumerateChildNodeswithName来检查每个节点的位置;或者你可以设置一个碰撞检测的边界,并在敌人到达那个位置时得到通知。或者你可以继承敌人,让所有的敌人检查自己的位置等等 –

回答

2

我第一次学习SpriteKit时,遇到了类似的麻烦,它来自于使用UI *对象。

让每一个节点的场景

self.children 

或者您也可以通过//*enumerateChildNodesWithName:

为了得到一个特定节点you can reference it by name.

self.childNodeWithName("myNode") 

要在触摸位置获得一个节点

的Objective-C

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:positionInScene]; 
} 

斯威夫特

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 

    for touch: AnyObject in touches { 
     let location = (touch as UITouch).locationInNode(self) 
     if let touchedNode = self.nodeAtPoint(location) { 
      // Do something with node here. 
     } 
    } 
} 

我几乎总是给一个名称,我的节点,因为它使他们更容易跟...共事。 这也是您在使用.sks文件设计场景时真正与之互动的唯一方法。

什么帮助我看着Apples DemoBots示例项目上的按钮实现。

+0

你有没有关于海量数量节点的建议?例如,我产生了无数的敌人,但需要检查他们是否正在击中屏幕的某些部分。对此有何建议? – MarshallD

+0

如果你知道这些位置,所有你需要做的就是使用像这样的东西self.scene.nodesAtPoint(位置) –

+0

这个想法是,当一个精灵确实击中'屏幕的某些部分'时,你的代码被通知接触并且还涉及到哪个精灵。 –