ちょー簡単RPG講座。その6-画面遷移4。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

ちょー簡単RPG講座。その6-画面遷移4。

投稿記事 by softya(ソフト屋) » 14年前

前の状態遷移図が少し嘘になったので改訂版です。
ゲーム状態遷移図.png
ゲーム状態遷移図.png (32.26 KiB) 閲覧数: 13250 回
[main.cpp] その2です。
今度は先頭の方から作っていきます。

まず、ヘッダを2つ追加します。

CODE:

#include "comsub.h"
#include "gameMain.h"
1つは共通関数を登録する物で、もうひとつはゲーム本編用です。
また別に説明しますね。

次に、ゲーム全体の管理データの実体を定義します。

CODE:

//----------------------------------------------------------------------
//    変数
//----------------------------------------------------------------------

//    ゲーム全体の管理データ(実体)
MainData_t g_MainData;
こっからは全て追加関数です。
●GetCheckHitKeyAll_2()
メインループに出てきたANY KEYの処理です。
何れかのキーが押されているとカウントアップで、離すと0になります。
GetHitKeyStateAll_2の全キー版と思ってください。

CODE:

//----------------------------------------------------------------------
//    何かキーが押され続けたカウントを取得する。全キー対象
//    カウントが1かどうか聞けば、
//----------------------------------------------------------------------
static void GetCheckHitKeyAll_2(int *HitCount)
{
    //    何かキーが押された?
    if( CheckHitKeyAll() > 0 ) {
        //    押されている間カウントする。
        (*HitCount)++;
    } else {
        //    開放されたら0に戻す。
        (*HitCount) = 0;
    }
}
●MainInit()
ゲーム全体の管理データの初期値を設定しています。

CODE:

//----------------------------------------------------------------------
//    ゲームの各種値を初期化
//----------------------------------------------------------------------
void MainInit()
{
    g_MainData.gameState = GAME_STATE_TITLE;    //タイトル画面でスタート
    
    
}

●Title()、NameInput()、GameOver()、Ending()

現状は同じような処理なので、まとめて解説します。
CenterDrawString()は画面の中央に表示する共通関数です。同じような処理が多いのでまとめてみました。
全て関数は、画面の文字を表示して、特定のキーが押されたら状態を遷移する処理になっています。
状態の変更は戻り値で行ないます。状態を継続する場合は、ゲーム全体の管理データに入っているgameStateの値を戻り値として戻す事で現在の状態を維持しています。

CODE:

//----------------------------------------------------------------------
//    タイトル画面
//----------------------------------------------------------------------
GameState_t Title()
{
    //    センター上気味にタイトル文字表示
    CenterDrawString( GAME_TITLE_STR, 32, 160, GetColor(255,255,255) );

    //    HIT ANY KEY
    CenterDrawString( "HIT ANY KEY", 20, 240, GetColor(155,155,255) );
    
    //    何かキーが押された?
    if( g_MainData.AllKeyCount == 1 ) {
        //    次のフレームは名前入力へ
        return GAME_STATE_NAME;
    }

    //    継続
    return g_MainData.gameState;
}

//----------------------------------------------------------------------
//    名前入力
//----------------------------------------------------------------------
GameState_t NameInput()
{
    //    名前入力画面のダミー
    CenterDrawString( "なまえ の にゅうりょく", 20, 120, GetColor(255,255,255) );
    CenterDrawString( "なまえ:そふとや", 20, 200, GetColor(255,255,255) );
    CenterDrawString( "HIT ANY KEY", 20, 280, GetColor(155,155,255) );
    
    //    何かキーが押された?
    if( g_MainData.AllKeyCount == 1 ) {
        //    次のフレームはゲーム本編へ
        return GAME_STATE_MAIN;
    }
    
    //    継続
    return g_MainData.gameState;
}

//----------------------------------------------------------------------
//    ゲームオーバー
//----------------------------------------------------------------------
GameState_t GameOver()
{
    //    ゲームオーバーの表示
    CenterDrawString( "あなたは しんでしまった。", 28, 160, GetColor(255,255,255) );
    
    //    HIT ANY KEY
    CenterDrawString( "HIT ANY KEY", 20, 280, GetColor(155,155,255) );
    
    //    何かキーが押された?
    if( g_MainData.AllKeyCount == 1 ) {
        //    次のフレームはゲーム本編へ
        return GAME_STATE_MAIN;
    }
    
    //    継続
    return g_MainData.gameState;
}

//----------------------------------------------------------------------
//    エンディング
//----------------------------------------------------------------------
GameState_t Ending()
{
    //    エンディングの表示
    CenterDrawString( "ゲームクリア おめでとう!", 28, 200, GetColor(255,255,255) );
    
    //    HIT ANY KEY
    CenterDrawString( "HIT ANY KEY", 20, 320, GetColor(155,155,255) );
    
    //    何かキーが押された?
    if( g_MainData.AllKeyCount == 1 ) {
        //    次のフレームはゲームタイトルへ
        return GAME_STATE_TITLE;
        
    }
    //    継続
    return g_MainData.gameState;
}

以上でmain.cppを終わります。
まだ続きます。
最後に編集したユーザー softya(ソフト屋) on 2010年11月27日(土) 00:55 [ 編集 2 回目 ]

コメントはまだありません。