在我的程序中,我有一个名为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))
时,只有一个"障碍"淡去;其余的仍然完全不透明。有这样做的好方法吗?提前致谢(:
答案 0 :(得分:1)
你可以选择:
self.enumerateChildNodesWithName("obstacleNode", usingBlock: {
node, stop in
//do your stuff
})
可以找到有关此方法的更多信息here。
在这个例子中,我假设你已经为场景添加了障碍物。如果没有,则代替场景,在障碍物的父节点上运行此方法。
并且一方面注意......在许多情况下,SKShapeNode不是高性能解决方案,因为它需要场景渲染至少一个绘制过程(它不能像SKSpriteNode那样分批绘制)。如果在您的应用中使用SKShapeNode不是“必须”,并且您可以使用SKSpriteNode切换它们,我会热烈建议您这样做是因为性能。
如果您对所有精灵使用相同的图集和相同的混合模式,SpriteKit可以在单个绘制过程中渲染数百个节点。 SKShapeNodes不是这种情况。有关此here的更多信息。搜索关于这个主题的SO,有关于这一切的一些有用的帖子。