クラスメモ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にあったりととびとびであるというのも問題なような気がする。