我的游戏有一个像这样的 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() 但不在构造函数部分加载它自己的值?伴随对象初始化的规则是什么?