CCTMXTiledMap 移动地图出黑线白线的解决方案

2015年03月24日 16:40 0 点赞 0 评论 更新于 2025-11-21 18:30

在游戏项目中,地图层采用了 Cocos2d-x 中的 CCTMXTiledMap。我们的整个 Tile 层使用的是一个大整图,随后对图中的 Tile 进行分格子处理。而且,这些 Tile 只有在使用一个整图时才能搭配 CCBatchNode 使用。

1. CCTMXTiledMap 默认抗锯齿设置问题

CCTMXTiledMap 默认是不抗锯齿的,它采用的是 setAliasTexParameters 方法,这一设置可以在 CCTMXLayersetupTiles 方法里进行调整,具体代码如下:

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 移动地图时出现黑线白线的问题。

作者信息

menghao

menghao

共发布了 3994 篇文章