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



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


 テーマはアクションゲームです。
 下記の要領で段階的にプログラムを作成していきます。
 演習時間: 50分。

遊び方

左右カーソルキーで操作。 スペースキーでジャンプ。 [s]キーで再スタート。 すべてのアイテム(★)を集めるとクリア。 5人失敗するとゲームオーバー。

Eclipseを使う

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

作成方法

Anim2Dクラス にのみ追加・編集していきます。 枠内の命令をコピーし、eclipseの該当箇所に貼り付けて下さい。

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

通常ゲーム、アニメーションでは1秒あたり数十回も画像を生成・表示することで動いているようにみせます。 パラパラ漫画の要領です。 このアクションゲームでは
@横スクロール背景表示
H床表示
Dアイテム表示
F敵キャラの移動・表示
キャラクタの移動・表示
  BC移動+ジャンプ
  EGアイテムゲット?+あたり判定
  A表示
ゲーム情報の表示とゲーム管理
を何度も繰り返します。 1コマにつき少しずつキャラクタが動いてきます。

@横スクロール背景表示

// 1. 横スクロール背景表示 の下に、

bg.draw(g, this);
を追加。

Aキャラクタの表示

// 2. 表示 の下に、

chara.draw(g, this, bg);
を追加。

BC移動+ジャンプ

// 3.4. 移動+ジャンプ の下に、

chara.move(false, bg, floor);
を追加。 次に、上の「false」の部分を

chara.move(button, bg, floor);
と変更。

Dアイテム表示

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

for (int  i=0;  i < item.length;  i++) {
      if (item[i].view(bg)) {
        item[i].move();
        item[i].draw(g, this, bg);
      }
}
を追加。

Eアイテムゲット?

// 6. アイテムゲット? の下に、

chara.checkItem(item);
を追加。

F敵キャラの移動・表示

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

for (int  i=0;  i < enemy.length;  i++) {
      enemy[i].move(bg);             // 移動
      if ( enemy[i].view(bg) )  enemy[i].draw(g, this, bg);  // 表示
}
を追加。

Gあたり判定

// 8. あたり判定 の下に、

if ( chara.collision(enemy) ) init();
を追加。

H床表示

// 9. 床表示 の下に、

for (int  i=0;  i < floor.length;  i++) {
      if (floor[i].view(bg)) {
        floor[i].move();             // 移動
        floor[i].draw(g, this, bg);  // 表示
      }
}
を追加。

ゲームの改良

// 10. ゲームの構成(初期設定・演習用) において、

enemy = new  Enemy[4];  // 敵キャラ生成: (id, x, y, w, st, type)
enemy[0] = new  Enemy(0, 400,   GP.groundY, 0, Enemy.E0);
enemy[1] = new  Enemy(1, 800,   GP.groundY, 1, Enemy.E1);
enemy[2] = new  Enemy(2, 1000,  GP.groundY, 2, Enemy.E2);
enemy[3] = new  Enemy(3, 1000,  GP.groundY, 2, Enemy.E3);
を編集。 最初の2つは位置(x,y)、stは歩行スピード、E0,E1,E2,E3は敵キャラの種類。 あるいは

floor = new  Floor[3];  // 床生成: (id, x, y, w, type)
floor[0] = new  Floor(0, 0,   GP.groundY,         GP.CW*4, GP.STOP);
floor[1] = new  Floor(1, 400, GP.groundY-GP.CH*1, GP.CW*4, GP.UP);
floor[2] = new  Floor(2, 600, GP.groundY-GP.CH*1, GP.CW*4, GP.LEFT);
を編集。

完成版

// 12. 完成版にするならコメント//を前につける において、

// init_test();  
とコメント「//」を追加すると、完成版ゲームを楽しめます。 ※プログラムの上の方にあります。

完成版


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

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

情報科学部では・・・

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

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


3年生(H20)の作品

アンケート

webアンケート