В моей игре есть объект Sounds, подобный этому:
object Sounds {
SoundFactory.setAssetBasePath("mfx/")
val EXPLOSION_0 = ESound("explosion1.ogg")
val EXPLOSION_1 = ESound("explosion2.ogg")
val EXPLOSION_2 = ESound("explosion3.ogg")
val IMPACT_0 = ESound("impact1.ogg", 0.4f)
val IMPACT_1 = ESound("impact2.ogg", 0.4f)
val IMPACT_2 = ESound("impact3.ogg", 0.4f)
val BONUS = ESound("bonus.ogg", 0.7f)
// -- snip --
def load() {
println("Sounds loaded")
}
case class ESound(sound_file: String, volume: Float = 1) {
private val sound = SoundFactory.createSoundFromAsset(AndEngine.engine.getSoundManager, AndEngine.activity.get, sound_file)
sound.setVolume(volume)
sound.setLoopCount(0)
def play() { sound.play() }
}
}
Для краткости я удалил много методов и т. Д. Но основная идея заключалась в том, что Scala лениво инициализирует объект, поэтому при первом вызове некоторого метода (load()
) для этого объекта он будет инициализирован. Это будет сделано, например, после загрузки текстуры и т. Д.
Но с помощью приведенного выше кода, когда я в первый раз нажимаю какую-то кнопку меню в моей игре, я получаю длинную паузу, поскольку только тогда она загрузит все эти звуки (вызванные SoundFactory.createSound...
в конструкторе).
Теперь, если я изменю метод load
на следующий:
println("Sounds loaded, " + BONUS.toString)
Все звуки загружаются правильно.
Итак, почему это происходит? Как и почему Scala инициализирует объект Sounds, чтобы я мог вызвать load (), но не загружает свои собственные значения в части конструктора? Каковы правила инициализации сопутствующего объекта?