TiledMap+TexturePacker,解决cocos2dx下tiled地图1坑

??

tiled 做小地图没什么问题。可是要做大型地图应用到cocos2dx中。各种坑。事实上我们仅仅须要简单改动cocos2dx解析代码

1 在编辑器里能够自由加入多个图块, 解析仅仅能弹出断言 仅仅能一个纹理。

==》怎么办,仅仅须要TexturePacker整合成一个纹理集。在解析代码中加入这样的支持就可以,很方便

下面代码 都是我从代码提取出来的 会有点乱。

TMXTiledMap.h 加入

TMXLayer * parseLayer(Texture2D *texture, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo);//_wb_20140325

std::string _tmxFileName;//_wb_20140325

TMXTiledMap.cpp 改动

bool TMXTiledMap::initWithTMXFile(const std::string& tmxFile)

{

加入

_tmxFileName = tmxFile;//_wb_20140325

}

在void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo)中加入改动

void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo)

{

_mapSize = mapInfo->getMapSize();

_tileSize = mapInfo->getTileSize();

_mapOrientation = mapInfo->getOrientation();

_objectGroups = mapInfo->getObjectGroups();

_properties = mapInfo->getProperties();

_tileProperties = mapInfo->getTileProperties();

//_wb_20140325

std::string plistfile = _tmxFileName.substr(0, _tmxFileName.find_last_of(‘.‘) + 1) + "plist";

SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plistfile.c_str());

std::string pngfile = _tmxFileName.substr(0, _tmxFileName.find_last_of(‘.‘) + 1) + "png";

Texture2D *texture = TextureCache::getInstance()->getTextureForKey(pngfile.c_str());

int idx=0;

auto& layers = _layersInfo;

for(const auto &layerInfo : layers) {

if (layerInfo->_visible)

{

TMXLayer *child = parseLayer(texture,layerInfo, mapInfo);

addChild(child, idx, idx);

// update content size with the max size

const Size& childSize = child->getContentSize();

Size currentSize = this->getContentSize();

currentSize.width = std::max( currentSize.width, childSize.width );

currentSize.height = std::max( currentSize.height, childSize.height );

this->setContentSize(currentSize);

idx++;

}

}

}

TMXLayer * TMXTiledMap::parseLayer( Texture2D *texture,TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo)

{

TMXLayer *layer = TMXLayer::create(texture, layerInfo, mapInfo);

// tell the layerinfo to release the ownership of the tiles map.

layerInfo->_ownTiles = false;

layer->setupTiles();

return layer;

}

TMXLayer.h

加入

TMXMapInfo * _mapInfo;//_wb_20140325

static TMXLayer * create( Texture2D *texture, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo);//_wb_20140325

bool initWithTilesetInfo(Texture2D *texture,  TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo);//_wb_20140325

/_wb_20140325

TMXLayer * TMXLayer::create( Texture2D *texture, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo)

{

TMXLayer *pRet = new TMXLayer();

if (pRet->initWithTilesetInfo(texture,layerInfo, mapInfo))

{

pRet->autorelease();

return pRet;

}

return NULL;

}

//_wb_20140325

bool TMXLayer::initWithTilesetInfo(Texture2D *texture,  TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo)

{

// XXX: is 35% a good estimate ?

Size size = layerInfo->_layerSize;

float totalNumberOfTiles = size.width * size.height;

float capacity = totalNumberOfTiles * 0.35f + 1; // 35 percent is oupied ?

if (SpriteBatchNode::initWithTexture(texture, (unsigned int)capacity))

{

// layerInfo

_layerName = layerInfo->_name;

_layerSize = size;

_tiles = layerInfo->_tiles;

_opacity = layerInfo->_opacity;

setProperties(layerInfo->getProperties());

_contentScaleFactor = Director::getInstance()->getContentScaleFactor();

_mapInfo = mapInfo;//_wb_20140325

CC_SAFE_RETAIN(_mapInfo);

// mapInfo

_mapTileSize = mapInfo->getTileSize();

_layerOrientation = mapInfo->getOrientation();

// offset (after layer orientation is set);

Point offset = this->calculateLayerOffset(layerInfo->_offset);

this->setPosition(CC_POINT_PIXELS_TO_POINTS(offset));

_atlasIndexArray = ccCArrayNew(totalNumberOfTiles);

this->setContentSize(CC_SIZE_PIXELS_TO_POINTS(Size(_layerSize.width * _mapTileSize.width, _layerSize.height * _mapTileSize.height)));

_useAutomaticVertexZ = false;

_vertexZvalue = 0;

return true;

}

return false;

}

// TMXLayer - setup Tiles

void TMXLayer::setupTiles()

{

_textureAtlas->getTexture()->setAliasTexParameters();

// Parse cocos2d properties

this->parseInternalProperties();

for (int y=0; y < _layerSize.height; y++)

{

for (int x=0; x < _layerSize.width; x++)

{

int pos = static_cast<int>(x + _layerSize.width * y);

int gid = _tiles[ pos ];

// XXX: gid == 0 --> empty tile

if (gid != 0)

{

this->appendTileForGID(gid, Point(x, y));

}

}

}

}

// since lot‘s of assumptions are no longer true

Sprite * TMXLayer::appendTileForGID(uint32_t gid, const Point& pos)

