首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在LibGDX中,如何在安卓应用程序恢复后停止音乐?

在LibGDX中,如何在安卓应用程序恢复后停止音乐?
EN

Stack Overflow用户
提问于 2021-11-16 08:38:24
回答 1查看 69关注 0票数 0

我正在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

这是我的资产类别:

代码语言:javascript
复制
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()
    }
. . .
}

我的主要切入点如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

  • In resume() of PauseScreen

  • In show() of PauseScreen

  • Whenever游戏暂停了GameScreen

游戏

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-19 06:21:00

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

这是由com.badlogic.gdx.backends.android.AndroidApplication中的以下代码引起的

代码语言:javascript
复制
    @Override
    protected void onResume () {
    . . .
        this.isWaitingForAudio = true;
        if (this.wasFocusChanged == 1 || this.wasFocusChanged == -1) {
            this.audio.resume(); // <--- here !!
            this.isWaitingForAudio = false;
        }
        super.onResume();
    }

正如你所看到的,音频总是被恢复。为什么?我不知道。

因此,要解决这个问题,您可以执行以下操作之一:

将以下代码添加到AndroidLauncher中的

代码语言:javascript
复制
    override fun onResume() {
        super.onResume()
        // Work-around to prevent LibGDX from *always* restarting background music after resume
        this.audio.pause()
    }

这将关闭音乐,在super.resume()内部再次打开之后,它将直接关闭。

扩展Game的类中的

  1. 将以下代码添加到create函数的末尾

代码语言:javascript
复制
    override fun create() {
        . . .
        // Don't play any music from when the app was last resumed
        assets.stopBackgroundMusic()
    }

我仍然想知道为什么LibGDX会这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69986023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档