-
Notifications
You must be signed in to change notification settings - Fork 0
GameViewがJPanelを継承したことに伴う変更点
つまみ edited this page Dec 17, 2020
·
2 revisions
前まで想定していた方法では、
- インタフェース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は 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