libgdx中的音乐流不';t工作(JAVA)
所以我一直在做一个libGDX项目,我在这里遇到了一个问题:libgdx中的音乐流不';t工作(JAVA),java,libgdx,audio-streaming,background-music,Java,Libgdx,Audio Streaming,Background Music,所以我一直在做一个libGDX项目,我在这里遇到了一个问题: public class Main extends ApplicationAdapter implements Screen { (...) @Override public void create() { (...) //Starts playing Main theme Music MusicPlayer.determineMusic(mainTheme, splash); } public voi
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方法中对其进行处理()。我没有向pause()方法添加任何内容,因为我认为它是自动完成的
EDIT2~我注意到这次音乐也没有开始。我提出的解决方案是创建一个新类MusicPlayer(),它将决定是否播放以及播放哪个曲目。MusicLayer首先在create()中显式调用,并在需要时(可能是在处理MouseeEvents时)调用
请提供关于这些变更的反馈(好/坏/由于这个和那个原因需要避免)。谢谢 我做了以下工作:
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;
}
SplashScreen
似乎没有实现Screen
,这很奇怪。另外,当您在render()
函数中调用play()
时,您每秒调用play()
大约60次,而不是在屏幕中调用show()
,这将解释为什么它不会“启动”.请参见EDIT1和2嗯,是的,我真的不需要这么复杂的应用程序,因为它只会在从主菜单转到游戏屏幕时改变轨迹,反之亦然,相反,我认为我已经制作了一个简化版本。你认为呢?听起来很合理,我还注意到我忘记了复制粘贴中最重要的方法调用,那就是BaseScreen
中的show()
函数,所以我需要让我的整个手机静音,以确保它不会播放愚蠢的音乐。我甚至在手机上玩过一个游戏,在手机静音的情况下播放音乐,这让我很生气。这应该成为每一场比赛的一部分P
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;
}
}