【问题标题】:Understanding the concept of SpriteKit Nodes理解 SpriteKit 节点的概念
【发布时间】:2016-01-22 00:25:41
【问题描述】:

所以我对 SpriteKit 和 Swift 非常陌生,而且我并不真正了解节点背后的概念(或者实际上是 sprite-kit 中的任何内容)。我请求您向我解释节点的概念。

我更习惯于为每个节点使用不同的变量实例(例如创建一个数组),这允许我非常具体地引用任何单个节点。然而,在 sprite kit 中,情况似乎并非如此,因为您只需制作一次并使用 addChild 调用它的多个实例。 (比我一直在做的要好得多......)

这有点让我吃惊,因为我主要不明白如何为这些测试场景或其他东西,或者单独参考一个。例如,我正在尝试使用removeFromParent() 将对象从场景中移除,但我不知道如何实现:

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

在我设置一个检查每个敌人的 for 循环之前,但这非常低效。我想我会在物理引擎提供的更新方法中这样做,但就像我说的我不知道如何调用它。

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

谢谢!

【问题讨论】:

  • SO 不是一个教程网站,它是一个特定问题和答案的网站,如果你想了解 SpriteKit,我建议你看看像raywenderlich.com这样的教程网站
  • @KnightOfDragon - 我不能再不同意了。 SO 是解决此类问题的理想场所。这里有一个庞大的程序员社区,他们愿意传授他们的知识。 SO 需要大幅减轻压力。
  • 基本上你不必跟踪每个节点(在数组等中),因为当一个节点涉及到一些有趣的事情时(碰撞,它接触到一些东西,有人用他们的手指触摸它等等) 您的代码将被传递给感兴趣的事件所涉及的节点。对于您的 'enemy.position.x == 0' 示例,您可以使用 enumerateChildNodeswithName 检查每个节点的位置;或者你可以设置一个带有碰撞检测的边界,并在敌人到达那个位置时得到通知。或者你可以子类化敌人,让所有敌人检查自己的位置等

标签: xcode swift sprite-kit skspritenode skphysicsbody


【解决方案1】:

我在第一次学习 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 示例项目上的按钮实现。

【讨论】:

  • 您对海量节点有什么建议吗?例如,我正在生成无限数量的敌人,但需要检查它们是否击中了屏幕的某些部分。有什么建议吗?
  • 如果你知道这些位置,你需要做的就是使用类似这样的 self.scene.nodesAtPoint(location)
  • 这个想法是,当一个精灵确实点击“屏幕的某些部分”时,您的代码会收到有关联系人以及涉及哪个精灵的通知。
猜你喜欢
  • 2014-09-13
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多