在前面的帖子中,塔基生成有两种方法,一种是通过tmx的tile layer,图层进行创建,另一种是通过对象层进行创建,需要注意的是,僵尸的findTerrainOfZombieCollision,是查找和僵尸碰撞的塔基的,内部实现如下
Terrain*GameScene::findTerrainOfZombieCollision(ZombieBase*zombie)
{
//获取当前僵尸所在的行
auto row = zombie->getRow();
auto dir = zombie->getZombieDir();
auto r = zombie->getCollisionBoundingBox();
const auto&terrains = m_pLevelLayer->getTerrainsOfRow(row);
Terrain*terrain = nullptr;
//地形从左向右遍历
if (dir == ZombieDir::Left)
{
for (auto it = terrains.begin();it != terrains.end();it++)
{
auto t = *it;
auto rect = t->getBoundingBox();
if (r.intersectsRect(rect))
{
terrain = t;
break;
}
}
}
//地形从右向左遍历
else if (dir == ZombieDir::Right)
{
for (auto it = terrains.end();it != terrains.begin();it--)
{
auto t = *it;
auto rect = t->getBoundingBox();
if (r.intersectsRect(rect))
{
terrain = t;
break;
}
}
}
return terrain;
}
这里需要保证塔基是排序好的,所以需要在LevelLayer中对塔基进行排序,排序方法类似于僵尸的排序。
bool LevelLayer::terrainComparisonLess(Terrain* n1, Terrain* n2)
{
return n1->getPositionX() < n2->getPositionX();
}
在LevelLayer::init中添加
//获取地形
TerrainMaker maker;
maker.startParse(m_pTiledMap,SDL_CALLBACK_1(LevelLayer::makeTerrainCallback,this));
//塔基加载完成
for (auto it = m_terrains.begin();it != m_terrains.end();it++)
{
auto & terrains = it->second;
sort(terrains.begin(),terrains.end(),terrainComparisonLess);
}
即使用排序算法,这个需要注意。