summaryrefslogtreecommitdiffstats
path: root/src/GameWindow.java
blob: a908a0a14607b968339f6de1061c7dee8b45d7d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// TODO: package

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.CardLayout;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class GameWindow extends JFrame implements ActionListener {
	public static final Dimension WINDOW_SIZE = new Dimension(600, 400);

	public final String MENU_CARD = "menu";
	public final String SCENE_CARD = "scene";

	private JPanel root;

	private Scene scene = null;
	private Thread sceneThread = null;

	// TODO: remove map editor, start directly on Battle mode
	public GameWindow() {
		super("Subconscious");

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(WINDOW_SIZE);
		this.setPreferredSize(WINDOW_SIZE);
		this.setLocationRelativeTo(null);

		this.initComponents();

		this.add(this.root, BorderLayout.CENTER);
		this.pack();
		this.setVisible(true);
	}

	private void initComponents() {
		// set up a cardlayout
		this.root = new JPanel(new CardLayout());

		// build Menu card
		JPanel menu = new JPanel();
		menu.setLayout(new GridLayout(3, 1));

		JButton editor = new JButton("Editor");
		editor.setActionCommand("btn-editor");
		editor.addActionListener(this);

		JButton battle = new JButton("Battle");
		battle.setActionCommand("btn-battle");
		battle.addActionListener(this);

		JButton exit = new JButton("Exit");
		exit.setActionCommand("btn-exit");
		exit.addActionListener(this);
		
		menu.add(editor);
		menu.add(battle);
		menu.add(exit);

		// add cards
		this.root.add(menu, MENU_CARD);
	}

	public void showScene(Scene scene) {
		// the current scene is already open
		if (scene == this.scene) {
			((CardLayout)this.root.getLayout()).show(this.root, SCENE_CARD);
			scene.updateCanvasSize();
			scene.resume();

			return;
		}

		// if there is an old scene
		if (this.scene != null) {
			// close old scene
			this.scene.stop();
			try {
				this.sceneThread.join();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}

		// build new thread
		this.scene = scene;
		this.sceneThread = new Thread(this.scene);

		// add to layout
		this.root.add(scene, SCENE_CARD);
		((CardLayout)this.root.getLayout()).show(this.root, SCENE_CARD);

		this.sceneThread.start();
		scene.updateCanvasSize();
		scene.resume();
	}

	public void showMenu() {
		this.scene.pause();
		((CardLayout)this.root.getLayout()).show(this, MENU_CARD);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().startsWith("btn")) {
			if (e.getActionCommand().equals("btn-exit")) {
				this.setVisible(false);
				this.dispose();
				return;
			}

			Scene scene = null;

			if (e.getActionCommand().equals("btn-editor")) {
				scene = new MapEditorScene();
			} else if (e.getActionCommand().equals("btn-battle")) {
				scene = new BattleScene();
			}

			if (scene != null) {
				showScene(scene);
			}
		}
	}
}