访问多个 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,其中有一些有用的帖子。
在我的程序中,我有一个名为 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 不是这种情况。有关此