私のゲームには、次のような 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() を呼び出すことができますが、コンストラクター部分で独自の値をロードしませんか? コンパニオン オブジェクトの初期化の規則は何ですか?