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)
&amt;&amt; (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 &amt;WorldPosition, int *i, int *j)
{
CTile Tile;
Map(WorldPosition, &amt;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 &amt;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 &amt;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) &amt;&amt;
fabsf(TileCenter.y - SpritePosition.y) < ((SpriteSize + TILE_SIZE) / 2.0f));
}