クラスメモ4-2
//Map.h #ifndef INCLUDED_PLAYER_H__ #define INCLUDED_PLAYER_H__ #include <utility> using namespace std; class Image; class Map; //Playerはいつでも一人なので、シングルトンにする。 class Player { public: static Player* instance(); void draw() const; //staticメンバ関数はインスタンスが存在する前から呼び出せる。 static void create(const char* filename, Map* map); static void destroy(); void changeMap(Map* map); //マップ変更 void update(); private: int mCounter; //Playerが動いて見えるようにするためのカウンター static Player* mPlayer; //唯一のインスタンス Player(const char* filename, Map* map); ////newで動的に生成するとき、コピーコンストラクタが呼ばれるので、何もしないようにすること。 Player( Player& ); ~Player(); typedef pair<int,int> pii; pii mDir; //プレイヤーの向き (x,y) pii mPos; //プレイヤーの位置 int mSize; //constはつけることができない Image* mImage; //これはnewする Map* mMap; //ポインタを替えたりするだけ。newしない。 }; #endif //Map.cpp #include <utility> using namespace std; #include "Map.h" #include "Image.h" #include "Player.h" #include "GameLib/Framework.h" #include "GameLib/Input/Manager.h" #include "GameLib/Input/Keyboard.h" using namespace GameLib; using namespace GameLib::Input; //staticメンバ変数の実体化 Player* Player::mPlayer = 0; Player::Player(const char* filename, Map* map) : mSize(16), mMap(0), mImage(0) ,mCounter(0), mPos(0,0),mDir(0,0) { mMap = map; mImage = new Image(filename); mPos = pii(1,1); mDir = pii(0,1); } Player::~Player() { delete mImage; mImage = 0; } Player* Player::instance() { return mPlayer; } void Player::create(const char* filename, Map* map) { STRONG_ASSERT(!mPlayer && "Player::create() called twice!"); //コンストラクタと、コピーコンストラクタが呼ばれる。 mPlayer = new Player(filename, map); } void Player::destroy() { delete mPlayer; mPlayer = 0; } void Player::draw() const{ //Framework f = Framework::instance(); //unsigned* vram = f.videoMemory(); //int mSize=16; mImage->draw(0,0,(mPos.first)*mSize,(mPos.second)*mSize,mSize,mSize); } void Player::update() { Manager manager = Manager::instance(); Keyboard keyboard = manager.keyboard(); mDir = pii(0,0); //普通は if(keyboard.isTriggered(Keyboard::KEY_UP) ) { mDir = pii(0,-1); } else if(keyboard.isTriggered(Keyboard::KEY_DOWN) ) { mDir = pii(0,1); } if(keyboard.isTriggered(Keyboard::KEY_LEFT) ) { mDir = pii(-1,0); } else if(keyboard.isTriggered(Keyboard::KEY_RIGHT) ) { mDir = pii(1,0); } Framework f = Framework::instance(); mPos.first += mDir.first; mPos.second += mDir.second; if(mPos.first <0 || mPos.first > (f.width()/mSize - 1) ) { mPos.first -= mDir.first; } if(mPos.second < 0 || mPos.second > (f.height()/mSize - 1) ) { mPos.second -= mDir.second; } //先に進めるかどうか取得-->MapのmStageDataを参照できない!mStageDataはpublicにはしたくない draw(); }
Mapを参照したいが詰まってしまいました。
(friend関数使うとか可能性はあるが、どっちにしろ、根本的に修正が必要な気がする。)
だいたい、Mapの各ObjectのサイズとPlayerのサイズは同じなのがまずいというのが一点ある。
もう一転まずいところは、描画関数がPlayerにあったり、Mapにあったりととびとびであるというのも問題なような気がする。