シーンの追加に慣れてもらうため、ゲームに勝った場合「ゲームクリアシーン」へ遷移するようにしてみます。
前回の手順と同じですが、確認しながら覚えてください。
プロジェクトフォルダの「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」を選んでください。
<実行結果 クライアント領域のみ>
次回はさらにシーンの遷移をさせてみます。