diff --git a/cocos2dx/cocos2dx-uphone.vcproj b/cocos2dx/cocos2dx-uphone.vcproj index 3b87826d25..99f8a5bc02 100644 --- a/cocos2dx/cocos2dx-uphone.vcproj +++ b/cocos2dx/cocos2dx-uphone.vcproj @@ -460,6 +460,10 @@ RelativePath=".\include\CCTMXObjectGroup.h" > + + @@ -784,6 +788,10 @@ RelativePath=".\tileMap_parallax_nodes\CCTMXObjectGroup.cpp" > + + diff --git a/cocos2dx/include/CCTMXTiledMap.h b/cocos2dx/include/CCTMXTiledMap.h new file mode 100644 index 0000000000..1744454a20 --- /dev/null +++ b/cocos2dx/include/CCTMXTiledMap.h @@ -0,0 +1,152 @@ +/**************************************************************************** +Copyright (c) 2010 cocos2d-x.org + +http://www.cocos2d-x.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +****************************************************************************/ +#ifndef __CCTMX_TILE_MAP_H__ +#define __CCTMX_TILE_MAP_H__ +#include "CCNode.h" +#include "CCTMXObjectGroup.h" + +namespace cocos2d { + + class CCTMXObjectGroup; + class CCTMXLayer; + class CCTMXLayerInfo; + class CCTMXTilesetInfo; + class CCTMXMapInfo; + + /** Possible oritentations of the TMX map */ + enum + { + /** Orthogonal orientation */ + CCTMXOrientationOrtho, + + /** Hexagonal orientation */ + CCTMXOrientationHex, + + /** Isometric orientation */ + CCTMXOrientationIso, + }; + + /** CCTMXTiledMap knows how to parse and render a TMX map. + + It adds support for the TMX tiled map format used by http://www.mapeditor.org + It supports isometric, hexagonal and orthogonal tiles. + It also supports object groups, objects, and properties. + + Features: + - Each tile will be treated as an CCSprite + - Each tile can be rotated / moved / scaled / tinted / "opacitied" + - Tiles can be added/removed in runtime + - The z-order of the tiles can be modified in runtime. + - Each tile has an anchorPoint of (0,0) + - The anchorPoint of the TMXTileMap is (0,0) + - The TMX layers will be added as a child + - The TMX layers will be aliased by default + - The tileset image will be loaded using the TextureMgr + - Each tile will have a unique tag + - Each tile will have a unique z value. top-left: z=1, bottom-right: z=max z + - Each object group will be treated as an NSMutableArray + - Objects can be created using your own classes or a generic object class which will contain all the properties in a dictionary + - Properties can be assigned to the Map, Layer, Object Group, and Object + + Limitations: + - It only supports one tileset per layer. + - Embeded images are not supported + - It only supports the XML format (the JSON format is not supported) + + Technical description: + Each layer is created using an TMXLayer (subclass of CCSpriteSheet). If you have 5 layers, then 5 TMXLayer will be created, + unless the layer visibility is off. In that case, the layer won't be created at all. + You can obtain the layers (TMXLayer objects) at runtime by: + - [map getChildByTag: tag_number]; // 0=1st layer, 1=2nd layer, 2=3rd layer, etc... + - [map layerNamed: name_of_the_layer]; + + Each object group is created using a TMXObjectGroup which is a subclass of NSMutableArray. + You can obtain the object groups at runtime by: + - [map objectGroupNamed: name_of_the_object_group]; + + Each object is a TMXObject. + + Each property is stored as a key-value pair in an NSMutableDictionary. + You can obtain the properties at runtime by: + + [map propertyNamed: name_of_the_property]; + [layer propertyNamed: name_of_the_property]; + [objectGroup propertyNamed: name_of_the_property]; + [object propertyNamed: name_of_the_property]; + + @since v0.8.1 + */ + class CCX_DLL CCTMXTiledMap : public CCNode + { + /** the map's size property measured in tiles */ + CCX_SYNTHESIZE(CGSize, m_tMapSize, MapSize); + /** the tiles's size property measured in pixels */ + CCX_SYNTHESIZE(CGSize, m_tTileSize, TileSize); + /** map orientation */ + CCX_SYNTHESIZE(int, m_nMapOrientation, MapOrientation); + /** object groups */ + CCX_SYNTHESIZE(NSMutableArray*, m_pObjectGroups, ObjectGroups); + /** properties */ + CCX_SYNTHESIZE(StringToStringDictionary*, m_pProperties, Properties); + public: + CCTMXTiledMap(); + virtual ~CCTMXTiledMap(); + + /** creates a TMX Tiled Map with a TMX file.*/ + static CCTMXTiledMap * tiledMapWithTMXFile(const char *tmxFile); + + /** initializes a TMX Tiled Map with a TMX file */ + bool initWithTMXFile(const char *tmxFile); + + /** return the TMXLayer for the specific layer */ + CCTMXLayer* layerNamed(const char *layerName); + + /** return the TMXObjectGroup for the secific group */ + CCTMXObjectGroup* objectGroupNamed(const char *groupName); + + /** return the TMXObjectGroup for the secific group + @deprecated Use map#objectGroupNamed instead + */ + CCTMXObjectGroup* groupNamed(const char *groupName); + + /** return the value for the specific property name */ + const char *propertyNamed(const char *propertyName); + + /** return properties dictionary for tile GID */ + StringToStringDictionary *propertiesForGID(int GID); + + private: + CCTMXLayer * parseLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo); + CCTMXTilesetInfo * tilesetForLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo); + + protected: + // tile properties + std::map *m_pTileProperties; + + }; + +}// namespace cocos2d +#endif //__CCTMX_TILE_MAP_H__ + + diff --git a/cocos2dx/include/CCTMXXMLParser.h b/cocos2dx/include/CCTMXXMLParser.h index 850190d389..7e6ff4fd80 100644 --- a/cocos2dx/include/CCTMXXMLParser.h +++ b/cocos2dx/include/CCTMXXMLParser.h @@ -143,6 +143,8 @@ namespace cocos2d { CCX_SYNTHESIZE(std::string, m_sCurrentString, CurrentString); // is stroing characters? CCX_SYNTHESIZE(bool, m_bStoringCharacters, StoringCharacters); + // properties + CCX_SYNTHESIZE(StringToStringDictionary*, m_pProperties, Properties); public: CCTMXMapInfo(){} virtual ~CCTMXMapInfo(); @@ -153,13 +155,9 @@ namespace cocos2d { /* initalises parsing of an XML file, either a tmx (Map) file or tsx (Tileset) file */ bool parseXMLFile(const char *xmlFilename); - inline StringToStringDictionary* getProperties(){return m_pProperties;} - inline void setProperties(StringToStringDictionary * var){m_pProperties = var;} inline std::map* getTileProperties(){return m_pTileProperties;} inline void setTileProperties(std::map * var){m_pTileProperties = var;} protected: - // properties - StringToStringDictionary* m_pProperties; // tile properties std::map* m_pTileProperties; }; diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp index a15a3db8b7..045b53199d 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp @@ -21,11 +21,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "CCLayer.h" #include "CCTMXLayer.h" #include "CCTMXXMLParser.h" +#include "CCTMXTiledMap.h" #include "CCSprite.h" -#include "CCSpriteSheet.h" #include "CCTextureCache.h" #include "CGPointExtension.h" @@ -510,18 +509,6 @@ namespace cocos2d { } } - /** Possible oritentations of the TMX map */ - enum - { - /** Orthogonal orientation */ - CCTMXOrientationOrtho, - - /** Hexagonal orientation */ - CCTMXOrientationHex, - - /** Isometric orientation */ - CCTMXOrientationIso, - };/// @todo to be deleted //CCTMXLayer - obtaining positions, offset CGPoint CCTMXLayer::calculateLayerOffset(CGPoint pos) { diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp new file mode 100644 index 0000000000..01a21a401e --- /dev/null +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp @@ -0,0 +1,229 @@ +/**************************************************************************** +Copyright (c) 2010 cocos2d-x.org + +http://www.cocos2d-x.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +****************************************************************************/ +#include "CCTMXTiledMap.h" +#include "CCTMXXMLParser.h" +#include "CCTMXLayer.h" +#include "CCSprite.h" +#include "CGPointExtension.h" + +namespace cocos2d{ + + // implementation CCTMXTiledMap + CCTMXTiledMap * CCTMXTiledMap::tiledMapWithTMXFile(const char *tmxFile) + { + CCTMXTiledMap *pRet = new CCTMXTiledMap(); + if (pRet->initWithTMXFile(tmxFile)) + { + pRet->autorelease(); + return pRet; + } + return NULL; + } + bool CCTMXTiledMap::initWithTMXFile(const char *tmxFile) + { + NSAssert(tmxFile != NULL && strlen(tmxFile)>0, "TMXTiledMap: tmx file should not bi nil"); + + setContentSize(CGSizeZero); + + CCTMXMapInfo *mapInfo = CCTMXMapInfo::formatWithTMXFile(tmxFile); + + NSAssert( mapInfo->getTilesets()->count() != 0, "TMXTiledMap: Map not found. Please check the filename."); + + m_tMapSize = mapInfo->getMapSize(); + m_tTileSize = mapInfo->getTileSize(); + m_nMapOrientation = mapInfo->getOrientation(); + m_pObjectGroups = mapInfo->getObjectGroups(); + m_pObjectGroups->retain(); + m_pProperties = mapInfo->getProperties(); + m_pTileProperties = mapInfo->getTileProperties(); + + int idx = 0; + + if (mapInfo->getLayers() && mapInfo->getLayers()->count()>0) + { + CCTMXLayerInfo *layerInfo = NULL; + NSMutableArray::NSMutableArrayIterator rit; + for (rit = mapInfo->getLayers()->begin(); rit != mapInfo->getLayers()->end(); ++rit) + { + layerInfo = *rit; + if (!layerInfo && layerInfo->m_bVisible) + { + CCTMXLayer *child = parseLayer(layerInfo, mapInfo); + addChild((CCNode*)child, idx, idx); + + // update content size with the max size + CGSize childSize = child->getContentSize(); + CGSize currentSize = this->getContentSize(); + currentSize.width = MAX( currentSize.width, childSize.width ); + currentSize.height = MAX( currentSize.height, childSize.height ); + this->setContentSize(currentSize); + + idx++; + } + } + } + return true; + } + CCTMXTiledMap::CCTMXTiledMap() + { + + } + CCTMXTiledMap::~CCTMXTiledMap() + { + m_pObjectGroups->release(); + if (m_pProperties) + { + m_pProperties->clear(); + delete m_pProperties; + } + if (m_pTileProperties) + { + m_pTileProperties->clear(); + delete m_pTileProperties; + } + } + + // private + CCTMXLayer * CCTMXTiledMap::parseLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo) + { + CCTMXTilesetInfo *tileset = tilesetForLayer(layerInfo, mapInfo); + CCTMXLayer *layer = CCTMXLayer::layerWithTilesetInfo(tileset, layerInfo, mapInfo); + + // tell the layerinfo to release the ownership of the tiles map. + layerInfo->m_bOwnTiles = false; + layer->setupTiles(); + + return layer; + } + + CCTMXTilesetInfo * CCTMXTiledMap::tilesetForLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo) + { + CCTMXTilesetInfo *tileset = NULL; + //CFByteOrder o = CFByteOrderGetCurrent(); + + CGSize size = layerInfo->m_tLayerSize; + + if (mapInfo->getTilesets() && mapInfo->getTilesets()->count()>0) + { + CCTMXTilesetInfo *tileset = NULL; + NSMutableArray::NSMutableArrayRevIterator it; + for (it = mapInfo->getTilesets()->rbegin(); it != mapInfo->getTilesets()->rend(); ++it) + { + tileset = *it; + if (tileset) + { + for( unsigned int y=0; y < size.height; y++ ) + { + for( unsigned int x=0; x < size.width; x++ ) + { + unsigned int pos = (unsigned int)(x + size.width * y); + unsigned int gid = layerInfo->m_pTiles[ pos ]; + + // gid are stored in little endian. + // if host is big endian, then swap + //if( o == CFByteOrderBigEndian ) + // gid = CFSwapInt32( gid ); + /* We support little endian.*/ + + // XXX: gid == 0 --> empty tile + if( gid != 0 ) + { + // Optimization: quick return + // if the layer is invalid (more than 1 tileset per layer) an assert will be thrown later + if( gid >= tileset->m_uFirstGid ) + return tileset; + } + } + } + } + } + } + + // If all the tiles are 0, return empty tileset + CCLOG("cocos2d: Warning: TMX Layer '%@' has no tiles", layerInfo.name); + return tileset; + } + + + // public + CCTMXLayer * CCTMXTiledMap::layerNamed(const char *layerName) + { + std::string sLayerName = layerName; + if (m_pChildren && m_pChildren->count()>0) + { + CCTMXLayer *layer; + NSMutableArray::NSMutableArrayIterator it; + for (it = m_pChildren->begin(); it != m_pChildren->end(); ++it) + { + layer = (CCTMXLayer*)(*it); + if (layer && layer->getLayerName() == sLayerName) + { + return layer; + } + } + } + + // layer not found + return NULL; + } + CCTMXObjectGroup * CCTMXTiledMap::objectGroupNamed(const char *groupName) + { + std::string sGroupName = groupName; + if (m_pChildren && m_pChildren->count()>0) + { + CCTMXObjectGroup *objectGroup; + NSMutableArray::NSMutableArrayIterator it; + for (it = m_pChildren->begin(); it != m_pChildren->end(); ++it) + { + objectGroup = (CCTMXObjectGroup*)(*it); + if (objectGroup && objectGroup->getGroupName() == sGroupName) + { + return objectGroup; + } + } + } + + // objectGroup not found + return NULL; + } + + // XXX deprecated + CCTMXObjectGroup * CCTMXTiledMap::groupNamed(const char *groupName) + { + return objectGroupNamed(groupName); + } + const char * CCTMXTiledMap::propertyNamed(const char *propertyName) + { + return valueForKey(propertyName, m_pProperties); + } + StringToStringDictionary * CCTMXTiledMap::propertiesForGID(int GID) + { + std::map::iterator it; + it = m_pTileProperties->find(GID); + return it!=m_pTileProperties->end() ? it->second : NULL; + } + + +}// namespace cocos2d + diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp index e0bf76a7a9..cc342d3775 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp @@ -25,6 +25,7 @@ THE SOFTWARE. #include #include #include "CCTMXXMLParser.h" +#include "CCTMXTiledMap.h" #include "ccMacros.h" #include "CCXFileUtils.h" #include "CGPointExtension.h" @@ -164,19 +165,6 @@ namespace cocos2d { return true; } - /** Possible oritentations of the TMX map */ - enum - { - /** Orthogonal orientation */ - CCTMXOrientationOrtho, - - /** Hexagonal orientation */ - CCTMXOrientationHex, - - /** Isometric orientation */ - CCTMXOrientationIso, - };/// @todo to be deleted - // the XML parser calls here with all the elements void tmx_startElement(void *ctx, const xmlChar *name, const xmlChar **atts)