如何使用 SKEmitterNode 创建闪烁效果?
How do I create a blinking effect with SKEmitterNode?
我已经使用粒子发射器创建了带有星星的背景。看起来不错,但我希望它们闪烁或闪烁。我得到的最接近的是当我更改 birthrate
和 lifetime
变量时,粒子会消失并出现在不同的地方。不过,我希望粒子留在同一个地方并随机淡入淡出。关于如何做到这一点的任何想法?这是我到目前为止所得到的:
我认为您不能直接在编辑器中做很多事情。如果您习惯于使用代码来调整发射器,那么您有两种可能性:设置粒子动作来设置颜色或 alpha 或比例或纹理的动画,或者设置自定义着色器来执行任何类型的动画。 (我假设你的图片具有基本上无限的生命周期,你不希望东西移动或消失。这可能会排除关键帧,但也许将关键帧序列设置为重复模式,帧之间的间隔非常小会工作。)
由于位置是静态的,另一种可能性是只制作一些随机散布的固定精灵,并让它们 运行 动作来激活它们。我们之前使用过这种方法,在有一堆昏暗星星的背景下使用约 100 个动画精灵,它看起来非常好。沿着这些线的东西:
let twinklePeriod = 8.0
let twinkleDuration = 0.5
let bright = CGFloat(0.3)
let dim = CGFloat(0.1)
let brighten = SKAction.fadeAlpha(to: bright, duration: 0.5 * twinkleDuration)
brighten.timingMode = .easeIn
let fade = SKAction.fadeAlpha(to: dim, duration: 0.5 * twinkleDuration)
fade.timingMode = .easeOut
let twinkle = SKAction.repeatForever(.sequence([brighten, fade, .wait(forDuration: twinklePeriod - twinkleDuration)]))
for _ in 0 ..< 100 {
let star = SKSpriteNode(imageNamed: "star")
star.position = CGPoint(x: .random(in: minX ... maxX), y: .random(in: minY ... maxY))
star.alpha = dim
star.speed = .random(in: 0.5 ... 1.5)
star.run(.sequence([.wait(forDuration: .random(in: 0 ... twinklePeriod)), twinkle]))
addChild(star)
}
这是从各种位中剪切和粘贴并简化了一些内容,因此可能有错别字,但它应该给出了思路。如果你保留发射器,你可以尝试像上面的 twinkle
这样的粒子动作。我看不出你如何改变粒子的相对周期,就像你可以使用单独的精灵一样,唯一的偏移量来自粒子出生时间的差异。
我已经使用粒子发射器创建了带有星星的背景。看起来不错,但我希望它们闪烁或闪烁。我得到的最接近的是当我更改 birthrate
和 lifetime
变量时,粒子会消失并出现在不同的地方。不过,我希望粒子留在同一个地方并随机淡入淡出。关于如何做到这一点的任何想法?这是我到目前为止所得到的:
我认为您不能直接在编辑器中做很多事情。如果您习惯于使用代码来调整发射器,那么您有两种可能性:设置粒子动作来设置颜色或 alpha 或比例或纹理的动画,或者设置自定义着色器来执行任何类型的动画。 (我假设你的图片具有基本上无限的生命周期,你不希望东西移动或消失。这可能会排除关键帧,但也许将关键帧序列设置为重复模式,帧之间的间隔非常小会工作。)
由于位置是静态的,另一种可能性是只制作一些随机散布的固定精灵,并让它们 运行 动作来激活它们。我们之前使用过这种方法,在有一堆昏暗星星的背景下使用约 100 个动画精灵,它看起来非常好。沿着这些线的东西:
let twinklePeriod = 8.0
let twinkleDuration = 0.5
let bright = CGFloat(0.3)
let dim = CGFloat(0.1)
let brighten = SKAction.fadeAlpha(to: bright, duration: 0.5 * twinkleDuration)
brighten.timingMode = .easeIn
let fade = SKAction.fadeAlpha(to: dim, duration: 0.5 * twinkleDuration)
fade.timingMode = .easeOut
let twinkle = SKAction.repeatForever(.sequence([brighten, fade, .wait(forDuration: twinklePeriod - twinkleDuration)]))
for _ in 0 ..< 100 {
let star = SKSpriteNode(imageNamed: "star")
star.position = CGPoint(x: .random(in: minX ... maxX), y: .random(in: minY ... maxY))
star.alpha = dim
star.speed = .random(in: 0.5 ... 1.5)
star.run(.sequence([.wait(forDuration: .random(in: 0 ... twinklePeriod)), twinkle]))
addChild(star)
}
这是从各种位中剪切和粘贴并简化了一些内容,因此可能有错别字,但它应该给出了思路。如果你保留发射器,你可以尝试像上面的 twinkle
这样的粒子动作。我看不出你如何改变粒子的相对周期,就像你可以使用单独的精灵一样,唯一的偏移量来自粒子出生时间的差异。