Swift 2.x:在节点树中搜索多个命中

时间:2016-06-18 13:05:51

标签: ios swift sprite-kit subscript sknode

我想在我的SKScene类中搜索以“spaceship”开头的childNodes。基本上我有几个名为“spaceship1”,“spaceship2”,“spaceship3”等的太空船节点......

但是我没有正确的语法。这样:

self.subscript("spaceship[0-9]")

结果:

 Expected ',' separator

而且:

self.objectForKeyedSubscript("spaceship[0-9]")

结果:

'objectForKeyedSubscript' is unavailable: use subscripting

2 个答案:

答案 0 :(得分:2)

除了分配"spaceship" + counter等标签外,还有一个更好的解决方法。

宇宙飞船课程

是的,出于多种原因,您应该创建一个Spaceship类,如此

class Spaceship: SKSpriteNode {

    init() {
        let texture = SKTexture(imageNamed: "spaceship")
        super.init(texture: texture, color: .clearColor(), size: texture.size())
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

检索所有宇宙飞船

class GameScene:SKScene {
    var spaceships: [Spaceship] {
        return self.children.flatMap { $0 as? Spaceship }
    }
}

为什么自定义类优于“编号标记”

有几个原因

  1. 你不会为每个应该像Spaceship一样的新sprite分配一个新的tag-with-counter值。
  2. 您可以向太空船实体添加行为,只需向Spaceship类添加方法即可。
  3. 如果您错误地将另一个节点用作太空船,编译器将阻止您
  4. 您的代码更清晰

答案 1 :(得分:1)

这是在Swift中使用Strings的一个非常方便的参考。 http://useyourloaf.com/blog/swift-string-cheat-sheet/

根据该网站

let spaceshipString = "spaceship1"
spaceshipString.hasPrefix("spaceship")    // true
spaceshipString.hasSuffix("1")    // true

考虑到这一点,您可以通过以下方式枚举所有节点以找到具有太空飞船的节点。

 func findSpaceShipNodes() {
    self.enumerateChildNodesWithName("//*") {
        node, stop in
            if (( node.name?.hasSuffix("spaceship") ) != nil) {
              // Code for these nodes in here //
            }
    }
}