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一种场景,可以额外加状态标记控制:
- 先在GameEntrypoint新增状态标记:
class GameEntrypoint : Game(), ScreenSwitcher { private val assets = Assets() // 新增:标记是否处于暂停状态 var isGamePaused = false // 原有逻辑不变 override fun resume() { super.resume() Gdx.app.postRunnable { if (isGamePaused) { assets.stopBackgroundMusic() } } } }
- 在切到暂停页的逻辑里更新标记:
private fun pauseTheGame() { assets.stopBackgroundMusic() penguinGame.pauseGame() // 更新暂停标记 (screenSwitcher as GameEntrypoint).isGamePaused = true screenSwitcher.setScreen(pauseScreen) }
- 在恢复游戏、退出暂停页的逻辑里重置标记:
// PauseScreen中恢复按钮的点击逻辑 fun onResumeClick() { (screenSwitcher as GameEntrypoint).isGamePaused = false assets.startBackgroundMusic() // 切回游戏页的原有逻辑 screenSwitcher.setScreen(gameScreen) } // 如果有从暂停页返回主菜单的逻辑,也要同步重置标记 fun onBackToMenuClick() { (screenSwitcher as GameEntrypoint).isGamePaused = false // 原有返回主菜单逻辑 }
内容的提问来源于stack exchange,提问作者Steve Moseley
相关产品推荐
相关产品推荐

