音楽ゲーム −ライブラリ編−



 まずはゲームをプレイするのに必要な機能を書き出しますが、 その前に実際の動作の概要を考えます。下のアクティビティ図はゲームプレイ時 の簡単な動作の流れを書き出したものです。ライブラリ部分とGUI部分の パーティションを分けておくと先にライブラリ部分を作るのに便利です。



 このゲームではゲームスタート後は図の通り、BGM再生、見逃し監視、 入力タイミングのラベルの作成に加えて画面の描画用のスレッドが動作します。 また、キー押下時に表示する評価はキーを押すたびに表示させ、なおかつ 表示開始から何秒かは表示させておくので時間がかかります。なのでこの部分は イベント処理にせずに独立したスレッドにします。よって計5つのスレッドが 同時に動作することになります。
 プレイ中の動作は基本的に1つのクラス、Managerクラスで行います。ただ、 Scorerを継承した 採点用クラスが別に必要になります。これは今回は基準点を4つつくり、入力時間 とタイミングリストの時間差によってどの基準点を採用するかというような作りに しています。加えて最高評価の連続回数でボーナス点を与えたり、使用するキー数 によって基準点に修正を与えたりしています。
public class TMScorer extends Scorer
{
    // 最高評価時の基準点数
    private int BEST = 100;
    
    // 通常評価時の基準点数
    private int NORMAL = 50;
    
    // 悪い評価時の基準点数
    private int BAD = -50;
    
    // 最悪評価時の基準点数
    private int WORST = -100;
    
    // 評価BESTが連続して続いた回数
    private int bestNum = 0;
    
    public int score(TimingLane lane)
    {
        if(!lane.hasNextTiming())
            return 0;
        
        int def = lane.input();
        
        if(def<200)    // 差が200ms以内
        {
            // 点数はBEST+0.05×連続BEST回数の1の位の値
            int point = (int)(BEST*(1+0.05*(bestNum%10)));
            // BESTの連続10回毎に(連続数÷10の整数値)×BEST×2のボーナス店を加点
            if(bestNum%10==0)
                point+=bestNum/10*BEST*2;
            currentScore+=point;
            lane.setNextTiming();
            return point;
        }
        else if(def<400)    // 差が400ms以内
        {
            currentScore+=NORMAL;
            lane.setNextTiming();
            bestNum = 0;
            return NORMAL;
        }
        else if(def<600)    // 差が600ms以内
        {
            currentScore+=BAD;
            bestNum = 0;
            return BAD;
        }
        else    // 差が600ms以上
        {
            currentScore+=WORST;
            bestNum = 0;
            return WORST;
        }
    }
    
    public void miss()
    {
        currentScore+=BAD;
        bestNum = 0;
        manager.updateScore();
    }
}
 また、上のアクティビティ図であるとおり、採点結果によって行う処理 がありますが、GUI部分を下位のライブラリと切り離すために評価を 表示するクラスと得点を表示するクラスはインタフェースを作り、GUI コンポーネントクラスがそれらを実装することでライブラリ部分から GUI側を不可視化しています。そのインタフェースが、Evaluater インタフェースとScoreBoardインタフェースです。これらはManager クラス内で使用します。
 残りの機能は全てManagerクラス内で定義しています。結構メソッド数が 多いので使用方法はサンプルのGUIクラス等を参照してください。


それでは最後にGUIを作成させつつ、これまでに用意したライブラリを 使用した1つのゲームを完成させます。


GUI編へ

メニューに戻る inserted by FC2 system