//============================================================================= // UpperHandBoardView.java // Copyright(c) 1998-1999 Satoshi Kobayashi, All rights reserved. //============================================================================= import java.awt.*; import java.util.*; //============================================================================= // class UpperHandBoardView // ゲーム盤を表示するクラス。 //============================================================================= public class UpperHandBoardView extends Canvas implements Observer { //----------------------------------------------------------------------------- // クラス変数定義 //----------------------------------------------------------------------------- // 玉の大きさ private final static int size = 32; // 玉の描画エリア private static Rectangle area[]; //----------------------------------------------------------------------------- // クラス変数の初期化 //----------------------------------------------------------------------------- static { // 玉の描画エリアを初期化する。 // 位置pと、その(x,y,z)座標の対応をとり、sizeから位置pの描画エリアを // 計算している。 area = new Rectangle[55]; int p = 0; for (int z = 4; z >= 0; z--) { for (int y = 0; y <= z; y++) { for (int x = 0; x <= z; x++) { area[p] = new Rectangle( (4 - z) * size / 2 + size * x, (4 - z) * size / 2 + size * y, size, size); p++; } } } } //----------------------------------------------------------------------------- // インスタンス変数定義 //----------------------------------------------------------------------------- // 表示対象のゲーム private UpperHandGame game; // ゲームを制御するオブジェクト private UpperHand app; //----------------------------------------------------------------------------- // コンストラクタ定義 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // public UpperHandBoardView(UpperHandGame game, UpperHand app) // UpperHandBoardViewのインスタンスを生成し、初期化を行う。 // UpperHandGame game - 表示対象のゲーム // UpperHand app - ゲームを制御するオブジェクト //----------------------------------------------------------------------------- public UpperHandBoardView(UpperHandGame game, UpperHand app) { this.game = game; this.app = app; // コンポーネントの背景色を設定する。 setBackground(UpperHand.color[UpperHand.BG_COLOR]); // ゲームとの依存関係を作る。 game.addObserver(this); } //----------------------------------------------------------------------------- // メソッド定義 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // public void paint(Graphics g) // 現在のゲームの状態を描画する。 //----------------------------------------------------------------------------- public void paint(Graphics g) { paintBoard(g); // 盤を描画する。 // 玉を描画する。 for (int p = 0; p < area.length; p++) { paintBall(g, p); } } //----------------------------------------------------------------------------- // private void paintBoard(Graphics g) // ゲーム盤のみを描画する。 //----------------------------------------------------------------------------- private void paintBoard(Graphics g) { Color c1; // 左と上の辺の色 Color c2; // 右と下の辺の色 c1 = UpperHand.color[UpperHand.BG_COLOR].brighter().brighter(); c2 = UpperHand.color[UpperHand.BG_COLOR].darker().darker(); // 5×5の盤面に浮き上がった四角形を書く。 for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { int X = x * size; int Y = y * size; g.setColor(c1); g.drawLine(X, Y, X + size - 1, Y); g.drawLine(X, Y, X, Y + size - 1); g.setColor(c2); g.drawLine(X, Y + size - 1, X + size - 1, Y + size - 1); g.drawLine(X + size - 1, Y, X + size - 1, Y + size - 1); } } } //----------------------------------------------------------------------------- // private void paintBall(Graphics g, int p) // pで指定された位置の玉を描画する。 //----------------------------------------------------------------------------- private void paintBall(Graphics g, int p) { if (app.ballImage1[0] != null) { // 画像のダウンロードに成功したとき switch (game.boardStatus(p)) { case UpperHandGame.FIRST: case UpperHandGame.SECOND: case UpperHandGame.NUTRAL: // ダウンロードした画像を表示する。 g.drawImage(app.ballImage1[game.boardStatus(p)], area[p].x, area[p].y, this); break; case UpperHandGame.MOVABLE: // 描画エリアの半分の大きさで背景色の円を描く。 Color c = UpperHand.color[UpperHand.BG_COLOR]; g.setColor(c); g.fillOval(area[p].x + area[p].width / 4, area[p].y + area[p].height / 4, area[p].width / 2, area[p].height / 2); break; } } else { // 画像のダウンロードに失敗したとき Color c; // 玉の色を決定する。 switch (game.boardStatus(p)) { case UpperHandGame.FIRST: c = UpperHand.color[UpperHand.FIRST_COLOR]; break; case UpperHandGame.SECOND: c = UpperHand.color[UpperHand.SECOND_COLOR]; break; case UpperHandGame.NUTRAL: c = UpperHand.color[UpperHand.NUTRAL_COLOR]; break; case UpperHandGame.MOVABLE: c = UpperHand.color[UpperHand.BG_COLOR]; break; default: return; } if (game.boardStatus(p) != UpperHandGame.MOVABLE) { // 玉を置くとき // 描画エリアいっぱいに背景色で円を描く。 g.setColor(UpperHand.color[UpperHand.BG_COLOR]); g.fillOval(area[p].x, area[p].y, area[p].width, area[p].height); // 描画エリアより少し小さめに円を描く。 g.setColor(c); g.fillOval(area[p].x + 1, area[p].y + 1, area[p].width - 2, area[p].height - 2); } else { // 玉が置けるようになったとき // 描画エリアの半分の大きさで背景色の円を描く。 g.setColor(c); g.fillOval(area[p].x + area[p].width / 4, area[p].y + area[p].height / 4, area[p].width / 2, area[p].height / 2); } } } //----------------------------------------------------------------------------- // public boolean mouseDown(Event evt, int x, int y) // マウスのボタンが押されたときの処理を行う。 //----------------------------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { if (!game.isFinish()) { // ゲームが終了していない場合 // 着手可能な手の一覧を取得する。 int move[] = game.moves(); // マウスのボタンが押された座標が、 // 着手可能な位置の描画エリア内か調べる。 for (int i = 0; i < move.length; i++) { int p = move[i]; if (area[p].inside(x, y)) { // エリア内の場合 app.makeMove(p); // 着手を依頼する。 return true; // イベントを処理したのでtrueを返す。 } } } return false; // イベントを親コンポーネントに渡す。 } //----------------------------------------------------------------------------- // public Dimension minimumSize() // コンポーネントの最小サイズを返す。 //----------------------------------------------------------------------------- public Dimension minimumSize() { return new Dimension(size * 5, size * 5); } //----------------------------------------------------------------------------- // public Dimension preferredSize() // コンポーネントの推奨サイズを返す。 //----------------------------------------------------------------------------- public Dimension preferredSize() { return minimumSize(); } //----------------------------------------------------------------------------- // public void update(Observable o, Object arg) // ゲームの状態が変化したときの処理を行う。 //----------------------------------------------------------------------------- public void update(Observable o, Object arg) { UpperHandEvent evt = (UpperHandEvent)arg; switch (evt.type) { case UpperHandEvent.INITIALIZE: // ゲームが初期化されたとき // ゲーム盤全体を再描画する。 update(getGraphics()); break; case UpperHandEvent.PUT_BALL: // 玉が置かれたとき // 置かれた玉のみ描画する。 paintBall(getGraphics(), evt.position); break; } } }