基本用法上一篇讲了,具体在cocos里使用的时候发现了一些问题(可能是版本缘故,cocos引擎用的3.8)
策划需求是要个正六边形的地块,于是在编辑器里画了正六边形的,
image.png
图块边长正好是长(或宽)的一半。(顺便说下正六边形的基本特性:六个边等长,每个角都是120度)
大坑警告:一开始设置了栅格类型Y。在编辑器里如图展示
image.png然而,在游戏里
是错位排布的,找了很久终于找到了源码。
在ccxmllayer.cpp里
TMXLayer::setupTileSprite 设置每个tile的
getPositionAt 获取位置
Vec2 TMXLayer::getPositionAt(const Vec2& pos)
{
Vec2 ret;
switch (_layerOrientation)
{
case TMXOrientationOrtho:
ret = getPositionForOrthoAt(pos);
break;
case TMXOrientationIso:
ret = getPositionForIsoAt(pos);
break;
case TMXOrientationHex: //获取六边形的位置
ret = getPositionForHexAt(pos);
break;
case TMXOrientationStaggered:
ret = getPositionForStaggeredAt(pos);
break;
}
ret = CC_POINT_PIXELS_TO_POINTS( ret );
return ret;
}
...
Vec2 TMXLayer::getPositionForHexAt(const Vec2& pos)
{
float diffY = 0;
if ((int)pos.x % 2 == 1)
{
diffY = -_mapTileSize.height/2 ;//y根据奇偶错位了
}
Vec2 xy(
pos.x * _mapTileSize.width*3/4,//这里x坐标都取了3/4位置,并没有先判断栅格类型
(_layerSize.height - pos.y - 1) * _mapTileSize.height + diffY);//y根据奇偶错位了
return xy;
}
一度以为只能自己实现的时候,灵感一闪,这不就是栅格类型为x的实现方式吗?于是乎,我说服策划这样搞了,显示完全正常
image.png
【记忆不好,只能啰嗦一下】
1、每个格子锚点在左下角
2、编辑器里如果层点击了不可见,那么代码里加载的时候就找不到这个层了
网友评论