情報学部 | 菅沼ホーム | Java 目次 | 索引 |
/*****************************/ /* アクションゲーム(その1)*/ /* coded by Y.Suganuma */ /*****************************/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import main.*; public class Game { public static void main (String[] args) { Win win = new Win("アクションゲーム(その2)"); } } class Win extends JFrame { /******************/ /* コンストラクタ */ /******************/ Win(String name) { // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す) super(name); // Windowの大きさ setSize(460, 390); // 40+20, 70+20 // MainPanel の大きさを決定 Dimension size = getSize(); size.width -=60; size.height -=90; // ContentPain を取得し,設定 Container CP = getContentPane(); // ContentPane を取得 CP.setLayout(null); // レイアウトマネージャを停止 CP.setBackground(new Color(220, 255, 220)); // 背景色 // MainPanel を追加し,設定 MainPanel pn = new MainPanel(size); // MainPanel オブジェクトの生成 CP.add(pn); // MainPanel オブジェクトを ContentPane に追加 pn.setSize(size.width, size.height); pn.setLocation(10, 10); // ウィンドウを表示 setVisible(true); // イベントリスナ addWindowListener(new WinEnd()); } /******************************/ /* 上,左,下,右の余白の設定 */ /******************************/ public Insets getInsets() { return new Insets(50, 20, 20, 20); } /************/ /* 終了処理 */ /************/ class WinEnd extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }
package main; import java.awt.*; import java.awt.event.*; import javax.swing.*; import start.*; import game.*; import clear.*; import over.*; public class MainPanel extends JPanel implements Runnable { Dimension size; // パネルの大きさ boolean in_game = true; // ゲーム実行中はtrue public int state = 0; // ゲーム状態(0:表紙,1:ゲーム,2:クリア,3:オーバー,4:終了) public int level = 1; // ゲームレベル int old_state = 0; // 直前のゲーム状態 StartPanel sp; GamePanel gp; GameClearPanel gcp; GameOverPanel gop; Thread td; // コンストラクタ public MainPanel(Dimension size1) { size = size1; // グリッドレイアウト setLayout(new GridLayout(1, 1, 0, 0)); // ゲームパネルの生成 sp = new StartPanel(size, this); // スタート(タイトル) add(sp); // スレッドの生成 td = new Thread(this); td.start(); } // ゲームの状態を変更 public void run() { while (in_game) { try { td.sleep(100); // 100 ms 毎の実施 } catch (InterruptedException e) {} if (state != old_state) { // 前のパネルの削除 if (old_state == 0) remove(sp); else if (old_state == 1) remove(gp); else if (old_state == 2) remove(gcp); else remove(gop); // 新しいパネルの追加 if (state == 4) // ゲーム終了 in_game = false; else { if (state == 0) { // StartPanel sp = new StartPanel(size, this); add(sp); } else if (state == 1) { // GamePanel gp = new GamePanel(size, this); add(gp); } else if (state == 2) { // GameClearPanel gcp = new GameClearPanel(size, this); add(gcp); } else { // GameOverPanel gop = new GameOverPanel(size, this); add(gop); } validate(); old_state = state; } } } } }
001 package start; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import javax.swing.*; 006 import main.*; 007 008 public class StartPanel extends JPanel implements ActionListener 009 { 010 boolean in_game = true; 011 Dimension size; // パネルの大きさ 012 MainPanel mp; 013 JButton bt; 014 // コンストラクタ 015 public StartPanel(Dimension size1, MainPanel mp1) 016 { 017 size = size1; 018 mp = mp1; 019 // レイアウトマネージャの停止 020 setLayout(null); 021 // 背景色の設定 022 setBackground(Color.white); 023 // ボタンの配置 024 Font f = new Font("SansSerif", Font.BOLD, 20); 025 FontMetrics fm = getFontMetrics(f); 026 String str = "遊び方"; 027 int w = fm.stringWidth(str) + 40; 028 int h = fm.getHeight() + 10; 029 bt = new JButton(str); 030 bt.setFont(f); 031 bt.addActionListener(this); 032 bt.setSize(w, h); 033 bt.setLocation(size.width/2-w/2, 5); 034 add(bt); 035 // マウスリスナの追加 036 addMouseListener(new Mouse()); 037 } 038 // 描画 039 public void paintComponent(Graphics g) 040 { 041 super.paintComponent(g); // 親クラスの描画 042 FontMetrics fm; 043 Font f; 044 String str; 045 int w, h; 046 047 f = new Font("SansSerif", Font.BOLD, 40); 048 fm = g.getFontMetrics(f); 049 str = "アクションゲーム"; 050 w = fm.stringWidth(str); 051 h = fm.getHeight(); 052 g.setFont(f); 053 g.drawString(str, size.width/2-w/2, size.height/2); 054 055 f = new Font("Serif", Font.PLAIN, 20); 056 fm = g.getFontMetrics(f); 057 str = "ゲーム開始:ダブルクリック"; 058 w = fm.stringWidth(str); 059 h = size.height - fm.getHeight() - 10; 060 g.setFont(f); 061 g.drawString(str, size.width/2-w/2, h); 062 } 063 // ボタンがクリックされたときの処理 064 public void actionPerformed(ActionEvent e) 065 { 066 if (e.getSource() == bt) { 067 Method db = new Method(); 068 db.setVisible(true); 069 requestFocusInWindow(); 070 } 071 } 072 // ダブルクリックされたときの処理 073 class Mouse extends MouseAdapter { 074 public void mouseClicked(MouseEvent e) { 075 if (e.getClickCount() == 2) 076 mp.state = 1; 077 } 078 } 079 } 080 081 /******************/ 082 /* ゲームの遊び方 */ 083 /******************/ 084 class Method extends JDialog 085 { 086 // コンストラクタ 087 Method() 088 { 089 setTitle("ゲームの遊び方"); 090 // ContetPain 091 Container cp = getContentPane(); 092 cp.setLayout(new FlowLayout(FlowLayout.CENTER)); 093 cp.setBackground(new Color(220, 255, 220)); // 背景色 094 Font f = new Font("MS 明朝", Font.PLAIN, 20); 095 setSize(550, 160); 096 // TextArea の追加 097 JTextArea ta = new JTextArea(5, 50); 098 ta.setFont(f); 099 ta.setEditable(false); 100 ta.setLineWrap(true); 101 ta.setText("・ゲーム開始: 画面上でダブルクリック\n"); 102 103 ta.append("・ジャンプ: マウスの左ボタンを押している間加速,離すと自由落下運動に移行する.\n"); 104 JScrollPane scroll = new JScrollPane(ta); 105 cp.add(scroll); 106 // Window を閉じるため 107 addWindowListener(new WinEnd()); 108 } 109 // 終了処理 110 class WinEnd extends WindowAdapter 111 { 112 public void windowClosing(WindowEvent e) { 113 setVisible(false); 114 } 115 } 116 }
001 package game; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import javax.swing.*; 006 import main.*; 007 008 public class GamePanel extends JPanel implements Runnable 009 { 010 Dimension size; // パネルの大きさ 011 MainPanel mp; 012 Thread td; 013 boolean in_game = true; 014 Hero hr; // 主人公 015 Road rd; // 背景(道) 016 // コンストラクタ 017 public GamePanel(Dimension size1, MainPanel mp1) 018 { 019 size = size1; 020 mp = mp1; 021 // レイアウトマネージャの停止 022 setLayout(null); 023 // 背景色の設定 024 setBackground(Color.white); 025 // 主人公と道の生成 026 rd = new Road(size, mp); 027 hr = new Hero(size, rd, mp); 028 // スレッドの生成 029 td = new Thread(this); 030 td.start(); 031 // マウスリスナの追加 032 addMouseListener(new Mouse()); 033 } 034 // スレッドの実行 035 public void run() 036 { 037 while (in_game) { 038 try { 039 td.sleep(30); 040 } 041 catch (InterruptedException e) {} 042 hr.x += (int)hr.v_x; 043 rd.x += (int)rd.v_x; 044 repaint(); 045 } 046 } 047 // 描画 048 public void paintComponent(Graphics g) 049 { 050 super.paintComponent(g); // 親クラスの描画 051 // 主人公の描画 052 g.drawImage(hr.image, hr.x, hr.y, this); 053 // 背景の描画 054 for (int i1 = 0; i1 < rd.col; i1++) { 055 int x = rd.x + rd.width * i1; 056 if (x + rd.width >= 0 && x <= size.width) { 057 for (int i2 = 0; i2 < rd.row; i2++) { 058 if (rd.blk[i2][i1] > 0) { 059 int y = i2 * rd.height; 060 g.drawImage(rd.image[rd.blk[i2][i1]-1], x, y, this); 061 } 062 } 063 } 064 } 065 } 066 // マウスイベントの処理 067 class Mouse extends MouseAdapter { 068 // ボタンが押されたとき 069 public void mousePressed(MouseEvent e) { 070 in_game = false; 071 mp.state = 2; 072 } 073 } 074 } 075 076 package game; 077 078 import java.awt.*; 079 import main.*; 080 081 class Hero 082 { 083 Image image; // 主人公画像 084 int x, y; // 主人公の位置 085 double v_x = 1; // 主人公の水平方向移動速度 086 int width = 32; // 主人公画像の幅 087 int height = 52; // 主人公画像の高さ 088 // コンストラクタ 089 Hero(Dimension size, Road rd, MainPanel mp) 090 { 091 // 主人公画像の読み込み 092 image = mp.getToolkit().getImage("game/image/char.jpg"); 093 // 主人公の初期位置 094 x = 0; 095 y = size.height - rd.height * rd.r_no - height; 096 } 097 } 098 099 package game; 100 101 import java.awt.*; 102 import main.*; 103 104 class Road 105 { 106 Image image[] = new Image [2]; // 画像ファイル 107 int blk1[][] = { 108 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 109 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 110 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 111 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 112 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 113 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 114 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 115 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 116 {1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2}, 117 {1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2}, 118 {1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2}, 119 {1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2}}; 120 int blk2[][] = { 121 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 122 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 123 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 124 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 125 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 126 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 127 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 128 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 129 {1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2}, 130 {1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2}, 131 {1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2}, 132 {1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2}}; 133 int blk[][]; // 背景を構成するブロック 134 int row = 12; // ブロックの行数 135 int col = 26; // ブロックの列数 136 int r_no = 4; // 道を構成する縦のブロック数 137 int x; // 背景の位置 138 double v_x = -2; // 背景の水平方向移動速度 139 int width = 25; // ブロックの幅 140 int height = 25; // ブロックの高さ 141 // コンストラクタ 142 public Road(Dimension size, MainPanel mp) 143 { 144 // 画像の読み込み 145 image[0] = mp.getToolkit().getImage("game/image/road1.jpg"); 146 image[1] = mp.getToolkit().getImage("game/image/road2.jpg"); 147 // 背景の設定 148 x = 0; 149 if (mp.level == 1) { 150 col = 26; 151 blk = blk1; 152 } 153 else { 154 col = 23; 155 blk = blk2; 156 } 157 } 158 }
int x[][] = new int [2][3];
int x[][] = new int [2][]; x[0] = new int [3]; // 以下,繰り返し文を使用可能 x[1] = new int [3];
int x[][] = {{1, 2, 3}, {4, 5, 6}}; // 内側の括弧が各行に相当
int x1[] = {1, 2, 3}; int x2[] = {4, 5, 6}; int x[][] = {x1, x2};
package clear; import java.awt.*; import java.awt.event.*; import javax.swing.*; import main.*; public class GameClearPanel extends JPanel implements ActionListener { Dimension size; // パネルの大きさ MainPanel mp; JButton bt1, bt2; // コンストラクタ public GameClearPanel(Dimension size1, MainPanel mp1) { size = size1; mp = mp1; // レイアウトマネージャの停止 setLayout(null); // 背景色の設定 setBackground(Color.white); // ボタンの配置 Font f = new Font("SansSerif", Font.BOLD, 20); FontMetrics fm = getFontMetrics(f); String str1 = "ゲーム終了"; int w1 = fm.stringWidth(str1) + 40; int h1 = fm.getHeight() + 10; bt1 = new JButton(str1); bt1.setFont(f); bt1.addActionListener(this); // アクションリスナ bt1.setSize(w1, h1); bt1.setLocation(size.width/2-w1-5, size.height-h1-20); add(bt1); String str2; if (mp.level == 2) str2 = "最初から再開"; else str2 = "次のレベル"; int w2 = fm.stringWidth(str2) + 40; int h2 = fm.getHeight() + 10; bt2 = new JButton(str2); bt2.setFont(f); bt2.addActionListener(this); // アクションリスナ bt2.setSize(w2, h2); bt2.setLocation(size.width/2+5, size.height-h2-20); add(bt2); } // 描画 public void paintComponent(Graphics g) { super.paintComponent(g); // 親クラスの描画 Font f = new Font("SansSerif", Font.BOLD, 40); FontMetrics fm = g.getFontMetrics(f); String str = "Game Clear!"; int w = fm.stringWidth(str); g.setFont(f); g.drawString(str, size.width/2-w/2, size.height/2); } // ボタンがクリックされたときの処理 public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { mp.state = 4; bt1.setEnabled(false); bt2.setEnabled(false); } else { mp.level++; if (mp.level > 2) { // 最初からゲーム再開 mp.state = 0; mp.level = 1; } else // レベルアップ mp.state = 1; } } }
package over; import java.awt.*; import java.awt.event.*; import javax.swing.*; import main.*; public class GameOverPanel extends JPanel implements ActionListener { Dimension size; // パネルの大きさ MainPanel mp; JButton bt1, bt2, bt3; // コンストラクタ public GameOverPanel(Dimension size1, MainPanel mp1) { size = size1; mp = mp1; // レイアウトマネージャの停止 setLayout(null); // 背景色の設定 setBackground(Color.white); // ボタンの配置 Font f = new Font("SansSerif", Font.BOLD, 10); FontMetrics fm = getFontMetrics(f); String str1 = "終了"; int w1 = fm.stringWidth(str1) + 40; int h1 = fm.getHeight() + 10; bt1 = new JButton(str1); bt1.setFont(f); bt1.addActionListener(this); // アクションリスナ bt1.setSize(w1, h1); String str2 = "現在のレベルで再開"; int w2 = fm.stringWidth(str2) + 40; int h2 = fm.getHeight() + 10; bt2 = new JButton(str2); bt2.setFont(f); bt2.addActionListener(this); // アクションリスナ bt2.setSize(w2, h2); String str3 = "最初から再開"; int w3 = fm.stringWidth(str3) + 40; int h3 = fm.getHeight() + 10; bt3 = new JButton(str3); bt3.setFont(f); bt3.addActionListener(this); // アクションリスナ bt3.setSize(w3, h3); int w = size.width / 2 - (w1 + w2 + w3 + 10) / 2; bt1.setLocation(w, size.height-h1-20); add(bt1); w += (w1 + 5); bt2.setLocation(w, size.height-h1-20); add(bt2); w += (w2 + 5); bt3.setLocation(w, size.height-h1-20); add(bt3); } // 描画 public void paintComponent(Graphics g) { super.paintComponent(g); // 親クラスの描画 Font f = new Font("SansSerif", Font.BOLD, 40); FontMetrics fm = g.getFontMetrics(f); String str = "Game Over!"; int w = fm.stringWidth(str); g.setFont(f); g.drawString(str, size.width/2-w/2, size.height/2); } // ボタンがクリックされたときの処理 public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { // ゲーム終了 mp.state = 4; bt1.setEnabled(false); bt2.setEnabled(false); bt3.setEnabled(false); } else if (e.getSource() == bt2) // 現在のレベルでゲーム再開 mp.state = 1; else { // 最初からゲーム再開 mp.state = 0; mp.level = 1; } } }
01 package game;
02
03 import java.awt.*;
04 import java.awt.event.*;
05 import javax.swing.*;
06 import main.*;
07
08 public class GamePanel extends JPanel implements Runnable
09 {
10 Dimension size; // パネルの大きさ
11 MainPanel mp;
12 Thread td;
13 boolean in_game = true;
14 Hero hr; // 主人公
15 Road rd; // 背景(道)
16 // コンストラクタ
17 public GamePanel(Dimension size1, MainPanel mp1)
18 {
19 size = size1;
20 mp = mp1;
21 // レイアウトマネージャの停止
22 setLayout(null);
23 // 背景色の設定
24 setBackground(Color.white);
25 // 主人公と道の生成
26 rd = new Road(size, mp);
27 hr = new Hero(size, rd, mp);
28 // スレッドの生成
29 td = new Thread(this);
30 td.start();
31 // マウスリスナの追加
32 addMouseListener(new Mouse());
33 }
34 // スレッドの実行
35 public void run()
36 {
37 while (in_game) {
38 try {
39 td.sleep(30);
40 }
41 catch (InterruptedException e) {}
42 // 移動と再描画
43 hr.x += (int)hr.v_x;
44 rd.x += (int)rd.v_x;
45 repaint();
46 // 道の状態のチェック
47 int x = (hr.x - rd.x + hr.width / 2) / rd.width;
48 int y = (hr.y + hr.height + rd.height / 2) / rd.height;
49 if (x >= rd.col || rd.blk[y][x] == 0) {
50 in_game = false;
51 mp.state = 3; // ゲームオーバー
52 }
53 else if (rd.blk[y][x] == 2) {
54 in_game = false;
55 mp.state = 2; // ゲームクリア
56 }
57 }
58 }
59 // 描画
60 public void paintComponent(Graphics g)
61 {
62 super.paintComponent(g); // 親クラスの描画
63 // 主人公の描画
64 g.drawImage(hr.image, hr.x, hr.y, this);
65 // 背景の描画
66 for (int i1 = 0; i1 < rd.col; i1++) {
67 int x = rd.x + rd.width * i1;
68 if (x + rd.width >= 0 && x <= size.width) {
69 for (int i2 = 0; i2 < rd.row; i2++) {
70 if (rd.blk[i2][i1] > 0) {
71 int y = i2 * rd.height;
72 g.drawImage(rd.image[rd.blk[i2][i1]-1], x, y, this);
73 }
74 }
75 }
76 }
77 }
78 // マウスイベントの処理
79 class Mouse extends MouseAdapter {
80 // マウスがクリックされたとき
81 public void mousePressed(MouseEvent e) {
82 in_game = false;
83 mp.state = 2;
84 }
85 }
86 }
001 package game; 002 003 import java.awt.*; 004 import main.*; 005 006 class Hero 007 { 008 Image image; // 主人公画像 009 int x, y; // 主人公の位置 010 double v_x = 1; // 主人公の水平方向移動速度 011 double v_y = 0; // 主人公の垂直方向移動速度 012 int width = 32; // 主人公画像の幅 013 int height = 52; // 主人公画像の高さ 014 // コンストラクタ 015 Hero(Dimension size, Road rd, MainPanel mp) 016 { 017 // 主人公画像の読み込み 018 image = mp.getToolkit().getImage("game/image/char.jpg"); 019 // 主人公の初期位置 020 x = 0; 021 y = size.height - rd.height * rd.r_no - height; 022 } 023 } 024 025 package game; 026 027 import java.awt.*; 028 import java.awt.event.*; 029 import javax.swing.*; 030 import main.*; 031 032 public class GamePanel extends JPanel implements Runnable 033 { 034 Dimension size; // パネルの大きさ 035 MainPanel mp; 036 Thread td; 037 boolean in_game = true; 038 Hero hr; // 主人公 039 Road rd; // 背景(道) 040 double up = 0; // 上向き加速度 041 double down = 0; // 下向き加速度 042 boolean jump = false; // ジャンプ中か? 043 // コンストラクタ 044 public GamePanel(Dimension size1, MainPanel mp1) 045 { 046 size = size1; 047 mp = mp1; 048 // レイアウトマネージャの停止 049 setLayout(null); 050 // 背景色の設定 051 setBackground(Color.white); 052 // 主人公と道の生成 053 rd = new Road(size, mp); 054 hr = new Hero(size, rd, mp); 055 // スレッドの生成 056 td = new Thread(this); 057 td.start(); 058 // マウスリスナの追加 059 addMouseListener(new Mouse()); 060 } 061 // スレッドの実行 062 public void run() 063 { 064 while (in_game) { 065 try { 066 td.sleep(30); 067 } 068 catch (InterruptedException e) {} 069 // 移動と再描画 070 hr.v_y += (up - down); 071 hr.x += (int)hr.v_x; 072 hr.y -= (int)hr.v_y; 073 rd.x += (int)rd.v_x; 074 repaint(); 075 // 道の状態のチェック 076 /* 077 int x = (hr.x - rd.x + hr.width / 2) / rd.width; 078 int y = (hr.y + hr.height + rd.height / 2) / rd.height; 079 if (x >= rd.col || rd.blk[y][x] == 0) { 080 in_game = false; 081 mp.state = 3; // ゲームオーバー 082 } 083 else if (rd.blk[y][x] == 2) { 084 in_game = false; 085 mp.state = 2; // ゲームクリア 086 } 087 */ 088 } 089 } 090 // 描画 091 public void paintComponent(Graphics g) 092 { 093 super.paintComponent(g); // 親クラスの描画 094 // 主人公の描画 095 g.drawImage(hr.image, hr.x, hr.y, this); 096 // 背景の描画 097 for (int i1 = 0; i1 < rd.col; i1++) { 098 int x = rd.x + rd.width * i1; 099 if (x + rd.width >= 0 && x <= size.width) { 100 for (int i2 = 0; i2 < rd.row; i2++) { 101 if (rd.blk[i2][i1] > 0) { 102 int y = i2 * rd.height; 103 g.drawImage(rd.image[rd.blk[i2][i1]-1], x, y, this); 104 } 105 } 106 } 107 } 108 } 109 // マウスイベントの処理 110 class Mouse extends MouseAdapter { 111 // ボタンが押されたとき 112 public void mousePressed(MouseEvent e) { 113 if (!jump) { 114 up = 1.0; 115 down = 0.5; 116 hr.v_x = 2.0; 117 jump = true; 118 hr.y--; // 着地判定のため,1 ピクセルだけジャンプさせておく 119 } 120 } 121 // ボタンが離されたとき 122 public void mouseReleased(MouseEvent e) { 123 up = 0.0; 124 down = 0.5; 125 } 126 } 127 }
001 package game;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import main.*;
007
008 public class GamePanel extends JPanel implements Runnable
009 {
010 Dimension size; // パネルの大きさ
011 MainPanel mp;
012 Thread td;
013 boolean in_game = true;
014 Hero hr; // 主人公
015 Road rd; // 背景(道)
016 double up = 0; // 上向き加速度
017 double down = 0; // 下向き加速度
018 boolean jump = false; // ジャンプ中か?
019 // コンストラクタ
020 public GamePanel(Dimension size1, MainPanel mp1)
021 {
022 size = size1;
023 mp = mp1;
024 // レイアウトマネージャの停止
025 setLayout(null);
026 // 背景色の設定
027 setBackground(Color.white);
028 // 主人公と道の生成
029 rd = new Road(size, mp);
030 hr = new Hero(size, rd, mp);
031 // スレッドの生成
032 td = new Thread(this);
033 td.start();
034 // マウスリスナの追加
035 addMouseListener(new Mouse());
036 }
037 // スレッドの実行
038 public void run()
039 {
040 while (in_game) {
041 try {
042 td.sleep(30);
043 }
044 catch (InterruptedException e) {}
045 // 移動と再描画
046 hr.v_y += (up - down);
047 hr.x += (int)hr.v_x;
048 hr.y -= (int)hr.v_y;
049 rd.x += (int)rd.v_x;
050 repaint();
051 // 道の状態のチェック
052 int x = (hr.x - rd.x + hr.width / 2) / rd.width;
053 // ジャンプ中
054 if (jump) {
055 if (x >= rd.col) {
056 in_game = false;
057 mp.state = 3; // ゲームオーバー
058 }
059 else {
060 int y = (hr.y + hr.height) / rd.height;
061 if (y >= 0) {
062 if (y < rd.row && rd.blk[y][x] > 0) {
063 jump = false;
064 down = 0.0;
065 hr.v_x = 1.0;
066 hr.v_y = 0.0;
067 hr.y = size.height - rd.height * rd.r_no - hr.height;
068 if (rd.blk[y][x] == 2) {
069 in_game = false;
070 mp.state = 2; // ゲームクリア
071 }
072 }
073 else if (y >= rd.row - rd.r_no) {
074 in_game = false;
075 mp.state = 3; // ゲームオーバー
076 }
077 }
078 }
079 }
080 // ジャンプ中でない
081 else {
082 int y = (hr.y + hr.height + rd.height / 2) / rd.height;
083 if (x >= rd.col || rd.blk[y][x] == 0) {
084 in_game = false;
085 mp.state = 3; // ゲームオーバー
086 }
087 else if (rd.blk[y][x] == 2) {
088 in_game = false;
089 mp.state = 2; // ゲームクリア
090 }
091 }
092 }
093 }
094 // 描画
095 public void paintComponent(Graphics g)
096 {
097 super.paintComponent(g); // 親クラスの描画
098 // 主人公の描画
099 g.drawImage(hr.image, hr.x, hr.y, this);
100 // 背景の描画
101 for (int i1 = 0; i1 < rd.col; i1++) {
102 int x = rd.x + rd.width * i1;
103 if (x + rd.width >= 0 && x <= size.width) {
104 for (int i2 = 0; i2 < rd.row; i2++) {
105 if (rd.blk[i2][i1] > 0) {
106 int y = i2 * rd.height;
107 g.drawImage(rd.image[rd.blk[i2][i1]-1], x, y, this);
108 }
109 }
110 }
111 }
112 }
113 // マウスイベントの処理
114 class Mouse extends MouseAdapter {
115 // ボタンが押されたとき
116 public void mousePressed(MouseEvent e) {
117 if (!jump) {
118 up = 1.0;
119 down = 0.5;
120 hr.v_x = 2.0;
121 jump = true;
122 hr.y--; // 着地判定のため,1 ピクセルだけジャンプさせておく
123 }
124 }
125 // ボタンが離されたとき
126 public void mouseReleased(MouseEvent e) {
127 up = 0.0;
128 down = 0.5;
129 }
130 }
131 }
23 行目,30 ~ 31 行目,51 ~ 54 行目,60 ~ 63 行目,72 行目
MainPanel.java
01 package main; 02 03 import java.awt.*; 04 import java.awt.event.*; 05 import javax.swing.*; 06 import start.*; 07 import game.*; 08 import clear.*; 09 import over.*; 10 11 public class MainPanel extends JPanel implements Runnable 12 { 13 Dimension size; // パネルの大きさ 14 boolean in_game = true; // ゲーム実行中はtrue 15 public int state = 0; // ゲーム状態(0:表紙,1:ゲーム,2:クリア,3:オーバー,4:終了) 16 public int level = 1; // ゲームレベル 17 int old_state = 0; // 直前のゲーム状態 18 StartPanel sp; 19 GamePanel gp; 20 GameClearPanel gcp; 21 GameOverPanel gop; 22 Thread td; 23 BGMPlayer BGM; 24 // コンストラクタ 25 public MainPanel(Dimension size1) 26 { 27 size = size1; 28 // グリッドレイアウト 29 setLayout(new GridLayout(1, 1, 0, 0)); 30 // BGM の準備 31 BGM = new BGMPlayer(); 32 // ゲームパネルの生成 33 sp = new StartPanel(size, this); // スタート(タイトル) 34 add(sp); 35 // スレッドの生成 36 td = new Thread(this); 37 td.start(); 38 } 39 // ゲームの状態を変更 40 public void run() 41 { 42 while (in_game) { 43 try { 44 td.sleep(100); // 100 ms 毎の実施 45 } 46 catch (InterruptedException e) {} 47 if (state != old_state) { 48 // 前のパネルの削除 49 if (old_state == 0) 50 remove(sp); 51 else if (old_state == 1) { 52 remove(gp); 53 BGM.player.stop(); // BGM を止める 54 } 55 else if (old_state == 2) 56 remove(gcp); 57 else 58 remove(gop); 59 // 新しいパネルの追加 60 if (state == 4) { // ゲーム終了 61 in_game = false; 62 BGM.player.close(); // BGM を閉じる 63 } 64 else { 65 if (state == 0) { // StartPanel 66 sp = new StartPanel(size, this); 67 add(sp); 68 } 69 else if (state == 1) { // GamePanel 70 gp = new GamePanel(size, this); 71 add(gp); 72 BGM.player.start(); // BGM をスタート 73 } 74 else if (state == 2) { // GameClearPanel 75 gcp = new GameClearPanel(size, this); 76 add(gcp); 77 } 78 else { // GameOverPanel 79 gop = new GameOverPanel(size, this); 80 add(gop); 81 } 82 validate(); 83 old_state = state; 84 } 85 } 86 } 87 } 88 }
BGMPlayer.java(新規作成)
01 package main; 02 03 import java.io.*; 04 import javax.sound.midi.*; 05 06 /**********************/ 07 /* BGM の再生(MIDI) */ 08 /**********************/ 09 public class BGMPlayer 10 { 11 Sequencer player; 12 13 BGMPlayer() 14 { 15 try 16 { 17 player = MidiSystem.getSequencer(); 18 Sequence sqc = MidiSystem.getSequence(new File("Action_BGM.mid")); 19 player.setSequence(sqc); 20 player.setLoopCount(Sequencer.LOOP_CONTINUOUSLY); // 無限界演奏 21 player.open(); 22 } 23 catch (Exception e) 24 { 25 System.out.println(e); 26 } 27 } 28 }
情報学部 | 菅沼ホーム | Java 目次 | 索引 |