因此,我一直在从事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] 删除。
我来说两句