★ゲームオーバーシーンの追加★


今のままではゲームオーバーになった場合、すぐにアプリケーションが終了してしまいます。

そこで「ゲームオーバーシーン」を追加してみたいと思います。


シーンの追加


シーンの追加は色々と設定しなければいけない事がありますので、順を追って説明します。

まずはシーンの「ヘッダ」と「cpp」を追加しなければなりません。

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

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

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

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

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

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

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

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

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

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

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

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


ファイル内容の変更


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

//****************************************************************************
//
// シーンの元となるヘッダファイル
//
//*****************************************************************************

#pragma once

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

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

//SceneSourceの「Source」の部分を変更して使用してください。

class SceneSource : public Scene
{
public:

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

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

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

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

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

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

private:

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

};

このファイルの「赤い部分」を「SceneGameover」に変更します。

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

//****************************************************************************
//
// ゲームオーバーシーン
//
//*****************************************************************************

#pragma once

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

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

class SceneGameover : public Scene
{
public:

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

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

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

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

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

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

private:

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

};

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

//****************************************************************************
//
// シーンの元となるcppファイル
//
//*****************************************************************************

#define _USING_V110_SDK71_ 1

//SceneSourceの「Source」の部分を変更して使用してください。

#include "SceneSource.h"

using namespace KeyString;
using namespace InputKey;

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

}

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

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

}

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

}

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

}

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

}

こちらも「赤い部分」を「SceneGameover」に変更します。

//****************************************************************************
//
// ゲームオーバーシーン
//
//*****************************************************************************

#define _USING_V110_SDK71_ 1

#include "SceneGameover.h"

using namespace KeyString;
using namespace InputKey;

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

}

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

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

}

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

}

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

}

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

}

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


ゲームオーバーシーンの作成


ゲームオーバーシーンではゲームオーバー画面を表示する事にしましょう。

使う画像は↓です。

実際の大きさは「1024×1024ピクセル」ですが大きすぎるので縮小表示しています。

画像を右クリックして「Result.png」と言う名前でプロジェクトフォルダの「Resource\\Textureフォルダ」に保存してください。

「GameBase.h」を開いて定数化しましょう。

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

    const std::string TEXTURE_RESULT = "Resource\\Texture\\Result.png";
}

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

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

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

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

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

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

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


シーンの遷移


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

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

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

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

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

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

//-----------------------------------------------------------------------------
// 複数のシーンで共用するデータ
//-----------------------------------------------------------------------------
namespace Common
{
    //-----------------------------------------------------------------------------
    // シーンを追加した際に定数を追加します。
    //-----------------------------------------------------------------------------
    enum {
        SCENE_INIT,
        SCENE_GAME,
        SCENE_GAMEOVER,
        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"

さらに「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_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) {
                //勝った時はそのまま
            }
            else {
                m_nowSceneData.Set(Common::SCENE_GAMEOVER, false, NULL);
            }
        }
        else {
            if (m_right == 1) {
                //勝った時はそのまま
            }
            else {
                m_nowSceneData.Set(Common::SCENE_GAMEOVER, false, NULL);
            }
        }
    }
}

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

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


色々設定する事がありますが、何回か設定する内に慣れてください。

次回はゲームクリアシーンを追加します。


次へ

戻る

目次へ