★宝探しゲーム タイトルシーン★


C言語編の「宝探しゲーム」を作ってみましょう。

折角シーンの追加もやりましたので、タイトルシーンから作ってみます。

今回使う画像は↓の画像です。

実際の画像サイズは「1024×1024ピクセル」ですが、大きいので縮小表示しています。

※プロジェクトフォルダの「Resource\\Textureフォルダ」に「Treasure.png」と言うファイル名で保存してください。

※チップ画像は「ぴぽや」さんからお借りしました。


タイトルシーンの追加と設定


システムをダウンロードした段階では、ゲームシーンしかありませんので、先にタイトルシーンを作りましょう。

もう1度だけ、箇条書きで手順を書きますので、設定してみましょう。

1.プロジェクトフォルダの「Sourceフォルダ」→「Sceneフォルダ」を開く。

2.「_SceneSourceフォルダ」を複製する。

3.フォルダ名を「SceneTitle」に変更する。

4.「SceneTitleフォルダ」を開き、「SceneTitle.h」「SceneTitle.cpp」に名前を変更する。

5.Visual Studioにて「Sceneフィルタ」で右クリック、「追加」→「新しいフィルタ」を選択する。

6.フィルタ名を「SceneTitle」に変更する。

7.「SceneTitleフィルタ」で右クリック、「追加」→「既存の項目」を選択する。

8.「SceneTitleフォルダ」を開き、「SceneTitle.h」「SceneTitle.cpp」を選択する。

9.「SceneTitle.h」「SceneTitle.cpp」を開き、クラス名を変更する。

10.「GameData.h」でシーン定数(SCENE_TITLE)を追加する。

11.「Game.h」で「SceneTitle.h」をインクルードする。

12.「Game.cpp」でシーンの遷移を追加します。

設定後の画面を一部載せておきます。


タイトルシーンは追加出来ましたが、最初の設定のままでは実行すると「ゲームシーン」から始まってしまいます。

実行後、最初に実行するシーンを変更するには「SceneInit.cpp」を変更します。

「SceneInit.cpp」の「Update関数」を変更しましょう。

//=============================================================================
// シーンの実行時に繰り返し呼び出される更新処理関数
//=============================================================================
void SceneInit::Update()
{
    //------------------//
    // 最初のシーン設定 //
    //------------------//

    //↓SCENE_GAMEの部分を変更

    m_nowSceneData.Set(Common::SCENE_TITLE, false, NULL);
}

これでタイトルシーンから始まるようになりました。


タイトルシーンの作成


画像の左上にタイトル画面がありますので、まずはそれを転送しましょう。

「GameBase.h」を開き、画像ファイルを定数化します。

//-----------------------------------------------------------------------------
//ゲーム中で使用するテクスチャ、BGM、SE、フォントのパス付ファイル名を書きます。
//-----------------------------------------------------------------------------
namespace KeyString
{
    const std::string TEXTURE_TREASURE = "Resource\\Texture\\Treasure.png";
}

次に「SceneTitle.cpp」を開き、「Start関数」で画像を追加しましょう。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneTitle::Start()
{
    m_pEngine->AddTexture(TEXTURE_TREASURE);
}

※今回はゲームシーンでも同じ画像を使いますので、「Exit関数」で解放はしません。

「Draw関数」でタイトル画面を転送します。

//=============================================================================
// シーンの実行時に繰り返し呼び出される描画処理関数
//=============================================================================
void SceneTitle::Draw()
{
    SetRect(&m_sour, 0, 0, 640, 480);
    SetRect(&m_dest, 0, 0, 640, 480);
    m_pEngine->Blt(&m_dest, TEXTURE_TREASURE, &m_sour);
}

一度、実行して確かめてみましょう。

<実行結果 クライアント領域のみ>

見ての通り、タイトルにはメニューが2つあります。

どちらを選択するかマウスでも選択出来ますが、今回はキーボードを使う方法を説明します。


メニューの選択


元画像を見ると、タイトルの左上に「◇」があります。

メニュー選択用のカーソルとして「◇」を使います。

この画像のサイズは「24×24ピクセル」です。

「Start Game」と書いてある文字の左側に表示したいと思います。

転送先の座標は、左が「200」で上が「340」です。

「Draw関数」にコードを追加しましょう。

//=============================================================================
// シーンの実行時に繰り返し呼び出される描画処理関数
//=============================================================================
void SceneTitle::Draw()
{
    SetRect(&m_sour, 0, 0, 640, 480);
    SetRect(&m_dest, 0, 0, 640, 480);
    m_pEngine->Blt(&m_dest, TEXTURE_TREASURE, &m_sour);

    SetRect(&m_sour, 640, 0, 664, 24);
    SetRect(&m_dest, 200, 340, 224, 364);
    m_pEngine->Blt(&m_dest, TEXTURE_TREASURE, &m_sour);
}

