我正在用SpriteKit做一个平台游戏。我想达到这样的效果:只有玩家周围的区域是亮的,其他一切都会变暗。想象一个像假光源或一个强大的渐晕图之类的东西。出于测试目的,我创建了以下代码:

let effect = SKEffectNode()
effect.zPosition = 100
effect.position = CGPoint(x: 0, y: 0)
effect.shouldRasterize = false
effect.blendMode = SKBlendMode.Multiply

let gray = SKSpriteNode()
gray.color = SKColor.grayColor()
gray.size = self.frame.size
gray.blendMode = SKBlendMode.Multiply
gray.position = CGPoint(x: 0, y: 0)

let shine = SKSpriteNode(imageNamed: "Shine")
shine.position = CGPoint(x: 0, y: 0)
shine.blendMode = SKBlendMode.Screen
shine.setScale(3.0)

effect.addChild(gray)
effect.addChild(shine)

self.world.addChild(effect)

这按预期工作,但对帧速率有一定的显著影响。考虑到在地图上可能会有像火炬或其他光源那样的附加效果,我预计帧速率会下降得更多。
接下来,我想让灯光闪烁,所以我在update函数中为shine sprite分配了一个随机的alpha值。这真的扼杀了帧率,让它立即下降到约4帧。
我已经了解了SKEffectNodes及其对帧速率的严重影响。有没有其他方法可以实现这种全屏alpha混合,即使有多个“灯光”也相当快?
任何建议都是非常感谢的。

最佳答案

也许可以用一个SKLightNode来解决这个问题吗?
https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKLightNode_Ref/index.html
下面是一篇关于如何使用SKLightNode的文章:
http://www.ymc.ch/en/playing-with-ios-8-sprite-kit-and-sklightnode
希望这对你有用

09-25 16:19