このまま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」だとゲームは終わります。
次回はゲームオーバーシーンを追加します。