クラスメモPart3-2

//Map.cpp
#include "Map.h"
#include "File.h"


#include "GameLib/Framework.h" //coutも
using namespace GameLib;


namespace {
	//Mapコンストラクタ用
	unsigned GetMapSize(const char* stageData) {
		int x=0; int y=0; int tmp =0;
		for(int i=0; stageData[i] != '\0' ;i++) {
			char ch = stageData[i];
			if(ch == '\n') {
				x = (tmp>x) ? tmp : x;
				y++;
				tmp =0;
			} else if(ch >= ' ' && ch <= '~') {
				tmp++;
			}
		}
		return ((x<<16) | y);
	}

}


Map::Map(const char* filename) {
	File file(filename);
	unsigned siz = GetMapSize(file.getData());

	mWidth = (siz >> 16);
	mHeight = (siz & 0x0000ffff);
	mStageData.setSize(mHeight,mWidth);

	zeroClear(); //mStageDataのflagをすべて0に。

	//dataの解析
	//ここも無名名前空間の中に入れればいいかも。
	const char* str = file.getData();
	int x=0; int y=0;
	for(int i=0;str[i] != '\0';i++) {
		FlagOpr o;
		o.Flags = FlagOpr::OBJ_UNKNOWN;
		switch(str[i]) {
		case '#': 
			o.Flags = FlagOpr::OBJ_WALL;
			break;
		case ' ' :
			o.Flags = FlagOpr::OBJ_FLOOR;
			break;
		default:
			break;
		}
		if(o.Flags != FlagOpr::OBJ_UNKNOWN) {
			mStageData(y,x).Flags = o.Flags;
			x++;
		} else if(str[i] == '\n') {
			y++; x=0;
		}
	}	
}

void Map::zeroClear() {
	for(int i=0;i<mHeight;i++) {
		for(int j=0;j<mWidth;j++) {
			mStageData(i,j).Flags = FlagOpr::OBJ_WALL; //定義していなければすべて壁とみなす。
		}
	}
}
Map::~Map() {
}

int Map::getHeight() const {
	return mHeight;
}

int Map::getWidth() const {
	return mWidth;
}

/*--------------------*/

void Map::Show() {
	int h=getHeight(); int w = getWidth();
	for(int i=0;i<h;i++) {
		for(int j=0;j<w;j++) {
			cout << mStageData(i,j).Flags;
		}
		cout << endl;
	}
}

//Map.h
#include "Array2D.h" //宣言だけではだめで、インクルードする必要がある。

class Map {
public:
	Map(const char* filename);
	~Map();
	int getHeight() const;
	int getWidth() const;
	void Show();
private:

	//これをcpp側に書くとエラーになる。(たぶん、変数の定義しかしていないので)enumと同じように内部に書く必要がある?
	struct FlagOpr {
		enum Object {
			//列挙子の値はint型
			OBJ_WALL =(0),
			OBJ_FLOOR =(1<<0),
			OBJ_EQUIP = (1<<1),

			OBJ_UNKNOWN = (1<<3),
		};
		unsigned Flags; //これで列挙子のフラグが排他的でなくなる。
	};
	void zeroClear();
	int mHeight;
	int mWidth;
	Array2D<FlagOpr> mStageData;
};

データの解析のところがかなり手間取った感があるが、これでいいだろう。
Width,Heightや、x,yの部分で、(疑似)二次元配列のrow,colがarr(y,x)だったり、arr(Height,Width)になることに注意しよう。

あと、あの本では、Mapコンストラクタの引数がstagedataになっているが、まぁ、ファイル形式で渡せるほうが便利かなと思って
変えてみた。(その結果、処理が若干めんどくさくなっている)