zoukankan      html  css  js  c++  java
  • Cocos2d-x源代码解析(1)——地图模块(1)

    cocos通过加载tiled 生成的tmx文件来生成游戏地图。本文主要分析cocos加载地图模块的源代码。

     


    如图所看到的,地图加载模块由以上几个类组成。

    对外的入口是类CCTMXTiledMap,在使用该类时。程序猿不须要知道其底层的其它类便可解析tmx文件生成地图。

    那么。我们首先分析类CCTMXTiledMap是怎样调用其它类进行解析,该类的声明例如以下:

    class CC_DLL CCTMXTiledMap :public CCNode
    {
        /** the map's size property measured intiles */
        CC_SYNTHESIZE_PASS_BY_REF(CCSize,m_tMapSize, MapSize);
        /** the tiles's size property measured inpixels */
        CC_SYNTHESIZE_PASS_BY_REF(CCSize,m_tTileSize, TileSize);
        /** map orientation */
        CC_SYNTHESIZE(int, m_nMapOrientation,MapOrientation);
        /** object groups */
        CC_PROPERTY(CCArray*, m_pObjectGroups,ObjectGroups);
        /** properties */
        CC_PROPERTY(CCDictionary*, m_pProperties,Properties);
    public:
        /**
         * @js ctor
         */
        CCTMXTiledMap();
        /**
         * @js NA
         * @lua NA
         */
        virtual ~CCTMXTiledMap();
     
        /** creates a TMX Tiled Map with a TMXfile.*/
        static CCTMXTiledMap* create(const char*tmxFile);
     
        /** initializes a TMX Tiled Map with a TMXformatted XML string and a path to TMX resources */
        static CCTMXTiledMap* createWithXML(constchar* tmxString, const char* resourcePath);
     
        /** initializes a TMX Tiled Map with a TMXfile */
        bool initWithTMXFile(const char *tmxFile);
     
        /** initializes a TMX Tiled Map with a TMXformatted XML string and a path to TMX resources */
        bool initWithXML(const char* tmxString,const char* resourcePath);
     
        /** return the TMXLayer for the specificlayer
         * @js getLayer
         */
        CCTMXLayer* layerNamed(const char*layerName);
     
        /** return the TMXObjectGroup for thespecific group
         * @js getObjectGroup
         */
        CCTMXObjectGroup* objectGroupNamed(constchar *groupName);
     
        /** return the value for the specificproperty name
         * @js getProperty
         */
        CCString *propertyNamed(const char*propertyName);
     
        /** return properties dictionary for tileGID */
        CCDictionary* propertiesForGID(int GID);
     
    private:
       CCTMXLayer *parseLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo);
        CCTMXTilesetInfo *tilesetForLayer(CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo);
        void buildWithMapInfo(CCTMXMapInfo*mapInfo);
    protected:
        //! tile properties
        CCDictionary* m_pTileProperties;
     
    };


    通过查看函数实现,我们发现函数

    /** creates a TMX Tiled Map with a TMX file.*/
        static CCTMXTiledMap* create(const char*tmxFile);


    通过调用函数

    /** initializes a TMX Tiled Mapwith a TMX file */
        bool initWithTMXFile(const char *tmxFile);


    来实现文件的解析。并创建一个CCTMXTiledMap对象返回给使用者。

    boolCCTMXTiledMap::initWithTMXFile(const char *tmxFile)
    {
        CCAssert(tmxFile != NULL &&strlen(tmxFile)>0, "TMXTiledMap: tmx file should not bi NULL");
       
        setContentSize(CCSizeZero);
     
        CCTMXMapInfo *mapInfo =CCTMXMapInfo::formatWithTMXFile(tmxFile);
     
        if (! mapInfo)
        {
            return false;
        }
        CCAssert(mapInfo->getTilesets()->count() != 0, "TMXTiledMap: Map not found.Please check the filename.");
        buildWithMapInfo(mapInfo);
     
        return true;
    }


    通过看源代码。我们发现有2个重要的函数 CCTMXMapInfo::formatWithTMXFile(tmxFile)和buildWithMapInfo(mapInfo),看名字应该能知道formatWithTMXFile是解析XML文件将其结构化。buildWithMapInfo是将结构化的数据变成CCNode从而显示在游戏界面上。

     

    接下来,我们查看CCTMXMapInfo是怎样组织数据以及怎样解析XML文件的,首先我们还是查看CCTMXMapInfo的声明

     

    class CC_DLL CCTMXMapInfo :public CCObject, public CCSAXDelegator
    {   
    public:   
        /// map orientation
        CC_SYNTHESIZE(int,    m_nOrientation, Orientation);
        /// map width & height
        CC_SYNTHESIZE_PASS_BY_REF(CCSize,m_tMapSize, MapSize);
        /// tiles width & height
        CC_SYNTHESIZE_PASS_BY_REF(CCSize,m_tTileSize, TileSize);
        /// Layers
        CC_PROPERTY(CCArray*, m_pLayers, Layers);
        /// tilesets
        CC_PROPERTY(CCArray*, m_pTilesets,Tilesets);
        /// ObjectGroups
        CC_PROPERTY(CCArray*, m_pObjectGroups,ObjectGroups);
        /// parent element
        CC_SYNTHESIZE(int, m_nParentElement,ParentElement);
        /// parent GID
        CC_SYNTHESIZE(unsigned int, m_uParentGID,ParentGID);
        /// layer attribs
        CC_SYNTHESIZE(int, m_nLayerAttribs,LayerAttribs);
        /// is storing characters?
        CC_SYNTHESIZE(bool, m_bStoringCharacters,StoringCharacters);
        /// properties
        CC_PROPERTY(CCDictionary*, m_pProperties,Properties);
    public:
        /**
         * @js ctor
         * @lua NA
         */
        CCTMXMapInfo();
        /**
         * @js NA
         * @lua NA
         */
        virtual ~CCTMXMapInfo();
        /** creates a TMX Format with a tmx file */
        static CCTMXMapInfo *formatWithTMXFile(const char *tmxFile);
        /** creates a TMX Format with an XML stringand a TMX resource path */
        static CCTMXMapInfo * formatWithXML(constchar* tmxString, const char* resourcePath);
        /** initializes a TMX format with a  tmx file
         * @lua NA
         */
        bool initWithTMXFile(const char *tmxFile);
        /** initializes a TMX format with an XMLstring and a TMX resource path
         * @lua NA
         */
        bool initWithXML(const char* tmxString,const char* resourcePath);
        /** initializes parsing of an XML file,either a tmx (Map) file or tsx (Tileset) file */
        bool parseXMLFile(const char *xmlFilename);
        /* initializes parsing of an XML string,either a tmx (Map) string or tsx (Tileset) string */
        bool parseXMLString(const char *xmlString);
     
        CCDictionary* getTileProperties();
        void setTileProperties(CCDictionary*tileProperties);
     
        /** implement pure virtual methods ofCCSAXDelegator
         * @js NA
         */
        void startElement(void *ctx, const char*name, const char **atts);
        /**
         * @js NA
         */
        void endElement(void *ctx, const char*name);
        /**
         * @js NA
         */
        void textHandler(void *ctx, const char *ch,int len);
       
        inline const char* getCurrentString(){return m_sCurrentString.c_str(); }
        inline void setCurrentString(const char*currentString){ m_sCurrentString = currentString; }
        inline const char* getTMXFileName(){ returnm_sTMXFileName.c_str(); }
        inline void setTMXFileName(const char*fileName){ m_sTMXFileName = fileName; }
    private:
        void internalInit(const char* tmxFileName,const char* resourcePath);
    protected:
        //! tmx filename
        std::string m_sTMXFileName;
        // tmx resource path
        std::string m_sResources;
        //! current string
        std::string m_sCurrentString;
        //! tile properties
        CCDictionary* m_pTileProperties;
        unsigned int m_uCurrentFirstGID;
    };

    通过查看声明 我们发现CCTMXMapInfo主要包含下面几个数据:

    1. TMXLayerInfo的数组,用来存放地图信息
    2. TMXTilesetInfo的数组,用来存放块信息
    3. ObjectGroups的数组

    另外。CCTMXMapInfo中有几个重要的函数:

     bool initWithXML(const char* tmxString, constchar* resourcePath);
        /** initializes parsing of an XML file,either a tmx (Map) file or tsx (Tileset) file */
        bool parseXMLFile(const char *xmlFilename);
        /* initializes parsing of an XML string, eithera tmx (Map) string or tsx (Tileset) string */
        bool parseXMLString(const char *xmlString);
    


     

    这3个函数是libxml2中所须要解析xml的代理函数,分别表示标签的開始,标签的结束,标签的内容

     

    解析xml的标签就在这几个函数中。

     

  • 相关阅读:
    Spring MVC 下index.jsp访问
    Spring MVC的UrlBasedViewResolver和InternalResourceViewResolver
    js中encode、decode的应用说明
    Spring3.1新特性介绍
    Spring MVC定义拦截器
    Spring 使用注解方式进行事务管理
    GET,POST,PUT,DELETE的区别
    SpringMVC注解@RequestParam全面解析
    java实现DES算法
    程序员要考虑的事
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7298659.html
Copyright © 2011-2022 走看看