今天用cocos2d-1.0.1-x-0.9.2来测试tiled map的功能,结果发现翻转过的tile都不见了,调试代码发现原来代码里不支持,没有对x,y翻转作处理,结果翻转过的tile导致数值多大没有被现实出来。
( 注:最新的Tiled map已经支持flip x和flip y,选中tile按键盘上x键,y键即可,其他旋转功能他们正在添加中。。。最新版本可以从http://www.mapeditor.org/下载)
修改代码实现此功能, CCTMXLayer.cpp文件里针对appendTileForGID方法作出修改,上代码:
// used only when parsing the map. useless after the map was parsed // since lot's of assumptions are no longer true CCSprite * CCTMXLayer::appendTileForGID(unsigned int gid, const CCPoint& pos) { //lancer add for tile flip //setFlipX int flip = gid>>28; int tileid = gid &0x0FFFFFFF; gid = tileid; //end CCRect rect = m_pTileSet->rectForGID(gid); rect = CCRectMake(rect.origin.x / m_fContentScaleFactor, rect.origin.y / m_fContentScaleFactor, rect.size.width/ m_fContentScaleFactor, rect.size.height/ m_fContentScaleFactor); int z = (int)(pos.x + pos.y * m_tLayerSize.width); if( ! m_pReusedTile ) { m_pReusedTile = new CCSprite(); m_pReusedTile->initWithBatchNode(this, rect); } else { m_pReusedTile->initWithBatchNode(this, rect); } m_pReusedTile->setPosition(positionAt(pos)); m_pReusedTile->setVertexZ((float)vertexZForPos(pos)); m_pReusedTile->setAnchorPoint(CCPointZero); m_pReusedTile->setOpacity(m_cOpacity); //lancer add for tile flip //setFlipX cocos2d::CCLog("---gid=%d, flip sign=%d, tileid=%d\n", gid, flip, tileid); #define TILE_FLIP_X 8 #define TILE_FLIP_Y 4 if(flip & TILE_FLIP_X){ cocos2d::CCLog("set flip x\n"); m_pReusedTile->setFlipX(true); } if(flip & TILE_FLIP_Y){ cocos2d::CCLog("set flip y\n"); m_pReusedTile->setFlipY(true); } //end // optimization: // The difference between appendTileForGID and insertTileforGID is that append is faster, since // it appends the tile at the end of the texture atlas unsigned int indexForZ = m_pAtlasIndexArray->num; // don't add it using the "standard" way. addQuadFromSprite(m_pReusedTile, indexForZ); // append should be after addQuadFromSprite since it modifies the quantity values ccCArrayInsertValueAtIndex(m_pAtlasIndexArray, (void*)z, indexForZ); return m_pReusedTile; }
PS:转载请保留以下信息
Author:smilelance