tiled Map
http://www.mapeditor.org/
tiled map 可以包含两种层
map layer
可以直接通过layer的name值获取
CCTMXLayer *backLayer = tileMap->layerNamed("layer_1");
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;
}
锚点坐标
Sprite的position都是(1,1)
当 锚点坐标为(0.5, 0.5) 时 如上图的红色部分显示
当 锚点坐标为(0, 0) 时 如上图的蓝色部分显示
即 Sprite真正在地图上的显示需要看 设置的位置 和 其锚点坐标
关于此可以参考如下:
http://www.jb51.net/article/55012.htm
http://www.jb51.cc/article/p-qqctaeby-po.html
当Sprite是通过tileMap->addChild(xxx);时,把Sprite移动到屏幕的正中心操作??
如上图,红色框是屏幕,绿色是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);
}