ゲームとしての体裁を整えていこう!

エディタ(導入必須)

繰り返しになりますが、エディタの導入をお願いします。

エディタは、プログラムを書くためのソフトです。
テキストの、ツール・素材の紹介ページにエディタがありますので、ダウンロードして使いましょう。
こちらです。

特に、Windows の方は xyzzy を必ず使って下さい。
本格的にプログラムを書く上で、ちゃんとしたエディタを使うことは欠かせません。
絶対にメモ帳を使ってはいけません。

※勘違いしている方が多いようですが、メモ帳などのエディタはあくまで 「テキストファイルを編集するためのソフト」です。
メモ帳で保存したからといって、保存するデータが変わるわけではありません。
メモ帳で保存しても、xyzzy で保存しても、保存される .java ファイルの形式は変わりません。

しかし、メモ帳を使って作業をされると、今後困りますので、極力 xyzzy を使うようにしてください。

プログラミングが苦手で、上手くいかず質問してくる人ほど xyzzy を使っていないケースが多く、非常に困ります
自力でできず、TA・SAに質問しようという人は、必ず xyzzy を使うようにして下さい。

タイトル画面を作る

まず、本日の講義資料をダウンロードしてください。
第4回資料(Windows用)
第4回資料(Mac用)

今までの授業で作ってきたテニスゲームに、タイトル画面を追加してみます。
ダウンロードした資料を解凍して、Sample01フォルダ直下にあるgame.javaを開いて下さい。

/********* 変数定義はこちらに *********/

(中略)

// ゲームの状態
int gameState;

/********* 初期化の手順はこちらに *********/
public void initGame()
{

(中略)

    // ゲームの状態を初期化
    gameState = 0;
}
	

ゲームの状態を表す変数が追加され、0で初期化されています。

    /********* 物体の移動等の更新処理はこちらに *********/
public void updateGame()
{
    // タイトル画面
    if(gameState == 0)
    {
        // Enterキーが押されたらゲーム開始
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 1;
        }
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        (中略)
    }
}
	

gameState の中身に応じて、画面が切り替わっています。
今回は、0 がタイトル画面、1 がゲーム画面です。

最初は、gameState の中身が 0 なので、if(gameState == 0) が真となり、タイトル画面の部分が実行されます。
Enterキーが押されると、gameState の中身は 1 となります。
gameState の中身が 1 の場合、else if(gameState == 1) の方が真となり、ゲーム画面の部分が実行されます。
(ゲーム画面部分の処理は、前回までにやった内容と同じです)

このように、画面に応じてゲームの状態が切り替わっていくことを、シーン遷移といいます。

/********* 画像の描画はこちらに *********/
public void drawGame()
{
    // 画面を白で塗りつぶします
    gc.clearScreen();

    // タイトル画面
    if(gameState == 0)
    {
        // タイトル画面の文字を描画
        gc.setColor(0, 0, 0);
        gc.drawString("テニスゲーム", 250, 150);
        gc.drawString("Push Enter" , 260, 250);
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        (中略)
    }
}
	

drawGame も、gameState の中身に応じて場合分けを行っています。

gameState の中身が 0 の場合は、タイトル画面用の文字を描画。
gameState の中身が 1 の場合は、ゲーム画面の描画となります。
(ゲーム画面部分の描画は、前回までにやった内容と同じです)

画面の塗りつぶしは常に行う必要があるので、
gc.clearScreen(); だけは、gameState の中身に関係なく実行されます。

ポーズ画面を追加してみる

プレイ中にEnter キーを押すことで、ポーズできるようにします。
Sample02フォルダ直下にあるgame.javaを開いて下さい。

public void updateGame()
{
    // タイトル画面
    if(gameState == 0)
    {
         (中略)
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        // ENTERキーが押されたらポーズ
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 2;
        }

         (中略)

    }
    // ポーズ画面
    else if(gameState == 2)
    {
        // Enterキーが押されたらゲーム再開
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 1;
        }
    }
}
	

変数定義、変数初期化の部分は、Sample01 と同一です。

今回は、0 がタイトル画面、1 がゲーム画面、2 がポーズ画面です。

ゲーム画面内に、Enterキーが押されたらポーズ画面へと切り替わる処理が追加されました。
if(gc.isKeyPushed(gc.KEY_ENTER)) が真となった場合に、gameState の中身を 2 に書き換えています。

else if(gameState == 2) の部分は、ポーズ画面の処理です。
Enter キーが押された場合、gameState の中身を 1 に書き換え、ゲーム画面へと切り替えています。

/********* 画像の描画はこちらに *********/
public void drawGame()
{
    // 画面を白で塗りつぶします
    gc.clearScreen();

    // タイトル画面
    if(gameState == 0)
    {
        (中略)
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        (中略)
    }
    // ポーズ画面
    else if(gameState == 2)
    {
        // ポーズ画面の文字を描画
        gc.setColor(0, 0, 0);
        gc.drawString("PAUSE", 280, 200);
    }
}
	

