如何使用SKEmitterNode创建闪烁效果?

问题描述 投票:0回答:1

我已经使用粒子发射器创建了带有星星的背景。看起来还可以,但我希望它们闪烁或闪烁。我得到的最接近的是更改birthratelifetime变量,以使粒子消失并出现在不同的位置。我希望粒子保留在同一位置,并随机地淡入和淡出。有关如何执行此操作的任何想法?这是到目前为止我得到的:

enter image description here

sprite-kit particles skemitternode
1个回答
1
投票

我认为您不能直接在编辑器中做很多事情。如果您愿意使用用于调整发射器的代码,则有两种可能:设置粒子动作以对颜色或Alpha或比例或纹理进行动画处理,或者设置自定义着色器以执行任何类型的动画。 (我根据您的照片具有基本无限的寿命,您不希望物体移动或消失。这可能会排除关键帧,但也许将关键帧序列设置为重复模式,并且帧之间的间隔很小会工作。)

由于位置是静态的,另一种可能性是使一些固定的sprite随机地散布在周围,并让它们运行动作以对其进行动画处理。之前,我们已经在带有一堆较暗星星的背景上使用了约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作为粒子动作。我看不到如何更改粒子的相对周期,尽管可以像使用单独的sprite一样,并且唯一的偏移将来自粒子的出生时间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.