在 LibGDX 中,如何在 Android 应用恢复后停止音乐?
In LibGDX, how to stop music after Android app resumes?
我正在使用 LibGDX 在 Kotlin 中开发一个在后台播放音乐的简单游戏。在 Android,当用户正在玩游戏并按下 HOME 按钮,然后再次继续游戏时,我的暂停屏幕出现 - 音乐恢复。我想要的是每当显示暂停屏幕时音乐始终关闭。
当我开始新游戏时,每当我按下游戏中的“暂停”按钮时,音乐都会按预期停止 - 然后在我单击游戏中的“恢复”按钮后再次开始播放。那工作得很好。只有在按下 HOME 键时我才遇到问题。
我在 LibGDX 文档中找到了这个 JavaDoc 注释:
https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/audio/Music.html
Music instances are automatically paused and resumed when an Application is paused or resumed. See ApplicationListener.
这不是我想要的行为,但我不知道如何阻止它。我试图在应用程序恢复时停止音乐,但 none 似乎有任何效果 - 音乐始终播放。
我正在使用资产 class,遵循此处的建议:
这是我的资产 class:
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()
:
- 在
resume()
中 GameEntrypoint
- 在
PauseScreen
的 resume()
中
- 在
PauseScreen
的 show()
中
- 每当游戏从
GameScreen
暂停时
我没主意了。非常感谢任何帮助或想法!
我找到了几种解决此问题的方法。
由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
的 class 中 create
函数的末尾:
override fun create() {
. . .
// Don't play any music from when the app was last resumed
assets.stopBackgroundMusic()
}
我还是想知道为什么 LibGDX 会这样。
我正在使用 LibGDX 在 Kotlin 中开发一个在后台播放音乐的简单游戏。在 Android,当用户正在玩游戏并按下 HOME 按钮,然后再次继续游戏时,我的暂停屏幕出现 - 音乐恢复。我想要的是每当显示暂停屏幕时音乐始终关闭。
当我开始新游戏时,每当我按下游戏中的“暂停”按钮时,音乐都会按预期停止 - 然后在我单击游戏中的“恢复”按钮后再次开始播放。那工作得很好。只有在按下 HOME 键时我才遇到问题。
我在 LibGDX 文档中找到了这个 JavaDoc 注释: https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/audio/Music.html
Music instances are automatically paused and resumed when an Application is paused or resumed. See ApplicationListener.
这不是我想要的行为,但我不知道如何阻止它。我试图在应用程序恢复时停止音乐,但 none 似乎有任何效果 - 音乐始终播放。
我正在使用资产 class,遵循此处的建议:
这是我的资产 class:
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()
:
- 在
resume()
中GameEntrypoint
- 在
PauseScreen
的resume()
中 - 在
PauseScreen
的show()
中 - 每当游戏从
GameScreen
暂停时
我没主意了。非常感谢任何帮助或想法!
我找到了几种解决此问题的方法。
由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
的 class 中create
函数的末尾:
override fun create() {
. . .
// Don't play any music from when the app was last resumed
assets.stopBackgroundMusic()
}
我还是想知道为什么 LibGDX 会这样。