我们正在开发一个使用libgdx的游戏,我们希望能够切换屏幕。 我制作了一个GameOverScreen,它实现了Screen:
public class GameOverScreen implements Screen {
}
我的问题是我不知道如何在我的主班设置屏幕。我看过的大多数例子都显示了一个扩展Game的主要类(com.badlogic.gdx.Game)。但是我们的主类实现了ApplicationListener并且没有扩展Game:
public class Game implements ApplicationListener {
}
因此我无法使用Game类中的setScreen方法。那么如何在我的主类游戏中更改屏幕?
答案 0 :(得分:1)
com.badlogic.gdx.Game除了实现ApplicationListener之外别无其他。有一些简单的选择:
所以你可以扩展com.badlogic.gdx.Game而不是实现ApplicationListener
与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());
}
}
使用Composition / Adapter:在ApplicationListener实现类中创建com.badlogic.gdx.Game字段并委派您实现的方法。
答案 1 :(得分:1)
首先Game
是预定义类,因此请为您自己的实现使用不同的类名而不是Game
。
com.badlogic.gdx.Game
只是ApplicationListener
,它只有Screen
的引用,因此setScreen()
方法。
使用Main(origin)
扩展您的Game
课程,而不是编写自己的实施,因为您需要在游戏中进行Screen
转换。
SE的一些规则:
永远不要写相同的代码两次。
如果已经锤击,请不要用手打破砖块。
答案 2 :(得分:0)
主要是你需要3个班级
播放屏幕和主菜单屏幕将从摘要屏幕扩展。 Screenmanager根据screenenum的屏幕代码切换屏幕
**** Screen Enum Class ****
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);
}
ScreenManager类
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);