Доступ к свойствам нескольких SKShapeNodes

В моей программе есть метод addObstacle, который создает прямоугольный SKShapeNode с SKPhysicsBody и скоростью влево.

func addObstacle(bottom: CGFloat, top: CGFloat, width: CGFloat){
    let obstacleRect = CGRectMake(self.size.width + 100, bottom, width, (top - bottom))
    let obstacle = SKShapeNode(rect: obstacleRect)
    obstacle.name = "obstacleNode"
    obstacle.fillColor = UIColor.grayColor()
    obstacle.physicsBody = SKPhysicsBody(edgeLoopFromPath: obstacle.path!)
    obstacle.physicsBody?.dynamic = false
    obstacle.physicsBody?.affectedByGravity = false
    obstacle.physicsBody?.contactTestBitMask = PhysicsCatagory.Ball
    obstacle.physicsBody?.categoryBitMask = PhysicsCatagory.Obstacle
    obstacle.physicsBody?.usesPreciseCollisionDetection = true   
    self.addChild(obstacle)
    obstacle.runAction(SKAction.moveBy(obstacleVector, duration: obstacleSpeed))
}

В отдельном методе, называемом endGame, я хочу скрыть все препятствия, существующие в данный момент на экране. Все объекты-препятствия являются приватными, что затрудняет доступ к их свойствам. Если на экране есть только один, я обычно могу получить к нему доступ по его имени. Однако, когда я говорю childNodeWithName("obstacleNode")?.runAction(SKAction.fadeAlphaBy(-1.0, duration: 1.0)), исчезает только одно из "препятствий"; остальные остаются совершенно непрозрачными. Есть ли хороший способ сделать это? Заранее спасибо (:


person Lahav    schedule 07.08.2015    source источник


Ответы (1)


Вероятно, вы могли бы пойти с:

self.enumerateChildNodesWithName("obstacleNode", usingBlock: {
    node, stop in 
    //do your stuff
})

Подробнее об этом методе можно узнать по адресу здесь.

В этом примере я предположил, что вы добавили в сцену препятствия. Если нет, то вместо сцены запустите этот метод на родительском узле препятствия.

И еще одно примечание... SKShapeNode во многих случаях не является эффективным решением, потому что для его рендеринга сценой требуется хотя бы один проход отрисовки (он не может быть отрисован в пакетном режиме, как SKSpriteNode). Если использование SKShapeNode не является «обязательным» в вашем приложении, и вы можете переключать их с помощью SKSpriteNode, я настоятельно рекомендую вам сделать это из-за производительности.

SpriteKit может отображать сотни узлов за один проход отрисовки, если вы используете один и тот же атлас и один и тот же режим наложения для всех спрайтов. Это не относится к SKShapeNodes. Подробнее об этом здесь. Ищите ТАК по этой теме, есть несколько полезных постов обо всем этом.

person Whirlwind    schedule 07.08.2015
comment
Могу ли я легко сделать SKSpriteNode из CGRect? - person Lahav; 08.08.2015
comment
Да, просто укажите цвет и размер (размер прямоугольника, который вы используете для SKShapeNode... developer.apple.com/library/ios/documentation/SpriteKit/: - person Whirlwind; 08.08.2015