You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX开发Android游戏,应用恢复时如何停止自动播放的背景音乐?

问题根源

你之前调用stopBackgroundMusic()无效的核心原因是:LibGDX Android后端的Music自动恢复逻辑,执行时机晚于你在resume()/show()方法中的同步调用。你刚主动停止音乐,LibGDX的内置逻辑又自动将音乐恢复为暂停前的播放状态,所以看起来调用没有生效。

解决方案

你可以通过延迟执行停止音乐的逻辑,等LibGDX的内置自动恢复流程跑完后再操作,即可解决问题。以下是可直接落地的修改方案:

方案1:通过当前Screen类型判断(无需额外维护状态)

修改游戏主入口GameEntrypoint类,重写resume方法:

class GameEntrypoint : Game(), ScreenSwitcher {
    private val assets = Assets()
    // 原有create等方法逻辑不变

    override fun resume() {
        super.resume()
        // 将停止音乐的任务提交到渲染队列,等待LibGDX内置恢复逻辑执行完成后再运行
        Gdx.app.postRunnable {
            // 判断当前显示的页面是否是暂停页
            if (screen is PauseScreen) {
                assets.stopBackgroundMusic()
            }
        }
    }
}

方案2:通过状态标记判断(适合多场景控制)

如果你的暂停状态不只有PauseScreen一种场景,可以额外加状态标记控制:

  1. 先在GameEntrypoint新增状态标记:
class GameEntrypoint : Game(), ScreenSwitcher {
    private val assets = Assets()
    // 新增:标记是否处于暂停状态
    var isGamePaused = false
    // 原有逻辑不变

    override fun resume() {
        super.resume()
        Gdx.app.postRunnable {
            if (isGamePaused) {
                assets.stopBackgroundMusic()
            }
        }
    }
}
  1. 在切到暂停页的逻辑里更新标记:
private fun pauseTheGame() {
    assets.stopBackgroundMusic()
    penguinGame.pauseGame()
    // 更新暂停标记
    (screenSwitcher as GameEntrypoint).isGamePaused = true
    screenSwitcher.setScreen(pauseScreen)
}
  1. 在恢复游戏、退出暂停页的逻辑里重置标记:
// PauseScreen中恢复按钮的点击逻辑
fun onResumeClick() {
    (screenSwitcher as GameEntrypoint).isGamePaused = false
    assets.startBackgroundMusic()
    // 切回游戏页的原有逻辑
    screenSwitcher.setScreen(gameScreen)
}

// 如果有从暂停页返回主菜单的逻辑,也要同步重置标记
fun onBackToMenuClick() {
    (screenSwitcher as GameEntrypoint).isGamePaused = false
    // 原有返回主菜单逻辑
}

内容的提问来源于stack exchange,提问作者Steve Moseley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:03