2015-01-10 2 views
4

У меня есть SKNode с количеством дочерних SKSpriteNodes. Упрощенный пример:Проникните всех детей SKNode?

var parentNode = SKNode() 
var childNode1 = SKSpriteNode() 
var childNode2 = SKSpriteNode() 

self.addChild(parentNode) 
parentNode.addChild(childNode1) 
parentNode.addChild(childNode2) 

Я хочу, чтобы запустить colorizeWithColor действие на всех этих детей. Когда я запускаю действие на parentNode, эффекта нет.

Я не могу использовать enumerateChildNodesWithName для родителя, потому что у многих его детей уже есть имена, которые я использую.

Есть ли способ обхода всех детей parentNode, чтобы запустить одно действие для всех из них?

+0

Оказалось, что родной. Детский звонок непригоден для обычных ситуаций. Вы должны просто сохранить свой собственный список. (Как будто 2017.) – Fattie

ответ

17

Вы можете просто перечислить parentNode.children:

for child in parentNode.children as! [SKNode] { 
    // ... 
} 

При необходимости проверить каждый ребенок, если это на самом деле SKSpriteNode:

for child in parentNode.children { 
    if let spriteNode = child as? SKSpriteNode { 
     // ... 
    } 
} 

По Swift 2 (Xcode 7), перечисления и факультативный литой можно комбинировать с контуром с контуром:

for case let child as SKSpriteNode in parentNode.children { 
    // ... 
} 
1

Вы можете получить массив дочерних элементов, обратившись к родительскому children -трибуту, а затем переверните их и запустите на нем colorizeWithColor.

let children = parentNode.children 
for child in children { 
    // Do something. 
} 
1

По состоянию на 2017 год ..

код действительно просто

for case let child as SKSpriteNode in parentNode.children { 
    // ... 
} 

Но.

Производительность невероятно плохая: ее нельзя использовать.

Вам необходимо будет сохранить свой собственный список.

Естественно, если вы создаете несколько «танков» или «космический корабль», вы, естественно, сохраните их в списке. Это единственный жизнеспособный подход, если вам нужно итерации.

Я побежал некоторый тестовый код, как это ...

// try Apple's native .children call... 

    for case let s as SomeSpriteClass in children { k += 1 } 
    let t1 = a.microseconds() 

    // simply use your own list... 

    let b = Date() 
    for s in spaceships { k += 1 } 
    let t2 = b.microseconds() 

    print("\(t1) \(t2)") 

это 3 или 4 раза быстрее, если вы просто перебрать свой список.

Типичный выход на IPad ...

939 43 
140 33 
127 33 
117 37 
109 30 
126 33 
127 33 
109 29 
96 30 
96 29 
99 30 
97 30 
97 30 

(В частности, как и следовало ожидать, встроенный в перечисление принимает навсегда «первый» время.)

Учитывая производительность , на практике необходимо сохранить свой собственный список спрайтов и пробежать его.