Как создать эффект мерцания с помощью SKEmitterNode?

Я использовал эмиттер частиц, чтобы создать фон со звездами. Выглядит нормально, но я бы хотел, чтобы они мигали или мерцали. Самое близкое, что я получаю, это когда я изменяю переменные birthrate и lifetime так, чтобы частицы исчезали и появлялись в разных местах. Я хотел бы, чтобы частицы оставались в одном и том же месте и исчезали и появлялись случайным образом. Есть идеи, как это сделать? Это то, что у меня есть до сих пор:

введите здесь описание изображения


person Mark Tornej    schedule 03.01.2020    source источник


Ответы (1)


Я не думаю, что вы можете многое сделать прямо в редакторе. Если вам удобно работать с кодом для настройки эмиттера, у вас есть несколько возможностей: установка действия частицы для анимации цвета, альфа-канала, масштаба или текстуры, или настраиваемый шейдер для создания любой анимации. (Я предполагаю, основываясь на вашем изображении с практически бесконечным временем жизни, что вы не хотите, чтобы что-то перемещалось или исчезало. Это может исключить ключевые кадры, но, возможно, установить последовательность ключевых кадров в режим повторения с кадрами, разделенными очень маленькими значениями. должно сработать.)

Другая возможность, поскольку позиции статичны, состоит в том, чтобы просто сделать несколько фиксированных спрайтов, разбросанных случайным образом, и заставить их запускать действия для их анимации. Мы использовали этот подход раньше с ~ 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 выше в качестве действия частицы. Я не понимаю, как вы можете изменить относительные периоды частиц, как вы могли бы с отдельными спрайтами, и единственные смещения будут исходить из различий во времени рождения частиц.

person bg2b    schedule 04.01.2020