Skip to content

GameViewがJPanelを継承したことに伴う変更点

つまみ edited this page Dec 17, 2020 · 2 revisions

GameView

前まで想定していた方法では、

  • インタフェースGameViewがDrawableを継承している
  • Viewを担当するクラスはGameViewを実装する
  • ViewはDrawableのdraw()を定義してあげる
  • SceneManagerに乗ったとき、draw()が呼び出される

という方法でしたが、新しい方法では

  • 抽象クラスGameViewがJPanelを継承している
  • Viewを担当するクラスはGameViewを継承する
  • ViewはJPanelの子クラスなのでJPanelを作る気持ちになる
  • SceneManagerに乗ったとき、MainViewにGameView自体が乗る (JPanelを継承していることになるので)

となります。この方法でJButton, JLabelなどの便利なコンポーネントがシーンに載せられるようになります。 また、レイアウトも標準ライブラリのものを使えるようになりました。 今まで通り draw() を使いたいときは、JPanelの paintComponent(Graphics g) を代わりに使えば良いです。

class NewGameViewExample extends GameView {
    
    public NewGameViewExample(GameModel model) {
        super(model);
        
        // JPanelの関数を使える
        setBackground(Color.BLUE);
        setLayout(null);
        
        // JButtonも追加できる
        JButton button = new JButton("Quit");
        button.setBound(100, 100, 50, 100);
        button.addActionListener(e -> System.exit(0));
        add(button); 
    }
    
    // draw() の代わりにこれを使えばOK
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(new Color(0x90e200));
        g.fillOval(0, 0, 100, 100);
    }
    
    @Override
    public void suspend() { ... }

    @Override
    public void resume() { ... }
}

GameController

この変更に伴い、GameControllerは MouseListener と KeyListener の実装をやめました。 なぜならば、GameViewがJPanelならば、GameControllerはMainViewのパネルにListenerをあてがわなくても、GameViewにListenerをあてがえば良いからです。

つまり、好きなだけListenerを実装して view.add~~~Listener(this) すれば良いです。

class NewGameControllerExample extends GameController implements KeyListener {

    public NewGameControllerExample(GameModel model, GameView view) {
        super(model, view);
        view.addKeyListener(this); // GameViewにlistenerを追加
    }
    
    @Override
    public void keyPressed(KeyEvent e) { ... }
    
    @Override
    public void keyReleased(KeyEvent e) { ... }
    
    @Override
    public void keyTyped(KeyEvent e) { ... }

    @Override
    public void suspend() { ... }

    @Override
    public void resume() { ... }
}

まとめ

  • GameViewはJPanelに suspend()resume() がついたやつになった
  • GameControllerは自分で好きなListenerを実装して自分でGameViewにListenerを追加すればOK