今のままではゲームオーバーになった場合、すぐにアプリケーションが終了してしまいます。
そこで「ゲームオーバーシーン」を追加してみたいと思います。
シーンの追加は色々と設定しなければいけない事がありますので、順を追って説明します。
まずはシーンの「ヘッダ」と「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」を選んでください。
<実行結果 クライアント領域のみ>
色々設定する事がありますが、何回か設定する内に慣れてください。
次回はゲームクリアシーンを追加します。