android - Kotlin - 添加更多变体 - soundPool
问题描述
请帮忙。我需要在一个动作中添加 2 个声音 ogg,它会随机变化。我怎么做?我不知道该怎么做。非常感谢。
Thread(Runnable {
val assets = context.resources.assets
sounds[SOUND_DIE] = soundPool.load(assets.openFd("die.ogg"), 1)
sounds[SOUND_HIT] = soundPool.load(assets.openFd("hit.ogg"), 1)
sounds[SOUND_POINT] = soundPool.load(assets.openFd("point.ogg"), 1)
sounds[SOUND_SWOOSHING] = soundPool.load(assets.openFd("swooshing.ogg"), 1)
sounds[SOUND_WING] = soundPool.load(assets.openFd("wing.ogg"), 1)
}).start()
}
解决方案
您可以调用.random()
集合以获取随机项目。因此,与其将每种声音类型(如SOUND_HIT
)映射到一个声音,不如将每个声音类型映射到一个声音列表(如果您只有一个,则可以包含一个项目)。然后对于您加载的每个声音,只需将其添加到适当的列表中即可。
这样,当你想播放声音时,你可以去play(sounds[SOUND_SWOOSHING].random())
,它只会从该声音类型的列表中选择一个。
您可以按照现在的方式进行设置
sounds = mapOf(
SOUND_DIE to listOf(
soundPool.load(assets.openFd("die.ogg"), 1),
soundPool.load(assets.openFd("yargh.ogg"), 1)
),
SOUND_HIT to ...
)
但我建议添加一个函数来处理所有加载:
fun loadSound(filename: String) = soundPool.load(assets.openFd(filename), 1)
sounds = mapOf(
SOUND_DIE to listOf(
loadSound("die.ogg"),
loadSound("yargh.ogg")
),
SOUND_HIT to ...
)
或者如果你想变得花哨......
val filenamesToTypes = mapOf(
"die.ogg" to SOUND_DIE,
"yargh.ogg" to SOUND_DIE,
"point.ogg" to SOUND_POINT,
...
)
// build your sounds collection by grouping all the filenames
// with the same sound type, and transform each filename to a
// loaded sound, so you get a map of SoundType -> List<Sound>
sounds = filenamesToTypes.entries.groupBy(
keySelector = { it.value },
valueTransform = { loadSound(it.key) }
)
如果感觉太复杂,请不要担心,前几个示例足够简洁,希望易于理解!我只是喜欢你可以把所有的东西都组织得这么快:)
推荐阅读
- java - 如何判断服务器套接字是否不可用?
- c++ - 尝试使用递归和指向指针的指针来反转链表,但 reversell 函数没有给出预期的正确输出
- r - 如何在 R 中引用未命名的对象
- c# - 在方法工作期间无法与窗口交互 C#
- python - 在 Python 中使用 compare 和 lt 对对象列表进行排序失败
- python - 混淆矩阵sklearn错误?
- oracle - ADO.Net 目标连接器
- java - 如何从 JSON 字符串中获取每个值
- amazon-web-services - 是否可以使用 AWS Lambda 处理 HTTP 响应而不发出相应的 HTTP 请求?
- php - 如何使用相同的发票编号调用 Mysql 表中每列的不同值?