libgdx 中的音乐流不起作用(JAVA)
Posted
技术标签:
【中文标题】libgdx 中的音乐流不起作用(JAVA)【英文标题】:Music streaming in libgdx doesn't work (JAVA) 【发布时间】:2014-09-15 07:31:15 【问题描述】:所以我一直在做一个libGDX项目,在这里遇到了一个问题:
public class Main extends ApplicationAdapter implements Screen
(...)
@Override
public void create()
(...)
//Starts playing Main theme Music
MusicPlayer.determineMusic(mainTheme, splash);
public void render()
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
//was:
//splash.splashRenderer(mainTheme, batch, splashSprite);
//changed to:
splash.splashRenderer(batch, splashSprite);
batch.end();
System.out.println("******************End of Render******************");
public class SplashScreen
Music gameTheme ;
public SplashScreen()
public void splashRenderer(SpriteBatch batch, Sprite splashSprite)
batch.draw(splashSprite, 0, 0, MyConstants.WINDOW_WIDTH, MyConstants.WINDOW_HEIGHT);
@Override
public void show()
//gameTheme = Gdx.audio.newMusic(Gdx.files.internal("blah.mp3"));
//gameTheme.play();
@Override
public void hide()
//gameTheme.dispose();
@Override
public void dispose()
//gameTheme.dispose();
public class MusicPlayer
protected MusicPlayer()
public static void determineMusic(Music Theme, AbstractScreen screen)
if ((screen instanceof GameScreen) == false)
Theme.play();
到目前为止的代码基本上只是加载一个音乐文件和一个精灵并通过splashRenderer方法将其绘制在屏幕上,但我的问题是音乐没有开始。 任何帮助将不胜感激。提前致谢。
EDIT1~ 我实现了 Screen,将方法更改为 splashRenderer(SpriteBatch, Sprite) 并在 show 方法中加载和播放音乐文件,并在 hide 和 dispose 方法中将其 dispose()。我没有在 pause() 方法中添加任何内容,因为我认为它是自动完成的。
EDIT2~ 我注意到这次音乐也没有开始。我想出的解决方案是创建一个新类 MusicPlayer() 来确定是否播放以及播放哪个曲目。 musicPlayer 首先在 create() 中显式调用,并在需要时可能会在处理 mouseEvents 时被调用。
请提供有关这些更改的反馈(好/坏/出于这个和那个原因要避免等)。谢谢!
【问题讨论】:
SplashScreen
似乎没有实现Screen
,这很奇怪。此外,您在 render()
函数中调用 play()
每秒大约 60 次,而不是在 Screen
中调用 show()
之类的地方,这可以解释为什么它不“启动”。
请参阅 EDIT1 & 2
【参考方案1】:
我做了以下事情:
public abstract class BaseScreen implements Screen, InputProcessor
public BaseScreen()
windowWidth = Gdx.graphics.getWidth();
windowHeight = Gdx.graphics.getHeight();
AudioManager.getScreenThemes().put(this, getScreenMusic());
public void pause()
AudioManager.pause();
public void resume()
AudioManager.play();
public void show()
Gdx.input.setInputProcessor(this);
AudioManager.switchMusic(this);
public abstract Music getScreenMusic();
...
另一个屏幕:
@Override
public Music getScreenMusic()
return Resources.soundGameTheme;
音频管理器:
static
screenThemes = new HashMap<Screen, Music>();
currentlyPlayed = null;
public static boolean getSoundEnabled()
return MyGame.getPreferences().getBoolean(Resources.soundEnabledKey);
private static Map<Screen, Music> screenThemes;
public static Music currentlyPlayed;
public static void play()
if(getSoundEnabled() != false)
if(currentlyPlayed != null)
if(currentlyPlayed.isPlaying() == false)
currentlyPlayed.play();
public static void initialize()
Resources.soundMainMenuTheme = Gdx.audio.newMusic(Gdx.files.internal("data/main_menu.mp3"));
Resources.soundGameTheme = Gdx.audio.newMusic(Gdx.files.internal("data/game.mp3"));
Resources.soundMainMenuTheme.setLooping(true);
Resources.soundGameTheme.setLooping(true);
public static void stop()
if(currentlyPlayed != null)
if(currentlyPlayed.isPlaying() == true)
currentlyPlayed.stop();
public static void pause()
if(getSoundEnabled() != false)
if(currentlyPlayed != null)
if(currentlyPlayed.isPlaying() == true)
currentlyPlayed.pause();
public static void switchMusic(Screen screen)
if(screenThemes.get(screen) != currentlyPlayed)
if(screenThemes.get(screen) != null)
stop();
currentlyPlayed = screenThemes.get(screen);
play();
public static void dispose()
Resources.soundMainMenuTheme.dispose();
Resources.soundGameTheme.dispose();
screenThemes = null;
public static Map<Screen, Music> getScreenThemes()
return screenThemes;
我承认,这不是最漂亮的东西——我应该使用像枚举这样的单例,而不是以这种方式使其成为静态。但它起作用了,虽然它基本上会在您导航到特定的Screen
时播放特定的歌曲,如果要在屏幕上播放的歌曲不同,它会更改歌曲。
编辑:
偏好:
public class MyGame extends Game
private static Preferences preferences;
@Override
public void create()
...
preferences = Gdx.app.getPreferences(Resources.preferencesName);
...
public static Preferences getPreferences()
return preferences;
【讨论】:
好吧,我真的不需要这么复杂的应用程序,因为它只会在从主菜单到游戏屏幕时改变轨道,反之亦然,相反,我想我已经做了一个简化版本你觉得呢? 听起来很合理,我还注意到我设法忘记了复制粘贴中最重要的方法调用,即BaseScreen
中的show()
函数。
哦,我真的很喜欢 if(getSoundEnabled() != false) 这句话:P
好吧,我讨厌 android 上不允许关闭声音的游戏,所以我需要将整个手机静音,以确保它不会播放愚蠢的音乐。我什至在我的手机上玩了一个游戏,即使我把手机静音也能播放音乐,这让我很生气。这应该是每场比赛的一部分。 :p以上是关于libgdx 中的音乐流不起作用(JAVA)的主要内容,如果未能解决你的问题,请参考以下文章
按钮 ClickListener 在 LibGDX 游戏中不起作用