Понял. Можешь делать проверку как в CCharacter, можно и другими методами, например в collision.cpp есть метод GetTile(int x, int y), только тебе его придется немного изменить, добавив свои флаги, либо убрать оттуда все проверки на флаги.
Потом просто в CCharacter делаешь нужные проверки:
Код:
if(GameServer()->Collision()->GetTile(x,y) == COLFLAG_DEATH_RED)
...
Вообще можно работать без создания этих флагов, просто добавляешь новый тайл в mapitems.h.
Изменяешь Init в collision.cpp, чтобы была возможность загрузки всех тайлов.
Код:
void CCollision::Init(class CLayers *pLayers)
{
m_pLayers = pLayers;
m_Width = m_pLayers->GameLayer()->m_Width;
m_Height = m_pLayers->GameLayer()->m_Height;
m_pTiles = static_cast<CTile *>(m_pLayers->Map()->GetData(m_pLayers->GameLayer()->m_Data));
for(int i = 0; i < m_Width*m_Height; i++)
{
int Index = m_pTiles[i].m_Index;
if(Index > 175)
continue;
switch(Index)
{
case TILE_DEATH:
m_pTiles[i].m_Index = COLFLAG_DEATH;
break;
case TILE_SOLID:
m_pTiles[i].m_Index = COLFLAG_SOLID;
break;
case TILE_NOHOOK:
m_pTiles[i].m_Index = COLFLAG_SOLID|COLFLAG_NOHOOK;
break;
default:
m_pTiles[i].m_Index = 0;
}
// custom tiles
if(Index > 3 && Index <= 175)
m_pTiles[i].m_Index = Index;
}
}
Ну и функция для проверки тайла по заданным координатам:
Код:
bool CCollision::CheckTile(vec2 Pos, int TILE_NUMB)
{
int x = Pos.x;
int y = Pos.y;
int Nx = clamp(x/32, 0, m_Width-1);
int Ny = clamp(y/32, 0, m_Height-1);
if(!m_pTiles || Ny < 0 || Nx < 0)
return false;
int Tile = m_pTiles[Ny*m_Width+Nx].m_Index;
if(Tile == TILE_NUMB)
return true;
return false;
}
Пример использования:
Код:
if (GameServer()->Collision()->CheckTile(m_Core.m_Pos, TILE_SOMETILE))
{
}