drawGame にも、ポーズ画面の描画が追加されました。
gameState の中身が 2 の場合は、ポーズ画面の描画となります。

音楽を鳴らす

ゲームプレイ中に音楽(BGM)を鳴らしてみましょう。
Sample03フォルダ直下にあるgame.javaを開いて下さい。

resフォルダの中に、bgm0.mid, bgm1.mid ファイルがあります。 GameCanvas では、.mid 形式のファイルを音楽(BGM) として利用することが出来ます。
ゲームで使いたい音楽ファイルは、bgm0.mid, bgm1.mid, bgm2.mid ... というファイル名でなければなりません。

playBgm 命令で、音楽を鳴らすことができます。
stopBgm 命令で、鳴っている音楽を停止することができます。
BGMを複数同時に鳴らすことはできませんので、注意して下さい。

では、game.java を見てみましょう。
Sample02からの変更点は、updateGame だけです。

/********* 物体の移動等の更新処理はこちらに *********/
public void updateGame()
{
    // タイトル画面
    if(gameState == 0)
    {
        // Enterキーが押されたらゲーム開始
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 1;

            // ゲーム開始なので、ゲーム画面の音楽を鳴らす
            gc.playBgm(0);
        }
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        // ENTERキーが押されたらポーズ
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 2;

            // ポーズ中は曲を停止
            gc.stopBgm();
        }

        (中略)

    }
    // ポーズ画面
    else if(gameState == 2)
    {
        // Enterキーが押されたらゲーム再開
        if(gc.isKeyPushed(gc.KEY_ENTER))
        {
            gameState = 1;

            // ゲーム開始なので、再び曲を再生
            gc.playBgm(0);
        }
    }
}
	

タイトル画面からゲーム画面に変わる部分では、gc.playBgm(0); を実行して、ゲーム用の BGM を再生しています。
ゲーム画面からポーズ画面に変わる部分では、gc.stopBgm(); を実行して、BGM を停止しています。
ポーズ画面からゲーム画面に変わる部分では、gc.playBgm(0); を実行して、再びゲーム用の BGM を再生しています。

ゲームで使いたい音楽を探す

ゲームで使う音楽ファイル(.mid ファイル)を配布しているサイトをいくつか紹介します。
以下のサイトにある素材を利用する場合には、利用規約に従うよう留意しましょう。

効果音を鳴らす

ゲームプレイ中に効果音(SE)を鳴らしてみましょう。

resフォルダの中に、snd0.wav, snd1.wav ファイルがあります。
GameCanvas では、.wav 形式のファイルを効果音(SE) として利用することが出来ます。
ゲームで使いたい音楽ファイルは、snd0.wav, snd1.wav, snd2.wav ... というファイル名でなければなりません。

playSe 命令を使うと、効果音(SE)を鳴らすことができます。
stopSe 命令で、鳴っている全ての効果音(SE) を停止することができます。
BGM とは違って、同時に複数の効果音を鳴らすことが可能です。

では、game.java を見てみましょう。

/********* 物体の移動等の更新処理はこちらに *********/
public void updateGame()
{
    // タイトル画面
    if(gameState == 0)
    {
        (中略)
    }
    // ゲーム画面
    else if(gameState == 1)
    {
        (中略)

        // ボールと、ラケットが当たった場合に真
        if(gc.checkHitRect(racket_x, racket_y, racket_w, racket_h, ball_x, ball_y, 24, 24))
        {
            // ボールのY方向の速度を反転させる
            ball_speed_y = -ball_speed_y;

            // ラケットに当たったので、効果音を再生する
            gc.playSe(0);
        }
    }
    // ポーズ画面
    else if(gameState == 2)
    {
        (中略)
    }
}
	

ボールとラケットが当たった場合に、gc.playSe(0); を実行して、効果音を再生しています。

ゲームで使いたい効果音を探す

ゲームで使う効果音ファイル(.wav ファイル)を配布しているサイトを紹介します。
以下のサイトにある素材を利用する場合には、利用規約に従うよう留意しましょう。

課題1

今回の授業で学んだ内容を元に、テニスゲームを拡張して下さい。
満たすべき条件は次の通りです。

Kadai01フォルダの中のgame.javaを元に挑戦してみましょう。
answer01.jar ファイルを開くと、どのようにすれば良いか見ることができます。

課題2

課題1を、さらに改良してみましょう。
満たすべき条件は次の通りです。

Kadai02フォルダの中のgame.javaを元に挑戦してみましょう。
answer02.jar ファイルを開くと、どのようにすれば良いか見ることができます。

課題3

課題2を、色々な音が鳴るように改良してみましょう。

例えば、タイトル画面で音楽(BGM)を鳴らしても良いですし、
壁に当たった時やゲームオーバー時に効果音(SE)を鳴らしてもかまいません。
自分なりに色々工夫してみましょう。

戻る