访问多个SKShapeNodes的属性

时间:2015-08-07 20:22:43

标签: swift sprite-kit alpha skaction skshapenode

在我的程序中,我有一个名为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))时,只有一个"障碍"淡去;其余的仍然完全不透明。有这样做的好方法吗?提前致谢(:

1 个答案:

答案 0 :(得分:1)

你可以选择:

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

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

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

并且一方面注意......在许多情况下,SKShapeNode不是高性能解决方案,因为它需要场景渲染至少一个绘制过程(它不能像SKSpriteNode那样分批绘制)。如果在您的应用中使用SKShapeNode不是“必须”,并且您可以使用SKSpriteNode切换它们,我会热烈建议您这样做是因为性能。

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