转载请标明:转载自【小枫栏目】,博文链接:http://blog.csdn.net/rexuefengye/article/details/10416499
Tiled Map Editor是Cocos2d-x支持的地图编辑器,使用Tiled编辑出的地图可以很方便的被Cocos2d-x使用Tiled的官网是Tiled Map Editor。我使用的地图编辑器是QT版本。
1)选择“文件->新地图”,新建地图工程,在弹出的对话框中设置地图的高度和宽度、图块的大小以及地图的方向,如图
2)选择“地图->新图块”导入图素文件,在弹出的对话框中设置图块的大小、边矩和偏移量等,如图
3)选择完成图块后,左下角的部分就显示了目前的图块,选择相应图块便可以填充某图了,如图
4)工具栏中提供了不同工具填充,包括图章、填充、橡皮擦和选择矩形区域等。
5)屏幕的右上角为图层编辑部分,同时如图
通过图层编辑部分可以选择我们需要编辑的图层,并且可以排除其他层的干扰。
6)有关使用方法,可参考:http://www.joynb.net/blog/archives/427,最后效果图如图
1)新建地图类并在地图中显示
HelloWorldScene.cpp
bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCTMXTiledMap *map = CCTMXTiledMap::create("orthogonal-test4.tmx"); this->addChild(map,0,kTagTileMap); CCSize size = map->getContentSize(); //精灵批处理 CCArray* pChildrenArray = map->getChildren(); CCSpriteBatchNode* child = NULL; CCObject* pObject = NULL; CCARRAY_FOREACH(pChildrenArray, pObject) { child = (CCSpriteBatchNode*)pObject; if (!child) break; //设置抗锯齿 child->getTexture()->setAntiAliasTexParameters(); } return true; }运行效果图:
2) 普通视角获得对应位置图素:
在init()添加
//"Layer 0"为Tile的层名字 CCTMXLayer* layer = map->layerNamed("Layer 0"); CCSize s = layer->getLayerSize(); //获得相应位置图素(地图四个角图素) CCSprite* sprite; sprite = layer->tileAt(ccp(0,0)); sprite->setScale(2); sprite = layer->tileAt(ccp(s.width-1,0)); sprite->setScale(2); sprite = layer->tileAt(ccp(0,s.height-1)); sprite->setScale(2); sprite = layer->tileAt(ccp(s.width-1,s.height-1)); sprite->setScale(2); //定时移动地图右上角的sprite schedule( schedule_selector(HelloWorld::removeSprite), 2 );回调函数
void HelloWorld::removeSprite(float dt) { unschedule(schedule_selector(HelloWorld::removeSprite)); CCTMXTiledMap *map = (CCTMXTiledMap*)getChildByTag(kTagTileMap); CCTMXLayer* layer = map->layerNamed("Layer 0"); CCSize s = layer->getLayerSize(); CCSprite* sprite = layer->tileAt( ccp(s.width-1,0) ); layer->removeChild(sprite, true); }效果图
3) 通过具体位置获得地图的行列数
//获得具体位置的行列数,其中playerpoint为玩家获得屏幕点坐标 float indexx = (playerpoint.x) / map->getTileSize().width; float indexy = map->getMapSize().height - (playerpoint.y) / map->getTileSize().width;
如上,使用坐标化成行列数,因为Cocos2d-x 中的坐标系中,轴是从下到上依次增加,而地图恰好相反,所以需要做一个转换,用总的行数减去y轴坐标除以图素高,结果才是在图素的函数。
HelloWorldScene.h
cocos2d::CCSprite* hero; void repositionSprite(float dt);HelloWorldScene.cpp
CCTMXTiledMap *map = CCTMXTiledMap::create("orthogonal-test-zorder.tmx"); this->addChild(map,0,kTagTileMap); CCSize s = map->getContentSize(); CCLOG("ContentSize: %f,%f",s.width,s.height); //map->setPosition(ccp(-s.width/2,0)); hero = CCSprite::create("Role.png"); map->addChild(hero,map->getChildren()->count()); hero->retain(); int mapWidth = map ->getMapSize().width * map->getTileSize().width; hero->setPosition(CC_POINT_PIXELS_TO_POINTS(ccp(mapWidth/2,0))); CCActionInterval* move = CCMoveBy::create(10, ccp(300, 250)); CCActionInterval* back = move->reverse(); CCFiniteTimeAction* seq = CCSequence::create(move,back,NULL); hero->runAction(CCRepeatForever::create((CCActionInterval*)seq)); schedule(schedule_selector(HelloWorld::repositionSprite));
主要实现精灵和地图的遮挡关系:
void HelloWorld::repositionSprite(float dt) { CCPoint p = hero->getPosition(); p = CC_POINT_PIXELS_TO_POINTS(p); CCNode *map = getChildByTag(kTagTileMap); int newZ = 4 - ((p.y -10) / 81); newZ = MAX(newZ, 0); map->reorderChild(hero, newZ); }效果图
参考书籍《Cocos2d-x 权威指南》