将 SoundPool 用于游戏
Using SoundPool for games
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 已被弃用
我有点新,所以不知道如何解决这个问题(观看了很多视频并到处搜索但我无法解决)
所以也许有人可以帮我告诉我该怎么做
当某些东西被弃用时,应该总是提示应该使用什么来代替。
所以你需要使用 SoundPool.Builder
来创建对象的新实例。
但是,如果您的目标是 SoundPool.Builder
之前发布的 API 级别,那么您将获得 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)
此外,我建议使用 my custom implementation of SoundPool,因为 Android 上不同版本的原始 SoundPool 中引入了许多平台相关问题。
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 已被弃用 我有点新,所以不知道如何解决这个问题(观看了很多视频并到处搜索但我无法解决) 所以也许有人可以帮我告诉我该怎么做
当某些东西被弃用时,应该总是提示应该使用什么来代替。
所以你需要使用 SoundPool.Builder
来创建对象的新实例。
但是,如果您的目标是 SoundPool.Builder
之前发布的 API 级别,那么您将获得 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)
此外,我建议使用 my custom implementation of SoundPool,因为 Android 上不同版本的原始 SoundPool 中引入了许多平台相关问题。