{

TMXTilesetInfo* tileSet = _mapInfo->tilesetForGid(static_cast<int>(gid & kTMXFlippedMask));//_wb_20140325

if (tileSet /*&& gid != 0 && (static_cast<int>((gid & kTMXFlippedMask)) - tileSet->_firstGid) >= 0*/)

{

// _wb_20140325  Rect rect = tileSet->getRectForGID(gid);

//   _wb_20140325      rect = CC_RECT_PIXELS_TO_POINTS(rect);

intptr_t z = (intptr_t)(pos.x + pos.y * _layerSize.width);

//_wb_20140325  Sprite *tile =  reusedTileWithRect(rect);

Sprite * tile = Sprite::createWithSpriteFrameName(tileSet->_sourceImage.c_str());  //_wb_

setupTileSprite(tile ,pos ,gid);

// optimization:

// The difference between appendTileForGID and insertTileforGID is that append is faster, since

// it appends the tile at the end of the texture atlas

ssize_t indexForZ = _atlasIndexArray->num;

// don‘t add it using the "standard" way.

insertQuadFromSprite(tile, indexForZ);

// append should be after addQuadFromSprite since it modifies the quantity values

ccCArrayInsertValueAtIndex(_atlasIndexArray, (void*)z, indexForZ);

return tile;

}

return nullptr;

}

TMXTilesetInfo改动

TMXTilesetInfo *   TMXMapInfo::tilesetForGid(int _gid)//_wb_20140325

{//_wb_20140325

if (!_tilesets.empty())

{

for (auto iter = _tilesets.crbegin(); iter != _tilesets.crend(); ++iter)

{

TMXTilesetInfo* tileset = dynamic_cast<TMXTilesetInfo*>(*iter);

if (tileset->_firstGid  == _gid)

{

return tileset;

}

}

}

return nullptr;

}

??

时间: 2024-10-11 16:18:14

TiledMap+TexturePacker,解决cocos2dx下tiled地图1坑的相关文章

Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测

图: 程序代码: 头文件声明函数及变量 void registerWithTouchDispatcher(void); bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); void setViewpointCenter(CCPoint position) ; void setSpritePoint(CCPoint position) ;

Cocos2d-x之瓦片地图 Tiled

Cocos2d-x之瓦片地图 Tiled 首先使用 瓦片地图编辑器(Tiled) 制作一个瓦片地图,并将其放入工程的Resources目录下 功能实现: 将地图显示在窗体中 将精灵添加到地图定义的对象层中的一个对象上 移动精灵,使其可以和碰撞图层上的精灵发生碰撞 碰撞后碰撞图层上的精灵消失,label字体改变 代码部分: HelloWorldScene.h 1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3 4

Cocos2d-x Tiled地图编辑器(一)基本使用

8.2 模板 String模块包含一个用途广泛的类,此类为最终用户的编辑提供了简单的语法支持.这让用户不修改应用程序的前提下实现他们应用程序的定制. 这种格式使用$加有效的python标识符(数字.字母和下划线)形式的占位符名称.通过在占位符两侧使用大括号便可以不用空格分隔在其后面跟随更多的字母和数字字符.使用$$来创建一个单独$转码字符. >>> from string import Template >>> t = Template('${village}folk 

解决linux下cocos2dx不能播放声音

cocos2dx2.2.1在linux下引用#include "SimpleAudioEngine.h",报错找不到该文件. 修改makefile文件,添加 SHAREDLIBS += -lcocosdenshion COCOS_LIBS +=$(LIB_DIR)/linux/release/libcocosdenshion.so 并将cocos2d-x-2.2.1/CocosDenshion/include目录下的SimpleAudioEngine.h和Export.h拷贝到ecli

linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol &amp;#39;[email&#160;protected]@GLIBC_2.2.5&amp;#39;

解决cocos2d-x中编译出现的一个小问题 对于cocos2d-x 2.×中编译中,若头文件里引入了#include "cocos-ext.h",在进行C++编译的时候会遇到例如以下错误: undefined reference to symbol '[email protected]@GLIBC_2.2.5'/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command li

Cocos2d-x使用瓦片地图

图所示的复杂地图可以使用瓦片地图技术,瓦片地图是用一些小图片(瓦片)拼接而成,这样可以大大地减少内存消耗.如图所示的瓦片地图,只需要如图所示的三个瓦片就可以了. 瓦片地图 地图中的瓦片 瓦片地图的分类瓦片地图可以有三种分类:直角地图.斜角地图和六边形地图.1.直角地图直角地图,如图所示是使用方形瓦片构建,看上去是垂直向下观察的鸟瞰图,构成瓦片地图的瓦片不一定是正方形,也可以是长方形瓦片. 2.斜角地图斜角地图,如图所示是使用菱形瓦片构建.斜角地图是将视角旋转到45度,斜角地图能够使我们的大脑错误

关于Cocos2d-x的瓦片地图

1.cocos2d-x的瓦片地图是用Tiled地图编辑器做的,这个软件开源,免费,一般都是用它制作瓦片地图. 2.瓦片地图是由块层和对象组成的,块层的作用是显示和一些重叠的时候覆盖角色的作用,而对象是可以进行一些事件的触发和处理的.可以从制作好的plist文件中获取主角对象的坐标,这个坐标可以作为精灵创建时的初始坐标. 3.第一层块层可以是背景层,第二层块层可以是事物层,然后再加一个主角对象,打包成plist文件就可以了. 4.地图随主角的移动,其实是屏幕的移动,瓦片地图本身没有动,主角在动,动

解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题

原地址: http://blog.163.com/[email protected]/blog/static/6070970220132511558143/ 解决方法:    复制 ***\cocos2dx\platform\android\java\src\ (***为cocos2d-x更目录) 到你android项目中的src文件夹中这样就又有一个麻烦问题,是不是每次创建都要复制呢,答案当然是否定的,来看一劳永逸的方法,定位 (cocos2d-x根目录)\template\android\,

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

原文地址:http://segmentfault.com/a/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明白了,我自己也是个初学者,摸索了半天,总结如下: cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质2.在cocos2d-x项目里,把纯C函数注册进Lua环境,理解cocos