簡體   English   中英

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

[英]Music streaming in libgdx doesn't work (JAVA)

因此,我一直在從事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(),該類將確定是否播放以及播放哪個曲目。 首先在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;
}

AudioManager:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM