访问多个 SKShapeNodes 的属性

Accessing properties of multiple SKShapeNodes

在我的程序中,我有一个名为 addObstacle 的方法,它创建了一个带有 SKPhysicsBody 和向左速度的矩形 SKShapeNode。

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)) 时,只有一个 "obstacles" 消失了;其余的仍然完全不透明。有这样做的好方法吗?提前致谢 (:

你可能会选择:

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

可以找到有关此方法的更多信息 here

在这个例子中,我假设您已经在场景中添加了障碍物。如果不是,则代替场景,运行障碍物父节点上的此方法。

另一方面请注意...在许多情况下,SKShapeNode 不是高性能解决方案,因为它需要至少一个绘制通道才能由场景渲染(它不能像 SKSpriteNode 那样批量绘制)。如果在您的应用程序中不使用 SKShapeNode "a must",并且您可以使用 SKSpriteNode 切换它们,我强烈建议您这样做,因为性能。

如果您对所有精灵使用相同的图集和相同的混合模式,SpriteKit 可以在单个绘制通道中渲染数百个节点。 SKShapeNodes 不是这种情况。有关此 的更多信息。搜索有关此主题的 SO,其中有一些有用的帖子。