ゲームプログラミング体験演習(10/06/08)

 「ソフトウェア演習U(3年前期)」という講義の内容より
 javaによるゲーム/アニメーションプログラミング


 今回のテーマは「アクションゲーム」です。
 下記の要領で段階的にプログラムを作成していきます。
 プログラムの知識は不要です。作成した処理(命令)をくっつけるという最後の仕上げをしてもらいます。
 演習時間の目安:60分。

ゲーム概要

任天堂のスーパーマリオ風のアクションゲームです。 左右カーソルキーで操作。 上カーソルキー(スペースキー)でジャンプ。 [s]キーで再スタート。 すべてのアイテム(★)を集めるとクリア。 5人失敗するとゲームオーバー。 制限時間有。 完成版のステージは4面まで用意しています。 最後にボスが出てきます。


Eclipseを使う

■前準備  javaによるソフトウェア開発環境であるEclipseを起動し、新規「プロジェクト」を作成します。名前はたとえば「gp」。 「action_en.zip」をダウンロードし、フォルダを解凍します。場所はデスクトップでかまいません。 eclipseのパッケージエクスプローラ上の「gp」に対し、 「action_en」フォルダの中身をコピーします。 ■翻訳(コンパイル)・実行  パッケージエクスプローラ上の「Anim2Dfr」にマウスをあわせて右クリックで 「実行」「javaアプリケーションの実行」とすれば、ウインドウがあがり、ゲームを実行できます。 この後は、プログラムを編集し、同様の実行を行えば変更の加わったプログラムが起動します。

プログラム作成方法

 Anim2Dfr(Anim2D)クラス にのみ追加・編集していきます。 以下の黄色の枠内の命令をコピーし、eclipseの該当箇所に貼り付けて下さい。 段階的に命令を追加して完成させていきましょう。

処理全体の流れをつかもう

 通常ゲーム、アニメーションでは1秒あたり数十回も画像を生成・表示することで動いているようにみせます。 パラパラ漫画の要領です。 このアクションゲームでは1コマ分の処理は以下のようになります。

@横スクロール背景表示
Cアイテム表示
E床表示
F敵キャラの移動・表示
キャラクタの移動・表示
  B移動+ジャンプ
  Dアイテムゲット?
  Gあたり判定
  A表示
ゲーム情報の表示とゲーム管理
あとはこの命令群を何度も繰り返すだけです。

@横スクロール背景表示

// 1. 横スクロール背景表示 の下に、
bg.draw();
を追加。

Aキャラクタの表示

// 2. 表示 の下に、
chara.draw();
を追加。

B移動

// 3. 移動+ジャンプ の下に、
chara.move(false, floor);
を追加。

Cアイテム表示

// 4. アイテム表示 の下に、

for (int  i=0;  i < item.length;  i++) {
        item[i].move();
        item[i].draw();
}
を追加。 <解説> 「for」とは繰り返す処理です。この場合、複数のアイテムを繰り返し移動・描画します。

Dアイテムゲット?

//5. アイテムゲット? の下に、
chara.checkItem(item);
を追加。 <解説> キャラクタとアイテムの位置が近ければゲットしたと判定します。

E床表示

// 6. 床表示 の下に、
for (int  i=0;  i < floor.length;  i++) {
        floor[i].move();  // 移動
        floor[i].draw();  // 表示
}
を追加。 <解説> 「for」で複数の動く床、動かない床を描きます。

Bジャンプ

3. の「false」の部分を

chara.move(button, floor);
と変更するとジャンプ可能になる。 <解説> これで床に乗れたり、高い位置のアイテムをとることができるようになります。

F敵キャラの移動・表示

// 7. 敵キャラの移動・表示 の下に、

for (int  i=0;  i < enemy.length;  i++) {
      enemy[i].move();  // 移動
      enemy[i].draw();  // 表示
}
を追加。 <解説> 「for」により繰り返し複数の敵キャラを移動・描画します。

Gあたり判定

// 8. あたり判定 の下に、
if ( chara.collision(enemy) ) 
 { chara.resetTime();  mode = 4; }
を追加。 <解説> もし敵キャラとの位置が近ければライフが1つ減り、初期化されます。 「if」は「もし」という意味そのままで、もし画面内にいれば敵キャラを描くことになります。

Hゲームの改良

// 9. ゲームの構成変更(初期設定・演習用) において、
// 4つの敵キャラ生成: (id, s, x, y, w, st, type の順に記述)
// E0: 静止 / E1: 左移動 / E2: 左にはねる / E3: 上下移動
enemy = new  Enemy[4];  // 4つ
enemy[0] = new  Enemy(0, 0,  8,  0, 0, Enemy.E0);
enemy[1] = new  Enemy(1, 1,  0,  0, 1, Enemy.E1);
enemy[2] = new  Enemy(2, 1,  5,  0, 2, Enemy.E2);
enemy[3] = new  Enemy(3, 1,  8,  0, 2, Enemy.E3);
を編集してみましょう。 <解説> 4つの敵キャラを生成。 位置(x,y)、stは歩行スピード、E0,E1,E2,E3は敵キャラの種類を表します。 Enemy(2, 1, 5, 0, 2, Enemy.E2) ・ID...    2番 ・位置...   出現位置は、シーン1, 座標(5, 0)から ・速度...   2 ・種類...   E2 =左にはねる あるいは
// 床生成: (id, s, x, y, w, type の順に記述)
floor = new  Floor[3];  // 3つ
floor[0] = new  Floor(0, 0, 12,  0,  4, P.STOP);
floor[1] = new  Floor(1, 1,  0,  0,  4, P.LEFT);
floor[2] = new  Floor(2, 1, 10,  0,  4, P.UP);
を編集してみましょう。 <解説> 3つの床を生成。 位置(x,y)、wは床の長さ、typeは床の動き表します。 Floor(1, 1, 0, 0, 4, P.LEFT) ・ID...    1番 ・位置...   シーン1, 座標(0, 0)から ・長さ...   4 =キャラクタ幅の4倍の長さ ・種類...   P.LEFT =左へ移動する床

完成版

完成版の実行方法は演習の最後に教えます。 また、iアプリ版もありますので帰ってからダウンロードしてみてください。 iアプリ版はこちらアクションゲーム(iアプリ版) http://www.is.kyusan-u.ac.jp/~yonemoto/i/actiongame/Download.html を携帯で打ち込み、クリック


プログラムのさらなる改良

・敵の種類の追加。さまざまな動きの定義が考えられます。
・アイテムの追加。とると攻撃が可能、等。
・ステージの追加
・エンディングの追加
・サウンド追加・・・グラフィックスの講義なのであえて音は鳴らしませんでした。

情報科学部では・・・

今回題材がたまたまゲームでしたが、情報科学部ではゲーム性や芸術性の高いも
のを作ることを目的としません。

情報科学部では「情報の表現方法」、「アルゴリズム」や「データ構造」という
プログラムを作成するための基礎をゲームプログラミングを通して勉強していきます。