転送元座標も計算すれば分かります。

実行してみましょう。

<実行結果 クライアント領域のみ>

この状態から、「↑↓キー」でメニューを選択し「Enterキー」で決定出来るように作ります。

「Exit Game」の文字のY座標は「400」です。

「Start Gmae」が「340」、「Exit Game」が「400」、この2つの座標は定数にします。

「SceneTitle.h」を開き、privateに定数を追加します。

private:

    //=============================================================================
    // このシーンでのみ使用するデータを宣言してください。
    //=============================================================================

    const int START_POSITION;
    const int EXIT_POSITION;
};

クラスで設定した定数の値は、コンストラクタ関数の初期化リストで初期値を設定します。

「SceneTitle.cpp」を開き、コンストラクタ関数にコードを追加します。

//=============================================================================
// コンストラクタ
// 引 数:Engine* エンジンクラスのアドレス
//=============================================================================
SceneTitle::SceneTitle(Engine *pEngine) : Scene(pEngine)
    , START_POSITION(340)
    , EXIT_POSITION(400)
{

}

メニューの2つの項目の座標が定数になりました。

「↑↓キー」でこれを選択出来るようにしたいので、変数を1つ追加しましょう。

「SceneTitle.h」を開き、privateに変数を追加します。

private:

    //=============================================================================
    // このシーンでのみ使用するデータを宣言してください。
    //=============================================================================

    const int START_POSITION;
    const int EXIT_POSITION;

    int m_cursorY;
};

この変数の初期値は「SceneTitle.cpp」の「Start関数」で行いましょう。

//=============================================================================
// シーンの実行時に1度だけ呼び出される開始処理関数
//=============================================================================
void SceneTitle::Start()
{
    m_pEngine->AddTexture(TEXTURE_TREASURE);

    m_cursorY = START_POSITION;
}

これに合わせて「Draw関数」の転送先座標も変えます。

//=============================================================================
// シーンの実行時に繰り返し呼び出される描画処理関数
//=============================================================================
void SceneTitle::Draw()
{
    SetRect(&m_sour, 0, 0, 640, 480);
    SetRect(&m_dest, 0, 0, 640, 480);
    m_pEngine->Blt(&m_dest, TEXTURE_TREASURE, &m_sour);

    SetRect(&m_sour, 640, 0, 664, 24);
    SetRect(&m_dest, 200, m_cursorY, 224, m_cursorY + 24);
    m_pEngine->Blt(&m_dest, TEXTURE_TREASURE, &m_sour);
}

形は変わりましたが、実行画面は同じです。

<実行結果 クライアント領域のみ>

プログラムは同じように動いているように見えても、中身が全然違う場合が多々あります。


この変更のおかげで、メニューが選択出来るようになりました。

「Update関数」でメニュー選択が出来るようにコードを追加します。

//=============================================================================
// シーンの実行時に繰り返し呼び出される更新処理関数
//=============================================================================
void SceneTitle::Update()
{
    if (m_pEngine->GetKeyStateSync(DIK_UP)) {
        m_cursorY = START_POSITION;
    }

    if (m_pEngine->GetKeyStateSync(DIK_DOWN)) {
        m_cursorY = EXIT_POSITION;
    }
}

これで「↑↓キー」でカーソルが移動します。

<実行結果 クライアント領域のみ>

「↑↓キー」で選択出来るようになりました。


次は「Enterキー」を押すと、選んだメニューを実行出来るようにしてみたいと思います。

「Update関数」にコードを追加します。

//=============================================================================
// シーンの実行時に繰り返し呼び出される更新処理関数
//=============================================================================
void SceneTitle::Update()
{
    if (m_pEngine->GetKeyStateSync(DIK_UP)) {
        m_cursorY = START_POSITION;
    }

    if (m_pEngine->GetKeyStateSync(DIK_DOWN)) {
        m_cursorY = EXIT_POSITION;
    }

    if (m_pEngine->GetKeyStateSync(DIK_RETURN)) {
        if (m_cursorY == START_POSITION) {
            m_nowSceneData.Set(Common::SCENE_GAME, false, NULL);
        }
        else {
            m_nowSceneData.Set(Common::SCENE_EXIT, false, NULL);
        }
    }
}

「Enterキー」は「DIK_RETURN」で指定出来ます。

「Enterキー」を押した時に、カーソルがどこにあるかでシーンを切り替えます。

実行して、どちらも選んでみてください。

※ゲームシーンを選んでも何も表示されませんので画面は載せません。


これでタイトルシーンは完成です。

次はゲームシーンを作りましょう。


次へ

戻る

目次へ