我認爲你的問題已經走上了正確的道路,但是讓我們使用一些通用的(甚至不是Java特定的)編程原則來理解爲什麼這是正確的方法。這裏是我們的原則:
- 分離問題(SoC):確保你的代碼做了一件事,那件事情非常好。
- 不要重複自己(幹):代碼一切;儘量減少樣板代碼。
- 保持簡單(KISS):閱讀起來更容易,維護更容易,測試更容易。
當我創建libGDX的遊戲畫面,我通常使用的結構如下:
Screen
|- Stage
|- ControllerReference
\- ModelReference
屏幕上有隻使用它來創建特定的屏幕布局的私人階段。然後我注入控制器(主要用於改變屏幕)和模型(動態遊戲數據)到屏幕如在以下示例代碼證實:
StageScreen.java
abstract class StageScreen implements Screen {
protected Stage stage;
protected Game controller;
public StageScreen(Game controller) {
this.controller = controller;
}
@Override
public void render(float v) {
stage.act(v);
stage.draw();
}
@Override
public void dispose() {
stage.dispose();
}
// Snipped other methods like "hide" and "resize" which aren't relevant
}
MenuScreen.java
class MenuScreen extends StageScreen {
private Array<Demo> demos;
public MenuScreen(Game controller, Array<Demo> demos) {
super(controller);
this.demos = demos;
}
@Override
public void show() {
stage = new Stage(new ScreenViewport());
Gdx.input.setInputProcessor(stage);
VisTable table = new VisTable();
table.setFillParent(true);
for(final Demo demo : demos) {
table.add(new VisTextButton(demo.getName(), new ChangeListener() {
@Override
public void changed(ChangeEvent changeEvent, Actor actor) {
controller.setScreen(demo);
}
}));
table.row();
}
stage.addActor(table);
}
}
因此,讓我們扔一些岩石的例子:
- 它單獨的擔憂?是。所有屏幕都會爲每個演示渲染一個按鈕,並告知控制器用戶的意圖。所有它知道的是,演示有名字,並且他們算作屏幕。我們可以通過傳遞一個事件(即「UserSelectsDemoX」)而不是我們想要轉換的屏幕來使控制器更加抽象,但是我認爲這會違反KISS原則。
- 它讓我們重複自己嗎?編號所有屏幕(管理舞臺,保持對文件夾的引用)的代碼都在我們的抽象類中,而我們的子類僅包含使屏幕執行其他屏幕不需要的任何代碼的代碼。噸。
- 它很簡單嗎?是的。請注意,如果您熟悉基本的libGDX類(
Game
,Stage
,Screen
),則無需任何註釋即可瞭解此代碼段的功能。我們可以使事情變得更爲普遍(即使控制器界面和模型界面只顯示我們的屏幕需要),但是增加額外的抽象會使代碼更難理解。
希望這有助於回答你的問題,將聽衆鏈接到控制器的最佳方式,以及給你一種思考你可以應用到代碼庫其他部分的方法。