★シーンの追加 ゲーム部分の作成★


このまま1シーンでゲームを作るのは限界があるので、シーンの追加について説明します。

とりあえず何かゲームっぽい形を作って説明したいので、次のようなルールを考えました。

トランプが2枚裏返しになっている状態で、どちらか1つをマウスで選択します。

2枚のカードはどちらかが「A」でもう一方が「K」です。

「A」を選択すれば「勝ち」、「K」を選択したら「ゲームオーバー」です。

トランプ画像を使い、配置座標も「ハイアンドロー」のものを使います。


画像の準備


まずは画像の準備をするため、トランプ画像を「Resource\\Textureフォルダ」にコピーしてください。

「GameBase.h」を開き定数を設定します。

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

「SceneGame.cpp」を開き、「Start関数」で画像を追加「Exit関数」で解放します。

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

//=============================================================================
// シーンの終了時に呼び出される終了処理関数
//=============================================================================
void SceneGame::Exit()
{
    m_pEngine->ReleaseTexture(TEXTURE_TRUMP);
}

最後に、「Draw関数」で背景画像を転送します。

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

何度も同じような事をやっていますので省略しますが、実行して確認してください。


カードの初期配置


2つの裏返ったカードを転送します。

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

    //左のカード
    SetRect(&m_sour, 0, 600, 100, 750);
    SetRect(&m_dest, 146, 150, 246, 300);
    m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
    
    //右のカード
    SetRect(&m_sour, 0, 600, 100, 750);
    SetRect(&m_dest, 394, 150, 494, 300);
    m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
}

実行してみます。

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


左右のカードの中身を決定する


今のままでは左右のカードが何か分かりませんので、乱数を使って決めたいと思います。

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

private:

    int m_left;
    int m_right;
};

「SceneGame.cpp」を開き、「Start関数」で初期値を設定します。

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

    if (rand() % 2) {
        m_left = 1;
        m_right = 13;
    }
    else {
        m_left = 13;
        m_right = 1;
    }
}

これでどちらかが「A」でどちらかが「K」になりました。


カードの選択


これまでのゲームでの経験を踏まえて、次のフラグとPOINT構造体を追加しましょう。

「SceneGame.h」を開き、フラグと構造体を追加してください。

private:

    int m_left;
    int m_right;

    POINT point;

    bool m_bSelected;

    bool m_bChoiceLeft;
};

POINT構造体と「選択完了フラグ」「左のカード選択フラグ」を追加しました。

これまでの積み重ねがあると思うので、ある程度まとめて書きます。

「SceneGame.cpp」を開き、「Start関数」で初期値を入れます。

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

    if (rand() % 2) {
        m_left = 1;
        m_right = 13;
    }
    else {
        m_left = 13;
        m_right = 1;
    }

    m_bSelected = false;
}

「選択完了フラグ」のみ初期化します。

「Update関数」でマウスのボタン判定を行います。

//=============================================================================
// シーンの実行時に繰り返し呼び出される更新処理関数
//=============================================================================
void SceneGame::Update()
{
    if (m_pEngine->GetMouseButton(DIK_LBUTTON)) {

        point = m_pEngine->GetMousePosition();

        //左のカードの判定
        if (point.x >= 146 && point.x < 246 && point.y >= 150 && point.y < 300) {
            m_bChoiceLeft = true;
            m_bSelected = true;
        }

        //右のカードの判定
        if (point.x >= 394 && point.x < 494 && point.y >= 150 && point.y < 300) {
            m_bChoiceLeft = false;
            m_bSelected = true;
        }
    }
}

左のカードを選択した場合「左のカード選択フラグ」をtrueにして「選択完了フラグ」をtrueにします。

右のカードを選択した場合「左のカード選択フラグ」をfalseにして「選択完了フラグ」をtrueにします。


勝敗判定


さらに「Update関数」に勝敗の判定を追加します。

//=============================================================================
// シーンの実行時に繰り返し呼び出される更新処理関数
//=============================================================================
void SceneGame::Update()
{
    if (m_pEngine->GetMouseButton(DIK_LBUTTON)) {

        point = m_pEngine->GetMousePosition();

        //左のカードの判定
        if (point.x >= 146 && point.x < 246 && point.y >= 150 && point.y < 300) {
            m_bChoiceLeft = true;
            m_bSelected = true;
        }

        //右のカードの判定
        if (point.x >= 394 && point.x < 494 && point.y >= 150 && point.y < 300) {
            m_bChoiceLeft = false;
            m_bSelected = true;
        }
    }

    if (m_bSelected) {
        if (m_bChoiceLeft) {
            if (m_left == 1) {
                //勝った時はそのまま
            }
            else {
                m_nowSceneData.Set(Common::SCENE_EXIT, false, NULL);
            }
        }
        else {
            if (m_right == 1) {
                //勝った時はそのまま
            }
            else {
                m_nowSceneData.Set(Common::SCENE_EXIT, false, NULL);
            }
        }
    }
}

「選択完了フラグ」がtrueの場合、判定に入ります。

「左のカード選択フラグ」がtrueで、左のカードが「A」であれば「勝ち」です。

「左のカード選択フラグ」がfalseで、右のカードが「A」であれば「勝ち」です。

「勝ち」場合は(今は)何もしませんが、「負けた」場合は「ゲームオーバー」です。


結果表示


「選択完了フラグ」がtrueになった場合、カードを両方とも表にして結果を表示しましょう。

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

    //左のカード
    if (m_bSelected) {
        SetRect(&m_sour, (m_left - 1) * 100, 0, (m_left - 1) * 100 + 100, 150);
        SetRect(&m_dest, 146, 150, 246, 300);
        m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
    }
    else {
        SetRect(&m_sour, 0, 600, 100, 750);
        SetRect(&m_dest, 146, 150, 246, 300);
        m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
    }

    //右のカード
    if (m_bSelected) {
        SetRect(&m_sour, (m_right - 1) * 100, 0, (m_right - 1) * 100 + 100, 150);
        SetRect(&m_dest, 394, 150, 494, 300);
        m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
    }
    else {
        SetRect(&m_sour, 0, 600, 100, 750);
        SetRect(&m_dest, 394, 150, 494, 300);
        m_pEngine->Blt(&m_dest, TEXTURE_TRUMP, &m_sour);
    }
}

では、実行してみましょう。

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

「A」を当てると画面はそのまま、「K」だとゲームは終わります。


次回はゲームオーバーシーンを追加します。


次へ

戻る

目次へ