tileMap用来做地图,把今天弄的bug很多的demo放上,仅作笔记~
******************************************************************************************************
新建工程,注意大小,在ios模拟器上的分辨率是480*320(横屏),device上是960*480;点击 菜单,地图,新图块,选择sample目录下的图(这个图后面也要复制到ios的resource路径里面),然后用图章工具任意拖动,生成一张地图,保存到ios的resource目录。
注意:默认的sample里面的图的边距是1,1。
用代码方法加载:
1 CCTMXTiledMap* _tileMap = CCTMXTiledMap::create("test.tmx"); 2 3 addChild(_tileMap);
我们需要往上面添加精灵~然后走路等等,这是最基础的需求,好吧,我们开始~~~~
1,在上面添加对象图层:菜单,涂层,添加对象涂层,命名为objects
2,选中objects涂层,在左边的大图上看到变灰的区域,右键,对象属性,添加名称为SpawnPoint
3,用代码把精灵贴到这个对象所在的位置
1 CCTMXObjectGroup* objects = _tileMap->objectGroupNamed("objects"); 2 CCDictionary* spawnPoint = objects->objectNamed("SpawnPoint"); 3 4 int x = spawnPoint->valueForKey("x")->intValue(); 5 int y = spawnPoint->valueForKey("y")->intValue(); 6 7 _player = CCSprite::create("player.png"); 8 9 //精灵默认的anchorPoint是在中间的,我们调整为左下角 10 _player->setAnchorPoint(ccp(0,0)); 11 _player->setPosition(ccp(x,y)); 12 setViewPosition(_player->getPosition()); 13 14 addChild(_player);
设置障碍物~
1,用tileMap添加一个新的图层,自己找一个图,添加个新图块,大小和区块的大小一致~(默认32*32)。
2,tileMap右下角选中新建的图块,右键,图块属性,随便添加一个属性,比如block,值为true。
3,自己在地图上选一些地方用新的这个图块盖上~
4,添加代码
我们现在判断是否能走路是有bug的,各种bug。。。。
1 CCPoint HelloWorld::tileCoordForPosition(CCPoint position) 2 { 3 int x = position.x / _tileMap->getTileSize().width; 4 5 int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height; 6 7 return ccp(x, y); 8 }
1 bool HelloWorld::isPositionBlock(CCPoint position) 2 { 3 CCPoint tileCoord = this->tileCoordForPosition(position); 4 int tileGid = _metaLayer->tileGIDAt(tileCoord); 5 6 CCDictionary *properties = _tileMap->propertiesForGID(tileGid); 7 8 if (properties) 9 { 10 CCString* collision = const_cast<CCString*>(properties->valueForKey("block")); 11 12 if ( 0 == strcmp(collision->getCString(), "true") ) 13 { 14 return true; 15 } 16 } 17 18 return false; 19 }
******************************************************************************************************
以下是全部代码
h文件
1 private: 2 CCSprite* _player;//主角,精灵 3 CCTMXTiledMap* _tileMap;//地图 4 CCTMXLayer* _metaLayer;//地图层上的block层 5 6 CCPoint tileCoordForPosition(CCPoint position);//把具体坐标转换为第几格的那种坐标 7 bool isPositionBlock(CCPoint position);//position的位置能否走通的函数 8 9 void setViewPosition(CCPoint pos); 10 11 void registerWithTouchDispatcher(void);//添加Target级别的touch 12 13 bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 14 void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); 15 void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); 16 void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
cpp里面的init函数
1 this->setTouchEnabled(true); 2 3 _tileMap = CCTMXTiledMap::create("test.tmx"); 4 5 _metaLayer = _tileMap->layerNamed("Meta"); 6 _metaLayer->setVisible(false); 7 8 CCTMXObjectGroup* objects = _tileMap->objectGroupNamed("objects"); 9 CCDictionary* spawnPoint = objects->objectNamed("SpawnPoint"); 10 11 int x = spawnPoint->valueForKey("x")->intValue(); 12 int y = spawnPoint->valueForKey("y")->intValue(); 13 14 _player = CCSprite::create("player.png"); 15 16 //精灵默认的anchorPoint是在中间的,我们调整为左下角 17 _player->setAnchorPoint(ccp(0,0)); 18 _player->setPosition(ccp(x,y)); 19 setViewPosition(_player->getPosition()); 20 21 addChild(_tileMap); 22 addChild(_player);
1 CCPoint HelloWorld::tileCoordForPosition(CCPoint position) 2 { 3 int x = position.x / _tileMap->getTileSize().width; 4 5 int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height; 6 7 return ccp(x, y); 8 } 9 10 bool HelloWorld::isPositionBlock(CCPoint position) 11 { 12 CCPoint tileCoord = this->tileCoordForPosition(position); 13 int tileGid = _metaLayer->tileGIDAt(tileCoord); 14 15 CCDictionary *properties = _tileMap->propertiesForGID(tileGid); 16 17 if (properties) 18 { 19 CCString* collision = const_cast<CCString*>(properties->valueForKey("block")); 20 21 if ( 0 == strcmp(collision->getCString(), "true") ) 22 { 23 return true; 24 } 25 } 26 27 return false; 28 } 29 30 void HelloWorld::setViewPosition(CCPoint pos) 31 { 32 CCSize winSize = CCDirector::sharedDirector()->getWinSize(); 33 int x = fmax(pos.x,winSize.width/2); 34 int y = fmax(pos.y,winSize.height/2); 35 36 x = fmin(x,(_tileMap->getContentSize().width-winSize.width/2)); 37 y = fmin(y,(_tileMap->getContentSize().height-winSize.height/2)); 38 39 40 this->setPosition(ccp(winSize.width/2-x,winSize.height/2-y)); 41 }
添加touch事件
1 void HelloWorld::registerWithTouchDispatcher(void) 2 { 3 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); 4 5 return; 6 } 7 8 bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) 9 { 10 return true; 11 } 12 13 void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) 14 { 15 return; 16 } 17 18 void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) 19 { 20 //这里有算法bug,以后再说了 21 CCPoint viewPos = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView()); 22 CCPoint gamePos = convertToNodeSpace(viewPos); 23 24 if ( !isPositionBlock(gamePos) ) 25 { 26 if(fabs(gamePos.x-_player->getPosition().x)>=fabs(gamePos.y-_player->getPosition().y)) 27 { 28 if(gamePos.x>=_player->getPosition().x) 29 { 30 _player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y)); 31 } 32 else 33 { 34 _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y)); 35 } 36 } 37 else 38 { 39 if(gamePos.y>=_player->getPosition().y) 40 { 41 _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32)); 42 } 43 else 44 { 45 _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32)); 46 } 47 } 48 49 setViewPosition(ccp(_player->getPosition().x,_player->getPosition().y)); 50 } 51 52 return; 53 } 54 55 void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) 56 { 57 return; 58 }