在 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()

我没主意了。非常感谢任何帮助或想法!

我找到了几种解决此问题的方法。

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();
    }

如您所见,音频总是 恢复。为什么?我不知道。

所以要解决它,您可以执行以下操作之一:

  1. 将以下代码添加到 AndroidLauncher:
    override fun onResume() {
        super.onResume()
        // Work-around to prevent LibGDX from *always* restarting background music after resume
        this.audio.pause()
    }

这将在 super.resume().

内再次打开音乐后立即关闭音乐
  1. 将以下代码添加到扩展 Game 的 class 中 create 函数的末尾:
    override fun create() {
        . . .
        // Don't play any music from when the app was last resumed
        assets.stopBackgroundMusic()
    }

我还是想知道为什么 LibGDX 会这样。