cocos2dx -- tiledMap

tiled Map
http://www.mapeditor.org/

cocos2dx -- tiledMap_第1张图片

cocos2dx -- tiledMap_第2张图片

cocos2dx -- tiledMap_第3张图片

tiled map 可以包含两种层

  1. map layer

    可以直接通过layer的name值获取

CCTMXLayer *backLayer = tileMap->layerNamed("layer_1");
  1. Objects layer
    先获取 CCTMXObjectGroup,再根据object的name获取对象
CCTMXObjectGroup *og = tileMap->objectGroupNamed("spritePosition");

CCDictionary *posInfoDict = og->objectNamed("ninjaBirthPoint");

对于地图上的对象节点 可以绑定一个Sprite

CCTMXObjectGroup *og = tileMap->objectGroupNamed("spritePosition");
CCDictionary *posInfoDict = og->objectNamed("ninjaBirthPoint");

int x = posInfoDict->valueForKey("x")->intValue();
int y = posInfoDict->valueForKey("y")->intValue();

ninja = CCSprite::create("Player.png");
ninja->setPosition(ccp(x, y));
tileMap->addChild(ninja); // this->addChild(ninja);

CCSprite可以加到CCLayer上
this->addChild(ninja);
也可以加到tile map上,
tileMap->addChild(ninja);

每个对象的setPosition都是相对于他的父节点。父节点移动,子节点跟着移动。

可以通过convertToNodeSpace方法把相对于屏幕的坐标(准确叫世界坐标)转化成为相对于节点的坐标

void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    CCPoint touchPos = pTouch->getLocation();
    touchPos = tileMap->convertToNodeSpace(touchPos); //从相对屏幕转化为相对map
    //... 
}

地图坐标

tiledMap

每一个地砖大小,整个地图有多少*多少的地砖构成

int Map_Width = tileMap->getTileSize().width * tileMap->getMapSize().width;
int Map_Hight = tileMap->getTileSize().height * tileMap->getMapSize().height;

tiledMap有自己的坐标系统,类似于c语言二维数组一样

(0,0) (0,1)
(1,0) (1,1)
/* cocos2d的坐标转化成tileMap坐标 */
CCPoint HelloWorld::cocoscoord2tileMapcoord(cocos2d::CCPoint pos)
{
    CCPoint coord;
    coord.x = pos.x / tileMap->getTileSize().width;
    coord.y = ((tileMap->getMapSize().height * tileMap->getTileSize().height) - pos.y) /
        tileMap->getTileSize().height;

    coord.x = (int)coord.x; // map坐标是类似矩阵(0,0) (0,1) 这种坐标
    coord.y = (int)coord.y;
    return coord;
}

锚点坐标

cocos2dx -- tiledMap_第4张图片

Sprite的position都是(1,1)
当 锚点坐标为(0.5, 0.5) 时 如上图的红色部分显示
当 锚点坐标为(0, 0) 时 如上图的蓝色部分显示

即 Sprite真正在地图上的显示需要看 设置的位置 和 其锚点坐标

关于此可以参考如下:
http://www.jb51.net/article/55012.htm
http://blog.csdn.net/xuguangsoft/article/details/8425623

当Sprite是通过tileMap->addChild(xxx);时,把Sprite移动到屏幕的正中心操作??
cocos2dx -- tiledMap_第5张图片

如上图,红色框是屏幕,绿色是map框,黑色点事Sprite

相当于在地图上,Sprite要从origin位置移动到屏幕中心的红色点dest位置,同时地图也要跟着移动

但是因为tileMap->addChild(sprite);所以只需要移动map,sprite将会跟着移动.
所以最后的关键是如何设置map的position

当地图跑出屏幕时,就调整,这是sprite可能不在屏幕中心位置,不过sprite总是可见的

最后的解决函数如下

void HelloWorld::setMapPosForView(cocos2d::CCPoint playerPos)
{
    CCSize size = CCDirector::sharedDirector()->getWinSize();

    CCPoint orig = playerPos;
    CCPoint dest = ccp(size.width/2, size.height/2);
    CCPoint distance = ccpSub(dest, orig);
    CCPoint newMapPos = distance ; //ccp(dest.x - orig.x , dest.y - orig.y);

    // 保证地图不会漏出黑边
    newMapPos.x = newMapPos.x > 0 ? 0 : newMapPos.x;
    newMapPos.y = newMapPos.y > 0 ? 0 : newMapPos.y;

    int Map_Width = tileMap->getTileSize().width * tileMap->getMapSize().width;
    int Map_Hight = tileMap->getTileSize().height * tileMap->getMapSize().height;

    newMapPos.x = newMapPos.x < size.width - Map_Width ?
        size.width -Map_Width : newMapPos.x;

    newMapPos.y = newMapPos.y < size.height - Map_Hight ?
        size.height - Map_Hight : newMapPos.y;
    //
    tileMap->setPosition(newMapPos);
}

参考学习:
http://blog.csdn.net/s_xing/article/details/20165097

你可能感兴趣的:(cocos2dx -- tiledMap)