libgdx中的音乐流不起作用(JAVA)

机械师45

因此,我一直在从事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();
       }
   }

}

到目前为止,代码基本上只加载了一个音乐文件和一个sprite,并通过splashRenderer方法将其绘制在屏幕上,但是我的问题是音乐没有开始。任何帮助将不胜感激。提前致谢。

EDIT1〜我实现了Screen,将方法更改为splashRenderer(SpriteBatch,Sprite)并在show方法中加载和播放音乐文件,并在hide和dispose方法中将其dispose()。我没有将任何东西添加到pause()方法中,因为我认为它是自动完成的。

EDIT2〜我注意到这一次音乐也没有开始。我想出的解决方案是制作一个新类MusicPlayer(),该类将确定是否播放以及播放哪个曲目。首先在create()中显式调用musicPlayer,并且可能在处理mouseEvents时在需要时对其进行调用。

请提供有关这些更改的反馈(好/坏/为此应避免的原因等)。谢谢!

史诗熊猫力量

我做了以下事情:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java / Libgdx LwjglApplicationConfiguration backgroundFPS不起作用

来自分类Dev

Java流排序不起作用

来自分类Dev

LibGDX:序列不起作用

来自分类Dev

LibGDX:序列不起作用

来自分类Dev

LibGDX剪刀不起作用

来自分类Dev

Java LibGDX BitmapFont setScale方法不起作用

来自分类Dev

火花流不起作用

来自分类Dev

聚光灯在libGDX中不起作用

来自分类Dev

libgdx的文本字段中的特殊字符不起作用

来自分类Dev

滑动libgdx中的弹出窗口不起作用

来自分类Dev

Stage.addListener在libgdx中不起作用

来自分类Dev

滑动libgdx中的弹出窗口不起作用

来自分类Dev

box2dlights在libgdx中不起作用

来自分类Dev

markdown扰流器在stackoverflow中不起作用

来自分类Dev

在Flink中,流窗口似乎不起作用?

来自分类Dev

回叫在张量流中不起作用以停止训练

来自分类Dev

markdown扰流器在stackoverflow中不起作用

来自分类Dev

在Flink中,流窗口似乎不起作用?

来自分类Dev

表单输入在工作流中不起作用 (PowerShell)

来自分类Dev

几乎每个CLI音乐播放器都不起作用(在SSH终端中)

来自分类Dev

使用getResourceAsStream在Java中不起作用

来自分类Dev

暂停打印在Java中不起作用

来自分类Dev

JSplitPane中的Java JScrollPane不起作用

来自分类Dev

Sendgrid Java在Maven中不起作用

来自分类Dev

Java Scanner在处理中不起作用

来自分类Dev

Java中的列表不起作用

来自分类Dev

返回语句在Java中不起作用?

来自分类Dev

Java repaint()在调用中不起作用

来自分类Dev

线程在Java Android中不起作用