Comments
Description
Transcript
GUI プログラミング第 3 回演習 BlockBreaker
GUI プログラミング第 3 回演習 BlockBreaker ~かんたんブロック崩しゲーム~ パドルを左右に操作して落ちてくるボールを反射させ、上のブロックを崩していく ブロック ボール パドル <Eclipse を起動する> 1.eclipse.zip を D:ドライブにコピーし、右クリック→ここに解凍 2.workspace を S:ドライブから D:ドライブにコピー 3.eclipse.exe を起動 4.workspace を D:workspace に設定 <ブロック崩しのステップ> ステップ 1 矢印キーで動かせるパドルを描画 ステップ 2 ボールを描画し、アニメーションで動かす+時間表示 ステップ 3 ブロックを描画し、崩せるようにする 発展課題 1 パドルをマウスでも動くようにする 発展課題 2 ボールが当たったパドルの位置で反射の仕方を変える 発展課題 3 スコア・ハイスコア表示+色を自由に変更 -1- 【ブロック崩し Step1】矢印キーで左右に動かせるパドルを描画する <パドルの表現方法> パドルは java.awt パッケージの Rectangle という Java が用意しているクラスを使う。これは四角形 を表すクラスで、左上の点の座標と幅・高さをもっている。 Rectangle height (x, y) width ※2D の世界では、フレームやパネルの左上が原点、右に x 座標正方向、下に y 座標正方向となる。 <グラデーションの描画> ただ四角を描画するとのっぺりするので、グラデーションで少し見た目を整える。 2 色のグラデーションのパターンは、java.awt パッケージの GradientPaint クラスのオブジェクトを使 うと簡単に設定できる。 GradientPaint gp = new GradientPaint(点 1 の x 座標, 点 1 の y 座標, 色 1, 点 2 の x 座標, 点 2 の y 座標, 色 2, 循環するかどうか) このようにオブジェクトを作ったとき、点 1 と点 2 によって指定される区間を色 1 から色 2 に補完して いく。最後の引数を true にすると繰り返しグラデーションする。 上の図で点 1 を BLUE・点 2 を RED とすると、色 1 が青・色 2 が赤 点 1 を通る平行ライン上は青、点 2 を通る平行ライン上は赤になる <BlockBreakerPanel.java の作成> 1.BlockBreaker プロジェクトを新規作成 パッケージ・エクスプローラで右クリック→新規→Java プロジェクト プロジェクト名 BlockBreaker 2.パッケージを作成 src フォルダを選択→右クリック→新規→パッケージ パッケージ名 animation 3.BlockBreakerPanel クラスを作成 …JPanel を継承(extends)、KeyListener を実装(implements)したクラス animation パッケージを選択→右クリック→新規→クラス ・クラス名 BlockBreakerPanel ・スーパークラスの参照をクリック→「JPanel」とうつと、javax.swing の JPanel が出てくるので、 それを選択して OK ・インターフェースの追加をクリック→「KeyListener」で出てくるクラスを選択して OK 4.ソースを編集 ※説明のためにコメントが多くあるが、必要以上書かなくてよい -2- 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 BlockBreakerPanel.java package animation; import import import import import import import java.awt.Color; java.awt.GradientPaint; java.awt.Graphics; java.awt.Graphics2D; java.awt.Rectangle; java.awt.event.KeyEvent; java.awt.event.KeyListener; import javax.swing.JPanel; public class BlockBreakerPanel extends JPanel implements KeyListener{ private Rectangle paddle; private int pWidth = 50; private int pHeight = 10; // パドル // パドルの幅 // パドルの高さ /** * コンストラクタ */ public BlockBreakerPanel() { // キーイベントを受け取れるようにする addKeyListener(this); } /** * 描画メソッド */ @Override public void paintComponent(Graphics g){ // ボタンなど配置していなければいらないが、忘れずに書く習慣にする super.paintComponent(g); // より高度な描画を可能にするようキャスト Graphics2D g2d = (Graphics2D)g; // 各描画対象の初期位置を計算して設定 /* このパネルがフレームに貼り付けられないとサイズが確定しないので * コンストラクタの中では getWidth()などに正しい値がはいらない。 * そのため、ここでパドルの初期化と初期位置の決定を行う */ if (paddle == null) { // パドルを Rectangle オブジェクトとして使う paddle = new Rectangle(pWidth, pHeight); // パドルの初期位置は x 方向は中心、y 方向は下から 20 あけたところ /* パドルの左上の x 座標、y 座標を * getWidth(),getHeight(),pWidth, pHeight を使って埋めて下さい */ paddle.setLocation( x 座標 , y 座標 ); } /* 白色背景---------------------------------------*/ // 白をセット g2d.setColor(Color.WHITE); // 四角で塗りつぶす fillRect(左上の x 座標, 左上の y 座標, 幅, 高さ) g2d.fillRect(0, 0, getWidth(), getHeight()); /* パドル描画-------------------------------------*/ // グラデーションパターンを指定する(ブルー → ホワイト) // new GradientPaint(点1のx座標, 点1のy座標, 色1, 点2のx座標, 点2のy座標, 色2, 循環するか) GradientPaint gp = new GradientPaint(paddle.x, paddle.y, Color.BLUE, paddle.x, paddle.y+paddle.height/2, Color.WHITE, true); g2d.setPaint(gp); // パドルを描画 g2d.fill(paddle); } -3- 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 BlockBreakerPanel.java /** * キーを押すと呼ばれる * 矢印キーでパドルが左右に動く */ @Override public void keyPressed(KeyEvent e) { int pdx = 10; // 1回のキー操作でずらす量 // 押されたキーのコードを取得 int keyCode = e.getKeyCode(); // キーコードで分岐 switch (keyCode) { // 左矢印キーだったら case KeyEvent.VK_LEFT: // パドルが左に 10 ずれる(壁にめりこまない) // Rectangle クラスの位置指定メソッド setLocation(左上の点の x 座標, y 座標) if (paddle.x < pdx) paddle.setLocation(0, paddle.y); else paddle.setLocation(paddle.x-pdx, paddle.y); // 再描画 repaint(); break; // 右矢印キーだったら case KeyEvent.VK_RIGHT: // パドルが右に 10 ずれる(壁にめりこまない if (getWidth()-paddle.x-paddle.width < pdx) paddle.setLocation(getWidth()-paddle.width, paddle.y); else paddle.setLocation(paddle.x+pdx, paddle.y); // 再描画 repaint(); default: break; } } /* 以下の 2 つのメソッドは KeyListener を * implements したため必要だが、空でよい */ @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } } -4- <BlockBreakerFrame.java の作成> 1.フレームを作成 animation パッケージ選択→右クリック→新規→その他を選択 GUI Forms→Swing→JFrame を選んで「次へ」 Class Name は BlockBreakerFrame として「完了」 2.Jigloo のメッセージが出てきたら「OK」 3.Look&Feel(プログラムの見た目)を設定 フレームを選択→右クリック→Set Look&Feel→Windows を選択 4.レイアウトを設定 フレームを選択→右クリック→Set Layout→BorderLayout を選択 5.フレームのサイズを大きめにする ソースの方をみて、initGUI()の中の下の方にあるサイズ指定部分を編集 setSize(400,300); → setSize(330,500); 6.フレームのプレビューに戻り、パネルを North に追加 上部の「Containers」右から 5 番目の「JPanel」を選び、フレームに貼り付ける 名前は northPanel、Constraints の中の direction に North を選択 7.パネルを South に追加 名前は southPanel、Constraints の中の direction に South を選択 8.southPanel の高さをで適当に大きくする(ボタンが張り付けられるくらい) ↓このくらい ※厳密にしたい場合は preferredSize プロパティを数字で 40 に指定する。 9.パネルを East に追加 名前は eastPanel、Constraints の中の direction に East を選択 10. パネルを West に追加 名前は westPanel、Constraints の中の direction に West を選択 -5- 11. BlockBreakerPanel を Center に追加 フレームを選択(中央をクリック)→右クリック→Add…→Add Custom →Add custom class or layout を選択 「BlockBreakerPanel」と入力して OK 名前を centerPanel とし、Constraints の中の direction が Center になっていることを確認して OK 12. centerPanel のボーダー(境界線)を設定する centerPanel を選択→下の「GUI Properties」ウィンドウで 「Properies」の「Basic」の中の「border」を「EtchedBorder」にする 13. southPanel のレイアウト設定 southPanel を選択→右クリック→Set Layout→AbsoluteLayout を選択 14. southPanel にボタンを2つ追加 Step2 以降で使うのもだが、ここで追加しておく。 Components の一番左にある「JButton」を選んで southPanel に貼り付け 1 つ目:名前「startButton」 テキスト「START」 1 つ目:名前「stopButton」 テキスト「STOP」 ↓保存するとこのようになる 15. ボタンが押されたときに実行されるメソッドのひな型を作成 startButton を選択し、Event Name のリスト中の ActionListner を開いて actionPerformed を inline に設定する stopButton にも同じ操作をしておく 16. キー操作を有効にするには、centerPanel にフォーカスされている必要があるので、コンストラ クタに以下の記述を追加する) public BlockBreakerFrame() { super(); initGUI(); centerPanel.requestFocus(); } 17. 実行する 18. 矢印キーでパドルが左右に動くことを確認(現時点ではボタン操作はしない) -6-