ステージの追加とクリア判定

ステージを追加します。
stages.hに好きなだけステージを追加してあげてください。 ステージは、ここなどを参考にして、

                         0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 , その他の領域 7 
const string OBJS[] = { " ", "#", "$", ".", "@", "+", "*" };

で配列を作れば、追加できます。たとえば、

Listing. 1: stages.hの追加
stages.h
#include "globals.h"
const int MAX_STAGE_NUM = 2;//ステージ数増やしたらこれも増やす
 
Map maps[] =
{
	{
		9, 8,
		{
		{1,1,1,7,7,7,7,7,7,7},
		{1,3,1,7,7,7,7,7,7,7},
		{1,2,1,7,7,7,7,7,7,7},
		{1,0,1,7,7,7,7,7,7,7},
		{1,0,1,7,7,7,7,7,7,7},
		{1,0,1,1,1,1,1,1,1,7},
		{1,4,2,0,0,0,0,3,1,7},
		{1,1,1,1,1,1,1,1,1,7},
		{7,7,7,7,7,7,7,7,7,7},
		{7,7,7,7,7,7,7,7,7,7}
		}
	}
// <---10--->
//   ####### ↑
//  ##  # @# |
//  #   #  # |
//  #$ $ $ # 8
//  # $##  # |
//### $ # ## |
//#.....  # |
//#########  ↓
        ,
        {
            10, 8,
            {
              {7,7,7,1,1,1,1,1,1,1},  //"   #######"
              {7,7,1,1,0,0,1,0,4,1},  //"  ##  # @#"
              {7,7,1,0,0,0,1,0,0,1},  //"  #   #  #"
              {7,7,1,2,0,2,0,2,0,1},  //"  #$ $ $ #"
              {7,7,1,0,2,1,1,0,0,1},  //"  # $##  #"
              {1,1,1,0,2,0,1,0,1,1},  //"### $ # ##"
              {1,3,3,3,3,3,0,0,1,7},  //"#.....  # "
              {1,1,1,1,1,1,1,1,1,7},  //"######### "
              {7,7,7,7,7,7,7,7,7,7},  //"          "
              {7,7,7,7,7,7,7,7,7,7}   //"          "
            }
        }   
};

こんな感じで、参考ページを見ながら5~10ステージぐらい追加してあげて。
const int MAX_STAGE_NUM = 2; ステージ増やしたらこれも書き換えるのをお忘れなく!

クリア判定を入れてみるー

今まで、マップはグローバル変数maps[MAX_STAGE_NUM]のmaps[0]を無理くり読み込んでいた。
これを、現在プレイしているステージ番号を表す変数を作って、そのステージ番号のマップを読み込むように変更する
gameSequence.cppの冒頭部分に以下を追加

gameSequence.cpp
//現在のステージ current Stage Number
int crrStageNumber = 0;
 
//いままでmaps[0]と書いていた部分をすべてmaps[crrStageNumber]に変更する。

クリア判定は、コンソール版のものそのまま使えるよ。

Listing. 2: ステージクリアのチェックを導入
UpdatePlayの更新
void UpdatePlay(GAME_STATE& _state)
{
	direction nextDir = GetDirection();
	MoveObject(nextDir, maps[crrStageNumber]);
	if (maps[crrStageNumber]をクリアチェックしてクリアしていたら)
	{
                //クリアシーンに移動
		_state = GAME_STATE::CLEAR;
	}
}

そんで、クリアしたらステージ番号を1個増やすよ
つまり、UpdateClearで、ステージ数を変更し、プレイ画面に戻す

Listing. 3: UpdateClearの更新
gameSequence.cpp
void UpdateClear(GAME_STATE& _state)
{
	if (MouseL.down())
	{
		crrStageNumberを1ふやす
                //ステージ番号は、配列数と同じなので、配列のインデックス的にはMAX_STAGE_NUM-1が最大値だよね。
		if (ステージ番号がMAX_STAGE_NUM以上になってたら)
			crrStageNumber = MAX_STAGE_NUM - 1;
		_state = GAME_STATE::PLAY;
	}
}

結果

一応、ステージが進んでいくのが確認できる。

Fig. 1: ステージクリアの追加

なんか、いくつか問題点があるよね。
最後のステージは今、オールクリアフラグとかがないので、

		if (ステージ番号がMAX_STAGE_NUM以上になってたら)
			crrStageNumber = MAX_STAGE_NUM - 1;
		_state = GAME_STATE::PLAY;

同じ面を繰り返す、って設定にしたつもりだったんだけど、一度クリアしてしまうと、クリアフラグがたちっぱなしになってしまう。
これはどうしてだろう?
答えは、読み込んだグローバル変数のマップをそのままMoveObject関数で書き換えてプレイしているので、もう元の形のステージがどこにも存在しなくなり、
初期状態に戻せなくなっているからである。
これを防ぐには、ローカルに現在のステージだけを示すMap型の変数を作り、ステージ開始時にグローバルのmapsから1ステージ分だけコピーして使うことで元の配列を残しておける。
こうすることで、元のマップは変更せずにそのステージのコピーを変更できるので、1手戻し面リセットなども可能になる。

あと、クリアしたときにすぐに面が切り替わるのもちょっとクリアした余韻や爽快感がないよね
これはどうしたらいいだろうか?
今日は疲れたので、次回に託そう

その5 細かいところを追加していく へ