CCTMXTiledMap 移动地图出黑线白线的解决方案
在游戏项目中,地图层采用了 Cocos2d-x 中的 CCTMXTiledMap。我们的整个 Tile 层使用的是一个大整图,随后对图中的 Tile 进行分格子处理。而且,这些 Tile 只有在使用一个整图时才能搭配 CCBatchNode 使用。
1. CCTMXTiledMap 默认抗锯齿设置问题
CCTMXTiledMap 默认是不抗锯齿的,它采用的是 setAliasTexParameters 方法,这一设置可以在 CCTMXLayer 的 setupTiles 方法里进行调整,具体代码如下:
m_pobTextureAtlas->getTexture()->setAliasTexParameters();
使用默认设置会引发一个问题,当对地图进行缩放操作后再移动地图,部分地图的 Tile 块会出现闪动现象,在 Android 设备上尤为明显。为了解决这个问题,我们采用了抗锯齿操作。不过,我们没有修改 CCTMXLayer 的默认行为,而是在外部进行修改,代码如下:
if(map->getChildren() != NULL && map->getChildren()->count() > 0)
{
CCObject* child;
CCARRAY_FOREACH(map->getChildren(), child)
{
CCSpriteBatchNode* pNode = (CCSpriteBatchNode*) child;
if (pNode != NULL)
{
pNode->getTexture()->setAntiAliasTexParameters();
}
}
}
2. 抗锯齿操作引发的新问题及解决办法
抗锯齿操作本身通常不会有问题,但由于我们的地图块周围没有预留额外的 1 - 2 个像素用于抗锯齿操作时保留像素,所以在地图移动过程中,某些地图块的边界会出现整图位置上周围像素的痕迹,从而形成一条条白线或黑线。在网上查阅了多种方案后,最终发现通过修改 ccconfig.h 中的一个变量可以解决此问题,代码如下:
#ifndef CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 1
#endif
CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 默认值为 0,将其设置为 1 后,就能解决上述黑线白线的问题。该方法的原理应该是对抗锯齿操作的范围进行了约束,以此避免周围像素的干扰。
3. Android 设备上的特殊现象
另外,在 Android 设备上出现了一个比较意外的情况。CCTMXTiledMap 默认是不抗锯齿的,但当按下 Home 键或其他键使程序进入后台,再返回前台时,从效果上看,CCTMXTiledMap 变成抗锯齿状态了,目前还不清楚具体原因。
4. 设置 2D 投影
最后,还需要记得设置为 2D 投影,代码如下:
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setProjection(kCCDirectorProjection2D);
通过以上步骤,我们可以有效解决 CCTMXTiledMap 移动地图时出现黑线白线的问题。