cocos2dx -- tiledMap
tiled Map tiled map 可以包含两种层
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上 每个对象的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语言二维数组一样
/* 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) 即 Sprite真正在地图上的显示需要看 设置的位置 和 其锚点坐标 关于此可以参考如下: 当Sprite是通过tileMap->addChild(xxx);时,把Sprite移动到屏幕的正中心操作?? 如上图,红色框是屏幕,绿色是map框,黑色点事Sprite 相当于在地图上,Sprite要从origin位置移动到屏幕中心的红色点dest位置,同时地图也要跟着移动 但是因为tileMap->addChild(sprite);所以只需要移动map,sprite将会跟着移动. 当地图跑出屏幕时,就调整,这是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);
}
参考学习: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |