2017-05-14 72 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);