| 情報学部 | 菅沼ホーム | 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("アクションゲーム(その1)");
}
}
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 g.drawImage(rd.image, rd.x, rd.y, this);
052 g.drawImage(hr.image, hr.x, hr.y, this);
053 }
054 // マウスイベントの処理
055 class Mouse extends MouseAdapter {
056 // ボタンが押されたとき
057 public void mousePressed(MouseEvent e) {
058 in_game = false;
059 mp.state = 2;
060 }
061 }
062 }
063
064 package game;
065
066 import java.awt.*;
067 import main.*;
068
069 class Hero
070 {
071 Image image; // 主人公画像
072 int x, y; // 主人公の位置
073 double v_x = 1; // 主人公の水平方向移動速度
074 int width = 32; // 主人公画像の幅
075 int height = 52; // 主人公画像の高さ
076 // コンストラクタ
077 Hero(Dimension size, Road rd, MainPanel mp)
078 {
079 // 主人公画像の読み込み
080 image = mp.getToolkit().getImage("game/image/char.jpg");
081 // 主人公の初期位置
082 x = 0;
083 y = size.height - rd.height - height;
084 }
085 }
086
087 package game;
088
089 import java.awt.*;
090 import main.*;
091
092 class Road
093 {
094 Image image; // 背景
095 int x, y; // 背景の位置
096 double v_x = -2; // 背景の水平方向移動速度
097 int width; // 背景画像の幅
098 int height; // 背景画像の高さ
099 // コンストラクタ
100 public Road(Dimension size, MainPanel mp)
101 {
102 // 背景の読み込み
103 if (mp.level == 1) {
104 image = mp.getToolkit().getImage("game/image/road1.jpg");
105 width = 643;
106 height = 102;
107 }
108 else {
109 image = mp.getToolkit().getImage("game/image/road2.jpg");
110 width = 557;
111 height = 102;
112 }
113 // 背景の初期位置
114 x = 0;
115 y = size.height - height;
116 }
117 }
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;
}
}
}
001 package game;
002
003 import java.awt.*;
004 import main.*;
005
006 class Road
007 {
008 Image image; // 背景
009 int x, y; // 背景の位置
010 double v_x = -2; // 背景の水平方向移動速度
011 int width; // 背景画像の幅
012 int height; // 背景画像の高さ
013 int s1[][] = {{147, 0}, {204, 1}, {352, 0}, {494, 1}, {642, 10}};
014 int s2[][] = {{73, 0}, {139, 1}, {213, 0}, {330, 1}, {404, 0}, {482, 1}, {556, 10}};
015 int state[][]; // 背景(道)の状態
016 // state[i][0] : 状態変化の終了位置
017 // state[i][1] : 道の状態
018 // =0 : 道
019 // =1 : 谷
020 // =10 : ゴール
021 // コンストラクタ
022 public Road(Dimension size, MainPanel mp)
023 {
024 // 背景の読み込みと状態設定
025 if (mp.level == 1) {
026 image = mp.getToolkit().getImage("game/image/road1.jpg");
027 state = s1;
028 width = 643;
029 height = 102;
030 }
031 else {
032 image = mp.getToolkit().getImage("game/image/road2.jpg");
033 state = s2;
034 width = 557;
035 height = 102;
036 }
037 // 背景の初期位置
038 x = 0;
039 y = size.height - height;
040 }
041 }
042
043 package game;
044
045 import java.awt.*;
046 import java.awt.event.*;
047 import javax.swing.*;
048 import main.*;
049
050 public class GamePanel extends JPanel implements Runnable
051 {
052 Dimension size; // パネルの大きさ
053 MainPanel mp;
054 Thread td;
055 boolean in_game = true;
056 Hero hr; // 主人公
057 Road rd; // 背景(道)
058 // コンストラクタ
059 public GamePanel(Dimension size1, MainPanel mp1)
060 {
061 size = size1;
062 mp = mp1;
063 // レイアウトマネージャの停止
064 setLayout(null);
065 // 背景色の設定
066 setBackground(Color.white);
067 // 主人公と道の生成
068 rd = new Road(size, mp);
069 hr = new Hero(size, rd, mp);
070 // スレッドの生成
071 td = new Thread(this);
072 td.start();
073 // マウスリスナの追加
074 addMouseListener(new Mouse());
075 }
076 // スレッドの実行
077 public void run()
078 {
079 while (in_game) {
080 try {
081 td.sleep(30);
082 }
083 catch (InterruptedException e) {}
084 // 移動と再描画
085 hr.x += (int)hr.v_x;
086 rd.x += (int)rd.v_x;
087 repaint();
088 // 道の状態のチェック
089 int p = hr.x - rd.x + hr.width / 2, sw = -1;
090 for (int i1 = 0; i1 < rd.state.length && sw < 0; i1++) {
091 if (p <= rd.state[i1][0])
092 sw = rd.state[i1][1];
093 }
094 if (sw < 0)
095 sw = 1;
096 if (sw > 0) {
097 in_game = false;
098 if (sw == 1)
099 mp.state = 3; // ゲームオーバー
100 else
101 mp.state = 2; // ゲームクリア
102 }
103 }
104 }
105 // 描画
106 public void paintComponent(Graphics g)
107 {
108 super.paintComponent(g); // 親クラスの描画
109 g.drawImage(rd.image, rd.x, rd.y, this);
110 g.drawImage(hr.image, hr.x, hr.y, this);
111 }
112 // マウスイベントの処理
113 class Mouse extends MouseAdapter {
114 // ボタンが押されたとき
115 public void mousePressed(MouseEvent e) {
116 in_game = false;
117 mp.state = 2;
118 }
119 }
120 }
state[0][0] = 147; // 0 から 147 ピクセルまでは道 state[0][1] = 0; state[1][0] = 204; // 148 から 204 ピクセルまでは谷 state[1][1] = 1; ・・・・・ state[4][0] = 642; // 495 から 642 ピクセルまではゴール state[4][1] = 10;
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};
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 - 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 p = hr.x - rd.x + hr.width / 2, sw = -1;
078 for (int i1 = 0; i1 < rd.state.length && sw < 0; i1++) {
079 if (p <= rd.state[i1][0])
080 sw = rd.state[i1][1];
081 }
082 if (sw < 0)
083 sw = 1;
084 if (sw > 0) {
085 in_game = false;
086 if (sw == 1)
087 mp.state = 3; // ゲームオーバー
088 else
089 mp.state = 2; // ゲームクリア
090 }
091 */
092 }
093 }
094 // 描画
095 public void paintComponent(Graphics g)
096 {
097 super.paintComponent(g); // 親クラスの描画
098 g.drawImage(rd.image, rd.x, rd.y, this);
099 g.drawImage(hr.image, hr.x, hr.y, this);
100 }
101 // マウスイベントの処理
102 class Mouse extends MouseAdapter {
103 // ボタンが押されたとき
104 public void mousePressed(MouseEvent e) {
105 if (!jump) {
106 up = 1.0;
107 down = 0.5;
108 hr.v_x = 2.0;
109 jump = true;
110 hr.y--; // 着地判定のため,1 ピクセルだけジャンプさせておく
111 }
112 }
113 // ボタンが離されたとき
114 public void mouseReleased(MouseEvent e) {
115 up = 0.0;
116 down = 0.5;
117 }
118 }
119 }
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 // 水平位置のチェック
053 int p = hr.x - rd.x + hr.width / 2, sw = -1;
054 for (int i1 = 0; i1 < rd.state.length && sw < 0; i1++) {
055 if (p <= rd.state[i1][0])
056 sw = rd.state[i1][1];
057 }
058 if (sw < 0) // ゴールを通過
059 sw = 1;
060 // 垂直位置のチェック
061 else {
062 if (jump) {
063 if (hr.y >= size.height - rd.height - hr.height) {
064 if (sw == 0 || sw == 10) {
065 jump = false;
066 down = 0.0;
067 hr.v_x = 1.0;
068 hr.v_y = 0.0;
069 hr.y = size.height - rd.height - hr.height;
070 }
071 }
072 else
073 sw = 0;
074 }
075 }
076 // ゲーム状態変更
077 if (sw > 0) {
078 in_game = false;
079 if (sw == 1)
080 mp.state = 3; // ゲームオーバー
081 else
082 mp.state = 2; // ゲームクリア
083 }
084 }
085 }
086 // 描画
087 public void paintComponent(Graphics g)
088 {
089 super.paintComponent(g); // 親クラスの描画
090 g.drawImage(rd.image, rd.x, rd.y, this);
091 g.drawImage(hr.image, hr.x, hr.y, this);
092 }
093 // マウスイベントの処理
094 class Mouse extends MouseAdapter {
095 // ボタンが押されたとき
096 public void mousePressed(MouseEvent e) {
097 if (!jump) {
098 up = 1.0;
099 down = 0.5;
100 hr.v_x = 2.0;
101 jump = true;
102 hr.y--; // 着地判定のため,1 ピクセルだけジャンプさせておく
103 }
104 }
105 // ボタンが離されたとき
106 public void mouseReleased(MouseEvent e) {
107 up = 0.0;
108 down = 0.5;
109 }
110 }
111 }
if (hr.y == size.height - rd.height - hr.height) {
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 目次 | 索引 |