2016-11-28 87 views
0

我正在開發一個小遊戲,並且想知道在(匿名)監聽器中處理方法的最佳做法。儘管我正在使用libGDX進行開發,但我的問題是關於一般的Java編程標準。在監聽器的句柄方法中調用控制器類的方法是否有最佳實踐方法?

假設我有一個控制器來控制包含舞臺的屏幕類。這些階段構建包括按鈕等在內的gui。我將點擊偵聽器添加爲舞臺按鈕的匿名類。因爲我想調用屏幕的方法,甚至在handle方法中調用控制器類,我將它們從控制器傳遞給屏幕以引發監聽器的引用。傳遞給我的參考看起來並不是很好的做法。

或者我可以得到屏幕類中的按鈕並在那裏添加監聽器。不過,我需要爲每個按鈕添加get方法。

你能想一下其他更清潔的方式來實現嗎?

回答

3

我認爲你的問題已經走上了正確的道路,但是讓我們使用一些通用的(甚至不是Java特定的)編程原則來理解爲什麼這是正確的方法。這裏是我們的原則:

  1. 分離問題(SoC):確保你的代碼做了一件事,那件事情非常好。
  2. 不要重複自己(幹):代碼一切;儘量減少樣板代碼。
  3. 保持簡單(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); 
    } 
} 

因此,讓我們扔一些岩石的例子:

  1. 它單獨的擔憂?。所有屏幕都會爲每個演示渲染一個按鈕,並告知控制器用戶的意圖。所有它知道的是,演示有名字,並且他們算作屏幕。我們可以通過傳遞一個事件(即「UserSelectsDemoX」)而不是我們想要轉換的屏幕來使控制器更加抽象,但是我認爲這會違反KISS原則。
  2. 它讓我們重複自己嗎?編號所有屏幕(管理舞臺,保持對文件夾的引用)的代碼都在我們的抽象類中,而我們的子類僅包含使屏幕執行其他屏幕不需要的任何代碼的代碼。噸。
  3. 它很簡單嗎?是的。請注意,如果您熟悉基本的libGDX類(Game,Stage,Screen),則無需任何註釋即可瞭解此代碼段的功能。我們可以使事情變得更爲普遍(即使控制器界面和模型界面只顯示我們的屏幕需要),但是增加額外的抽象會使代碼更難理解。

希望這有助於回答你的問題,將聽衆鏈接到控制器的最佳方式,以及給你一種思考你可以應用到代碼庫其他部分的方法。

相關問題