★ゲームクリアシーンの追加★


シーンの追加に慣れてもらうため、ゲームに勝った場合「ゲームクリアシーン」へ遷移するようにしてみます。

前回の手順と同じですが、確認しながら覚えてください。


シーンの追加


プロジェクトフォルダの「Sourceフォルダ」を開き「Sceneフォルダ」を開いてください。

「_SceneSourceフォルダ」を同じフォルダにコピーしてください。

フォルダ名を「SceneClear」に変更します。

「SceneClearフォルダ」を開きます。

2つのファイル名を「SceneClear.h」「SceneClear.cpp」にします。

Visual Studioに戻り「ソリューションエクスプローラー」を出します。

「Sceneフォルダ」を右クリックして「追加」→「新しいフィルター」を選択します。

フィルタ名を「SceneClear」に変更します。

「SceneClear」を右クリックして「追加」→「既存の項目」を選択します。

さっき作った「Sourceフォルダ」→「Sceneフォルダ」→「SceneClearフォルダ」を開きます。

この「ヘッダ」と「cpp」ファイルを追加します。

ソリューションエクスプローラーが↓のようになっていればOKです。


ファイル内容の変更


「SceneClear.h」を開いてください。

このファイルの「SceneSource」を「SceneClear」に変更します。

変更後の「ヘッダ」ファイル

//****************************************************************************
//
// ゲームクリアシーン
//
//*****************************************************************************

#pragma once

#include "..\\..\\GameBase.h"

#include "..\\Scene\\Scene.h"

class SceneClear : public Scene
{
public:

    //=============================================================================
    // コンストラクタ
    // 引 数:Engine* エンジンクラスのアドレス
    //=============================================================================
    SceneClear(Engine *pEngine);

    //=============================================================================
    // デストラクタ
    //=============================================================================
    ~SceneClear();

    //=============================================================================
    // シーンの実行時に1度だけ呼び出される開始処理関数
    //=============================================================================
    void Start();

    //=============================================================================
    // シーンの実行時に繰り返し呼び出される更新処理関数
    //=============================================================================
    void Update();

    //=============================================================================
    // シーンの実行時に繰り返し呼び出される描画処理関数
    //=============================================================================
    void Draw();

    //=============================================================================
    // シーンの終了時に呼び出される終了処理関数
    //=============================================================================
    void Exit();

private:

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

};

次に「SceneClear.cpp」を開きます。

こちらも「SceneSource」を「SceneClear」に変更します。

//****************************************************************************
//
// ゲームクリアシーン
//
//*****************************************************************************

#define _USING_V110_SDK71_ 1

#include "SceneClear.h"

using namespace KeyString;
using namespace InputKey;

//=============================================================================
// コンストラクタ
// 引 数:Engine* エンジンクラスのアドレス
//=============================================================================
SceneClear::SceneClear(Engine *pEngine) : Scene(pEngine)
{

}

//=============================================================================
// デストラクタ
//=============================================================================
SceneClear::~SceneClear()
{
	Exit();
}

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

}

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

}

//=============================================================================
// シーンの実行時に繰り返し呼び出される描画処理関数
//=============================================================================
void SceneClear::Draw()
{

}

//=============================================================================
// シーンの終了時に呼び出される終了処理関数
//=============================================================================
void SceneClear::Exit()
{

}

これで準備は出来ました。


ゲームクリアシーンの作成


ゲームオーバーシーンと同じ画像を使ってクリア画面を表示する事にします。

定数化はすでに済ませてあるので必要ありません。

「SceneClear.cpp」を開いてください。

このシーンで画像を使うため「Start関数」で画像を追加し「Exit関数」で解放します。

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

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

さらに「Draw関数」を変更します。

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

このシーンでは「GameClear!」と書いた画像を表示するだけです。


シーンの遷移


このままでは、「SceneClear」は実行されません。

「SceneGame.cpp」を開きましょう。

「Update関数」に勝った時のプログラムを書く箇所があります。

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

    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);
            }
        }
    }
}

ここを「SceneClear」に遷移するように変更します。

そのためには、まだ準備しなければならないところがあります。

「GameData.h」を開いてください。

enumのところに定数を追加します。

//-----------------------------------------------------------------------------
// 複数のシーンで共用するデータ
//-----------------------------------------------------------------------------
namespace Common
{
    //-----------------------------------------------------------------------------
    // シーンを追加した際に定数を追加します。
    //-----------------------------------------------------------------------------
    enum {
        SCENE_INIT,
        SCENE_GAME,
        SCENE_GAMEOVER,
        SCENE_CLEAR,
        SCENE_EXIT,
    };

    //-----------------------------------------------------------------------------
    // 複数のシーンで共用するデータを構造体にまとめます。
    //-----------------------------------------------------------------------------
    struct CommonData {

    };
}

次に「Game.h」を開きます。

シーンクラスのヘッダファイルを追加しましょう。

//-----------------------------------------------------------------------------
//シーンクラスのヘッダファイルをインクルードします。
//-----------------------------------------------------------------------------

#include "Scene\\Scene\Scene.h"
#include "Scene\\SceneInit\\SceneInit.h"
#include "Scene\\SceneGame\\SceneGame.h"
#include "Scene\\SceneGameover\\SceneGameover.h"
#include "Scene\\SceneClear\\SceneClear.h"

さらに「Game.cpp」を開いてください。

シーン切り替えのところにcase文を追加します。

//-----------------------------------------------------------------------------
// シーン切り替え
//-----------------------------------------------------------------------------
bool Game::ChangeScene()
{
    switch (Scene::m_nowSceneData.m_scene) {

    //↓ここに追加

    case Common::SCENE_GAME:
        m_pNowScene = new SceneGame(m_pEngine);
        break;

    case Common::SCENE_GAMEOVER:
        m_pNowScene = new SceneGameover(m_pEngine);
        break;

    case Common::SCENE_CLEAR:
        m_pNowScene = new SceneClear(m_pEngine);
        break;

    case Common::SCENE_EXIT:
        return false;
    }

    return true;
}

最後に「SceneGame.cpp」を開いてください。

「Update関数」のプログラムを変更します。

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

    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) {
                m_nowSceneData.Set(Common::SCENE_CLEAR, false, NULL);
            }
            else {
                m_nowSceneData.Set(Common::SCENE_GAMEOVER, false, NULL);
            }
        }
        else {
            if (m_right == 1) {
                m_nowSceneData.Set(Common::SCENE_CLEAR, false, NULL);
            }
            else {
                m_nowSceneData.Set(Common::SCENE_GAMEOVER, false, NULL);
            }
        }
    }
}

実行して何とか「A」を選んでください。

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


次回はさらにシーンの遷移をさせてみます。


次へ

戻る

目次へ