2017-05-14 71 views
0

我们正在开发一个使用libgdx的游戏,我们希望能够切换屏幕。 我已经做了GameOverScreen,它实现屏幕:切换屏幕(libgdx) - 实现应用程序监听器的游戏类

public class GameOverScreen implements Screen { 
} 

我的问题是,我不知道如何设置屏幕在我的主类。我看过的大多数例子展示了一个扩展Game的主类(com.badlogic.gdx.Game)。但是,我们的主类实现ApplicationListener并没有扩展游戏:

public class Game implements ApplicationListener { 
} 

因此我不能从游戏类使用setScreen方法。那么我怎样才能改变我的主类游戏中的屏幕?

+0

我也一样com.baclogic.gdx.Game完成。我在这里找到了一个例子:http://stackoverflow.com/a/41818768/7061548和这里:http://book2s.com/java/src/package/com/badlogic/gdx/game.html – qwerty

回答

1

com.badlogic.gdx.Game不做其他事情,但也实现ApplicationListener。有一些简单的选择:

  • 所以你可以只延长,而不是实现ApplicationListener

  • 一样做com.badlogic.gdx.Game确实com.badlogic.gdx.Game。例如:

    public void setScreen (Screen screen) { 
        if (this.screen != null) this.screen.hide(); 
        this.screen = screen; 
        if (this.screen != null) { 
         this.screen.show(); 
         this.screen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
        } 
    } 
    
  • 使用合成/适配器:在您的ApplicationListener实现类创建com.badlogic.gdx.Game的领域,并委派你实现的方法。

1
  • 所有Game首先是预定义类为自己的实现,因此使用不同的类名称,而不是Game

  • com.badlogic.gdx.Game无非是ApplicationListener,它只有Screen所以有setScreen()方法的参考。

  • 使用Game扩展您的Main(origin)类而不是编写自己的实现,因为您需要在游戏中转换Screen

SE的一些规则:

  • 从来不写相同的代码两次。

  • 如果您已经敲击了锤子,请勿用手砸破砖块。

0

主要需要3类

  • 的ScreenManager类
  • 摘要Screen类(可选)
  • ScreenEnum(枚举)

播放屏幕和主菜单画面从抽象屏幕扩展。 屏幕管理根据从screenenum屏幕代码

****屏幕枚举类****切换屏幕

public enum ScreenEnum { 
    MAIN_MENU { 

     public AbstractScreen getScreen(Object... params) { 
      return new MainMenuScreen(); 
     } 
    }, 
    PLAY { 

     public AbstractScreen getScreen(Object... params) { 
      return new PlayScreen(); 
     } 
    }; 
    public abstract AbstractScreen getScreen(Object... params); 
} 

屏幕管理类

public class ScreenManager { 

    private static ScreenManager instance; 

    private Game game; 

    private ScreenManager() { 
     super(); 
    } 

    public static ScreenManager getInstance() { 
     if (instance == null) { 
      instance = new ScreenManager(); 
     } 
     return instance; 
    } 
    public void initialize(Game game) { 
     this.game = game; 
    } 
    public void showScreen(ScreenEnum screenEnum, Object... params) { 
     Screen currentScreen = game.getScreen(); 

     AbstractScreen newScreen = screenEnum.getScreen(params); 

     newScreen.buildStage(); 
     game.setScreen(newScreen); 

     // Dispose previous screen 
     if (currentScreen != null) { 
      currentScreen.dispose(); 
     } 
    } 
} 

AbstarctScreen类(可选类)

public abstract class AbstractScreen implements Screen { 

    protected AbstractScreen() { 
     super(); 
    } 
    public abstract void buildStage(); 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    } 

    @Override 
    public void show() { 

    } 
    @Override 
    public void resize(int width, int height){ 
    } 

    @Override public void hide() {} 
    @Override public void pause() {} 
    @Override public void resume() {} 
} 

屏幕切换

ScreenManager.getInstance().showScreen(ScreenEnum.PLAY, 0); 

ScreenManager.getInstance().showScreen(ScreenEnum.MAIN_MENU, 0);