クラスメモ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になっているが、まぁ、ファイル形式で渡せるほうが便利かなと思って
変えてみた。(その結果、処理が若干めんどくさくなっている)