Использование SoundPool для игр - PullRequest
0 голосов
/ 13 января 2020
class SoundPlayer(context: Context) {

// For sound FX
private val soundPool: SoundPool = SoundPool(10, // Here 
    AudioManager.STREAM_MUSIC,
    0)

companion object {
    var playerExplodeID = -1
    var invaderExplodeID = -1
    var shootID = -1
    var damageShelterID = -1
    var uhID = -1
    var ohID = -1
}

init {
    try {
        // Create objects of the 2 required classes
        val assetManager = context.assets
        var descriptor: AssetFileDescriptor


        // Load our fx in memory ready for use
        descriptor = assetManager.openFd("shoot.ogg")
        shootID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("invaderexplode.ogg")
        invaderExplodeID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("damageshelter.ogg")
        damageShelterID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("playerexplode.ogg")
        playerExplodeID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("damageshelter.ogg")
        damageShelterID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("uh.ogg")
        uhID = soundPool.load(descriptor, 0)

        descriptor = assetManager.openFd("oh.ogg")
        ohID = soundPool.load(descriptor, 0)


    } catch (e: IOException) {
        // Print an error message to the console
        Log.e("error", "failed to load sound files")
    }
}

fun playSound(id: Int){
    soundPool.play(id, 1f, 1f, 0, 0, 1f)
}
}

У меня проблема с использованием SoundPool, но он говорит, что конструктор SoundPool устарел. Я новичок, так что не знаю, как это исправить (смотрел много видео и искал везде, но я не могу это исправить), так что, возможно, кто-нибудь может помочь мне сказать мне, что делать

1 Ответ

0 голосов
/ 14 января 2020

Когда что-то устарело, всегда должен быть совет, что использовать вместо этого. Поэтому вам нужно использовать SoundPool.Builder для создания нового экземпляра объекта. Но есть одна проблема, если вы ориентируетесь на уровень API, который был выпущен до SoundPool.Builder, тогда вы получите ClassNotFoundException. Таким образом, общий подход состоит в том, чтобы проверить уровень API и сделать все по-старому до API X (когда была введена новая функция), и по-новому после API X:

@Suppress("DEPRECATION")
fun buildSoundPool(maxStreams: Int):SoundPool =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val attrs = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_GAME)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build()
        SoundPool.Builder()
            .setAudioAttributes(attrs)
            .setMaxStreams(maxStreams)
            .build()
    } else {
        SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0)
    }

Тогда:

private val soundPool: SoundPool = buildSoundPool(10)

Также я рекомендую использовать мою собственную реализацию SoundPool , потому что множество проблем, зависящих от платформы, было введено в оригинальном SoundPool в различных версиях Android.

...