【问题标题】:Accessing properties of multiple SKShapeNodes访问多个 SKShapeNode 的属性
【发布时间】:2015-10-31 09:21:03
【问题描述】:

在我的程序中,我有一个名为 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)) 时,只有一个“障碍”消失了;其余部分保持完全不透明。有没有这样做的好方法?在此先感谢(:

【问题讨论】:

    标签: swift sprite-kit alpha skaction skshapenode


    【解决方案1】:

    你可能会选择:

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

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

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

    还有一点要注意...SKShapeNode 在很多情况下并不是高效的解决方案,因为它需要至少一个绘制通道才能被场景渲染(它不能像 SKSpriteNode 那样批量绘制)。如果在您的应用程序中使用 SKShapeNode 不是“必须的”,并且您可以使用 SKSpriteNode 切换它们,我强烈建议您这样做,因为它的性能。

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

    【讨论】:

    猜你喜欢
    • 2020-12-29
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2013-08-10
    相关资源
    最近更新 更多