www.pudn.com > sxdl.zip > cMap.cpp


#include "cMap.h" 
#include "cBoomBastic.h" 
#include "cRock.h" 
#include "bbUtil.h" 
 
cMap::cMap(int ResourceID) : 
	CTileMap(ResourceID, 0xFFFFFFFF, MAP_WIDTH, MAP_HEIGHT, 4, 2, 0, 0, 64, 64) 
{ 
	Build(); 
} 
 
void cMap::Build() 
{ 
	//Pour chaque tile de la map, 
	int i, j; 
	for (i = 0; i < MAP_WIDTH; i++) 
	{ 
		for (j = 0; j < MAP_HEIGHT; j++) 
		{ 
			//Si au moins une des deux coordonnees de la tile est paire, la tile sera du sol non bloquant 
			if ((i % 2) == 0 || (j % 2) == 0) 
			{ 
					Map(i, j, 0); 
					LogicalMap(i, j, LMAP_GROUND); 
			} 
			//Sinon la tile sera soit soit une maison, soit un palmier bloquant 
			else 
			{ 
				if ((i * j + 1) % 4 == 0) 
					Map(i, j, 1); 
				else 
					Map(i, j, 2); 
				 
				LogicalMap(i, j, LMAP_BLOCK); 
			} 
		} 
	} 
		 
	//On precise la taille de la map 
	Vector3 Center(0.0f, 0.0f, 0.0f); 
	Vector3 Scale(MAP_WIDTH * TILE_SIZE, MAP_HEIGHT * TILE_SIZE, 1.0f); 
	Vector3 Angles(0.0f, 0.0f, 0.0f); 
	Geometry(Center, Scale, Angles); 
} 
 
void cMap::CreateRocks() 
{ 
	//Pour chaque tile de la map, 
	int i, j; 
	for (i = 0; i < MAP_WIDTH; i++) 
	{ 
		for (j = 0; j < MAP_HEIGHT; j++) 
		{ 
			//On ne place pas de rocher dans les quatres coins pour permettre aux tanks de se deplacer 
			if ((i == 0 || i == 1 || i == MAP_WIDTH - 1 || i == MAP_WIDTH - 2) 
				&& (j == 0 || j == 1 || j == MAP_HEIGHT - 1 || j == MAP_HEIGHT - 2)) 
				continue; 
				 
			//Si la tile correspond actuellement au sol  
			if (LogicalMap(i, j) == LMAP_GROUND) 
			{ 
				//On y place 2 fois sur 3 un rocher 
				if (g_BoomBastic.Tools.randi(0, 2) != 0) 
					new cRock(i, j); 
			} 
		} 
	} 
} 
 
float cMap::GetMapWidth() 
{ 
	return MAP_WIDTH * TILE_SIZE; 
} 
 
float cMap::GetMapHeight() 
{ 
	return MAP_HEIGHT * TILE_SIZE; 
} 
 
Vector3 cMap::GetTopLeftCorner() 
{ 
	return Vector3(-GetMapWidth() / 2.0f, GetMapHeight() / 2.0f, 0.0f); 
} 
 
Vector3 cMap::GetBottomRightCorner() 
{ 
	return Vector3(GetMapWidth() / 2.0f, -GetMapHeight() / 2.0f, 0.0f); 
} 
 
bool cMap::ConvertWorldToMap(Vector3 &WorldPosition, int *i, int *j) 
{ 
	CTile Tile; 
	Map(WorldPosition, &Tile); 
	 
	//i et j sont les coordonnees de la tile dans laquelle se trouve WorldPosition 
	*i = Tile.x; 
	*j = Tile.y; 
	 
	//On verifie que la tile de coordonnees i et j se trouve dans la map 
	return IsInTheMap(WorldPosition); 
} 
 
bool cMap::IsInTheMap(int TileX, int TileY) 
{ 
	return !(TileX < 0 || TileX >= MAP_WIDTH || TileY < 0 || TileY >= MAP_HEIGHT);  
} 
 
bool cMap::IsInTheMap(Vector3 &Position) 
{ 
	return !(Position.x < GetTopLeftCorner().x || Position.x > GetBottomRightCorner().x || 
		Position.y > GetTopLeftCorner().y || Position.y < GetBottomRightCorner().y);  
} 
 
bool cMap::IsBlocking(int TileX, int TileY) 
{ 
	int LogicalTile = LogicalMap(TileX, TileY); 
	return (LogicalTile == LMAP_BLOCK || LogicalTile == LMAP_ROCK || LogicalTile == LMAP_BOMB); 
} 
 
bool cMap::SpriteCollidesWithTile(Vector3 &SpritePosition, float SpriteSize, int TileX, int TileY) 
{ 
	//Si la tile n'est pas dans la map, il ne peut pas y avoir de collision  
	if (!IsInTheMap(TileX, TileY)) 
		return false; 
	 
	//Si la tile n'est pas bloquante, il ne peut pas y avoir de collision 
	if (!IsBlocking(TileX, TileY)) 
		return false; 
	 
	//Sinon, on verifie que la distance entre les centres de la sprite et de la tile 
	//est suffisante pour qu'il n'y est pas collision 
	Vector3 TileCenter = MapToWorld(TileX, TileY); 
	return (fabsf(TileCenter.x - SpritePosition.x) < ((SpriteSize + TILE_SIZE) / 2.0f) && 
		fabsf(TileCenter.y - SpritePosition.y) < ((SpriteSize + TILE_SIZE) / 2.0f)); 
}