我正在Kotlin开发一个简单的游戏,使用LibGDX在后台播放音乐。在Android上,当用户在玩游戏时按下“主页”按钮,然后再继续游戏,我的暂停屏幕就会出现--音乐也会恢复。我想要的是,每当我的暂停屏幕被显示时,音乐总是关闭的。
当我启动一个新游戏时,每当我按下游戏中的“暂停”按钮,音乐就会按预期停止,然后一旦我点击游戏中的“恢复”按钮,音乐就会再次启动。效果很好。只有当我按下主页按钮时,我才会有问题。
我在JavaDoc的LibGDX doc:https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/audio/Music.html中找到了这个注释
当应用程序暂停或恢复时,
音乐实例将自动暂停和恢复。见ApplicationListener。
这不是我想要的行为,但我想不出怎么阻止它。当应用程序恢复时,我试着停止播放音乐,但这些似乎都没有效果--音乐总是在播放。
我使用的是一个资产类,如下所示:libgdx: best way to load all assets in the game
这是我的资产类别:
class Assets {
. . .
private val manager = AssetManager()
lateinit var backgroundMusic: Music
. . .
fun load() {
manager.load(BACKGROUND_MUSIC_FILENAME, Music::class.java)
}
fun finishLoading() {
// Wait for all loading to finish
manager.finishLoading()
. . .
backgroundMusic = manager.get(BACKGROUND_MUSIC_FILENAME)
}
fun startBackgroundMusic() {
if (Preferences.musicEnabled) {
backgroundMusic.isLooping = true
backgroundMusic.volume = 1f
backgroundMusic.play()
}
}
fun stopBackgroundMusic() {
backgroundMusic.stop()
}
. . .
}我的主要切入点如下:
class GameEntrypoint : Game(), ScreenSwitcher {
private val assets = Assets()
override fun create() {
// Start loading assets
assets.load()
// Wait until all assets have loaded
assets.finishLoading()
. . .
mainMenuScreen = MainMenuScreen(assets, this, this.penguinGame)
setScreen(mainMenuScreen)
}下面是我的GameScreen,当应用程序暂停时,我切换到PauseScreen:
class GameScreen(private val assets: Assets, private val screenSwitcher: ScreenSwitcher, . . .) : Screen,
InputProcessor {
init {
. . .
val btnPause = ImageButton(TextureRegionDrawable(assets.imagesTextureAtlas.findRegion(Assets.BUTTON_PAUSE_REGION)))
Gui.addClickListener(btnPause) {
// Pause button clicked - pause the game then show pause screen
pauseTheGame()
}
. . .
}
private fun pauseTheGame() {
assets.stopBackgroundMusic()
penguinGame.pauseGame()
screenSwitcher.setScreen(pauseScreen)
}
. . .
}我试过在这些地方给assets.stopBackgroundMusic()打电话:
GameEntrypoint
resume() of PauseScreen
show() of PauseScreen
GameScreen游戏
我没有主意了。任何帮助或想法都非常感谢!
发布于 2021-11-19 06:21:00
我找到了解决这个问题的几种方法。
这是由com.badlogic.gdx.backends.android.AndroidApplication中的以下代码引起的
@Override
protected void onResume () {
. . .
this.isWaitingForAudio = true;
if (this.wasFocusChanged == 1 || this.wasFocusChanged == -1) {
this.audio.resume(); // <--- here !!
this.isWaitingForAudio = false;
}
super.onResume();
}正如你所看到的,音频总是被恢复。为什么?我不知道。
因此,要解决这个问题,您可以执行以下操作之一:
将以下代码添加到AndroidLauncher中的
override fun onResume() {
super.onResume()
// Work-around to prevent LibGDX from *always* restarting background music after resume
this.audio.pause()
}这将关闭音乐,在super.resume()内部再次打开之后,它将直接关闭。
扩展Game的类中的
create函数的末尾 override fun create() {
. . .
// Don't play any music from when the app was last resumed
assets.stopBackgroundMusic()
}我仍然想知道为什么LibGDX会这样做。
https://stackoverflow.com/questions/69986023
复制相似问题