当前位置: 首页 > 知识库问答 >
问题:

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

殷学
2023-03-14

我正在用Kotlin开发一个简单的游戏,使用LibGDX在后台播放音乐。在Android上,当用户玩游戏并按下HOME键,然后再次继续游戏时,我的暂停屏幕出现了——音乐继续播放。我想要的是,每当我的暂停屏幕显示时,音乐总是关闭。

当我开始一个新游戏时,每当我按下游戏中的“暂停”按钮,音乐就会按预期停止——然后当我点击游戏中的“继续”按钮时,音乐就会重新开始。这工作得很好。只有在按下HOME键时,我才会有问题。

我在LibGDX文档中找到了这个JavaDoc注释:https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/audio/Music.html

当应用程序暂停或恢复时,音乐实例会自动暂停和恢复。请参阅应用程序侦听器。

这不是我想要的行为,但我不知道如何阻止它。我试图在应用程序恢复时停止音乐,但这些似乎都没有产生任何影响 - 音乐总是播放。

我使用一个资产类,遵循这里的建议:libgdx:加载游戏中所有资产的最佳方式

这是我的资产类:

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

这是我的< code >游戏屏幕,当应用暂停时,我会切换到< code >暂停屏幕:

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

  • 游戏入口点简历()
  • 暂停屏幕简历()
  • 暂停屏幕显示()
  • 每当游戏从游戏屏幕暂停游戏

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

共有1个答案

能远
2023-03-14

我已经找到了几种方法来解决此问题。

这是由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()中再次打开音乐后立即关闭音乐。

    override fun create() {
        . . .
        // Don't play any music from when the app was last resumed
        assets.stopBackgroundMusic()
    }

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

 类似资料:
  • 我正在构建具有恢复/暂停功能的m4a录制的Android应用程序。可能吗?如果是,请告诉我解决方案。 谢谢

  • 在一个android应用中,我编写了一个在后台播放音乐的服务。我已经实现了来监听音频焦点的更改。问题是,在以下情况下,我没有收到对的回调。 > 在我的应用程序中播放音乐,并将应用程序放在后台。(背景不断播放音乐)。 启动youtube应用程序,播放任何视频。这将回调,在此我暂停媒体播放器。 现在我为youtube按home键(youtube停止播放)。

  • 我正在用场景构建器创建一个JavaFX应用程序。我在开头加了一段视频。所以我想播放视频之前,我的应用程序启动在全屏模式。问题是当它停止时,我只看到黑色尖叫,什么也没发生,我想这是因为视频是全屏的,它没有自动关闭。 我也有一个bug,在视频开始之前,我的主窗口的一些闪烁。我想这是因为视频放在控制器中,在我的应用程序启动后开始。 公共类主扩展应用程序{ 控制器类:

  • 我必须实现创建暂停和恢复状态音频的应用程序,当我的应用程序作为启动时,音频是启动的,当我按下模拟器上的后退按钮时,音频音乐处于暂停状态,但当我的活动从停止状态返回前台时,我的音频音乐不会恢复。这是我的密码。

  • 我想让应用程序恢复音乐当我们回到应用程序时,我尝试过使用方法,但服务中没有方法。TIA

  • 问题内容: 我声明我已阅读有关线程的内容,但从未使用过。所以我问你:) 我有两个线程:和,其中管理GUI和逻辑。 我将从开始。 然后在绘制GUI时,我将其暂停,以等待到达X点的run方法。 当到达X点进入run方法时,我暂停并继续。 并共享一些变量来管理GUI和逻辑… 我可以做吗?如果是,如何?:) 问题答案: 使用和方法: -使当前线程等待,直到另一个线程调用 该对象的方法。 -唤醒正在该对象的