Swift 4 SpriteKit:如何避免父节点的.alpha属性影响子节点?
解决SpriteKit父节点Alpha影响子节点的问题
这个问题我之前做SpriteKit游戏时也踩过坑——父节点的alpha属性会被子节点继承,导致调整背景Sprite的透明度时,上面的标签也跟着变透明。要实现背景alpha=0.5、标签alpha=0.9的效果,有两种简单实用的方法:
方法一:解除父子关系,共用同一个父节点
既然父节点的alpha会传递给子节点,那干脆不让标签成为背景Sprite的子节点,把两者都加到同一个父容器(比如当前场景或者一个空的SKNode)里,这样它们的透明度就完全独立了。
示例代码:
// 创建背景Sprite let backgroundSprite = SKSpriteNode(color: .black, size: CGSize(width: 200, height: 50)) backgroundSprite.alpha = 0.5 // 背景透明度设为0.5 backgroundSprite.position = CGPoint(x: self.size.width/2, y: self.size.height/2) self.addChild(backgroundSprite) // 加到场景 // 创建文本标签 let textLabel = SKLabelNode(text: "Hello World") textLabel.fontSize = 20 textLabel.fontColor = .white textLabel.alpha = 0.9 // 标签透明度设为0.9 textLabel.position = backgroundSprite.position // 和背景位置重合 self.addChild(textLabel) // 同样加到场景
这样调整两者的alpha时,互相不会有任何影响,还能通过统一调整父容器的位置来同时移动它们。
方法二:给背景Sprite用带透明度的颜色,而非修改alpha
如果想保持父子关系(方便统一管理位置、缩放等),可以不用修改背景Sprite的alpha,而是直接给它的颜色设置带透明度的值,同时让背景Sprite的alpha保持为1。这样子节点的alpha就不会被继承影响了。
示例代码:
// 创建背景Sprite,用带透明度的颜色,alpha保持1 let backgroundSprite = SKSpriteNode(color: UIColor(white: 0, alpha: 0.5), size: CGSize(width: 200, height: 50)) backgroundSprite.alpha = 1 // 关键:不要改这个值 backgroundSprite.position = CGPoint(x: self.size.width/2, y: self.size.height/2) self.addChild(backgroundSprite) // 创建文本标签作为子节点,设置自己的alpha let textLabel = SKLabelNode(text: "Hello World") textLabel.fontSize = 20 textLabel.fontColor = .white textLabel.alpha = 0.9 // 标签透明度不受父节点影响 textLabel.position = .zero // 相对于背景居中 backgroundSprite.addChild(textLabel)
这种方法的好处是,背景和标签还是父子关系,你移动背景Sprite时,标签会自动跟着移动,不用单独调整位置。
两种方法都能解决你的问题,看你更需要哪种管理方式啦~
内容的提问来源于stack exchange,提问作者Paul Mayer
相关产品推荐
相关产品推荐

