#ifndef _CCB_CCBREADER_H_ #define _CCB_CCBREADER_H_ #include #include #include "2d/CCNode.h" #include "base/CCData.h" #include "base/CCMap.h" #include "CCBSequence.h" #include "extensions/GUI/CCControlExtension/CCControl.h" #define CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(T, METHOD) static T * METHOD() { \ T * ptr = new T(); \ if(ptr != NULL) { \ ptr->autorelease(); \ return ptr; \ } \ CC_SAFE_DELETE(ptr); \ return NULL; \ } #define CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(T, METHOD) static T * METHOD() { \ T * ptr = new T(); \ if(ptr != NULL && ptr->init()) { \ ptr->autorelease(); \ return ptr; \ } \ CC_SAFE_DELETE(ptr); \ return NULL; \ } #define CCB_VERSION 5 namespace cocosbuilder { /** * @addtogroup cocosbuilder * @{ */ class CCBReader; class CCBFile : public cocos2d::Node { private: cocos2d::Node *_CCBFileNode; CCBReader *_CCBReader; public: CCBFile(); ~CCBFile(); static CCBFile* create(); cocos2d::Node* getCCBFileNode(); void setCCBFileNode(Node *pNode); // retain CCBReader* getCCBReader(); void setCCBReader(CCBReader *pReader); // retain }; /* Forward declaration. */ class NodeLoader; class NodeLoaderLibrary; class NodeLoaderListener; class CCBMemberVariableAssigner; class CCBSelectorResolver; class CCBAnimationManager; class CCBKeyframe; /** * @brief Parse CCBI file which is generated by CocosBuilder */ class CCBReader : public cocos2d::Ref { public: enum class PropertyType { POSITION = 0, SIZE, POINT, POINT_LOCK, SCALE_LOCK, DEGREES, INTEGER, FLOAT, FLOAT_VAR, CHECK, SPRITEFRAME, TEXTURE, BYTE, COLOR3, COLOR4F_VAR, FLIP, BLEND_MODE, FNT_FILE, TEXT, FONT_TTF, INTEGER_LABELED, BLOCK, ANIMATION, CCB_FILE, STRING, BLOCK_CONTROL, FLOAT_SCALE, FLOAT_XY }; enum class FloatType { _0 = 0, _1, MINUS1, _05, INTEGER, FULL }; enum class PlatformType { ALL = 0, IOS, MAC }; enum class TargetType { NONE = 0, DOCUMENT_ROOT = 1, OWNER = 2, }; enum class PositionType { RELATIVE_BOTTOM_LEFT, RELATIVE_TOP_LEFT, RELATIVE_TOP_RIGHT, RELATIVE_BOTTOM_RIGHT, PERCENT, MULTIPLY_RESOLUTION, }; #if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 #ifdef ABSOLUTE #undef ABSOLUTE #endif #endif enum class SizeType { ABSOLUTE, PERCENT, RELATIVE_CONTAINER, HORIZONTAL_PERCENT, VERTICAL_PERCENT, MULTIPLY_RESOLUTION, }; enum class ScaleType { ABSOLUTE, MULTIPLY_RESOLUTION }; /** * @js NA * @lua NA */ CCBReader(NodeLoaderLibrary *pNodeLoaderLibrary, CCBMemberVariableAssigner *pCCBMemberVariableAssigner = NULL, CCBSelectorResolver *pCCBSelectorResolver = NULL, NodeLoaderListener *pNodeLoaderListener = NULL); /** * @js NA * @lua NA */ CCBReader(CCBReader *ccbReader); /** * @js NA * @lua NA */ virtual ~CCBReader(); /** * @js NA * @lua NA */ CCBReader(); void setCCBRootPath(const char* ccbRootPath); const std::string& getCCBRootPath() const; cocos2d::Node* readNodeGraphFromFile(const char *pCCBFileName); cocos2d::Node* readNodeGraphFromFile(const char *pCCBFileName, cocos2d::Ref *pOwner); cocos2d::Node* readNodeGraphFromFile(const char *pCCBFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize); /** * @js NA * @lua NA */ cocos2d::Node* readNodeGraphFromData(std::shared_ptr data, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize); /** @lua NA */ cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pCCBFileName); /** @lua NA */ cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pCCBFileName, cocos2d::Ref *pOwner); /** @lua NA */ cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pCCBFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize); /** * @js NA * @lua NA */ CCBMemberVariableAssigner* getCCBMemberVariableAssigner(); /** * @js NA * @lua NA */ CCBSelectorResolver* getCCBSelectorResolver(); /** * @js getActionManager * @lua getActionManager */ CCBAnimationManager* getAnimationManager(); /** * @js setActionManager * @lua setActionManager */ void setAnimationManager(CCBAnimationManager *pAnimationManager); /** Used in NodeLoader::parseProperties() * @js NA * @lua NA */ std::set* getAnimatedProperties(); /** * @js NA * @lua NA */ std::set& getLoadedSpriteSheet(); /** * @js NA * @lua NA */ cocos2d::Ref* getOwner(); /* Utility methods. * @js NA * @lua NA */ static std::string lastPathComponent(const char* pString); /** * @js NA * @lua NA */ static std::string deletePathExtension(const char* pString); /** * @js NA * @lua NA */ static std::string toLowerCase(const char* pString); /** * @js NA * @lua NA */ static bool endsWith(const char* pString, const char* pEnding); /* Parse methods. * @js NA * @lua NA */ int readInt(bool pSigned); /** * @js NA * @lua NA */ unsigned char readByte(); /** * @js NA * @lua NA */ bool readBool(); std::string readUTF8(); /** * @js NA * @lua NA */ float readFloat(); /** * @js NA * @lua NA */ std::string readCachedString(); /** * @js NA * @lua NA */ bool isJSControlled(); bool readCallbackKeyframesForSeq(CCBSequence* seq); bool readSoundKeyframesForSeq(CCBSequence* seq); cocos2d::ValueVector getOwnerCallbackNames(); cocos2d::Vector& getOwnerCallbackNodes(); cocos2d::ValueVector& getOwnerCallbackControlEvents(); cocos2d::ValueVector getOwnerOutletNames(); cocos2d::Vector& getOwnerOutletNodes(); cocos2d::Vector& getNodesWithAnimationManagers(); cocos2d::Vector& getAnimationManagersForNodes(); typedef cocos2d::Map CCBAnimationManagerMap; typedef std::shared_ptr CCBAnimationManagerMapPtr; /* Jennal added */ std::string getDocumentControllerName(); void addSubCCBFile(CCBReader*); cocos2d::Vector& getSubCCBFiles(); /** * @js NA * @lua NA */ CCBAnimationManagerMapPtr getAnimationManagers(); /** * @js NA * @lua NA */ void setAnimationManagers(CCBAnimationManagerMapPtr x); /** * @js NA * @lua NA */ void addOwnerCallbackName(const std::string& name); /** * @js NA * @lua NA */ void addOwnerCallbackNode(cocos2d::Node *node); void addOwnerCallbackControlEvents(cocos2d::extension::Control::EventType type); /** * @js NA * @lua NA */ void addDocumentCallbackName(const std::string& name); /** * @js NA * @lua NA */ void addDocumentCallbackNode(cocos2d::Node *node); void addDocumentCallbackControlEvents(cocos2d::extension::Control::EventType eventType); /** * @js NA * @lua NA */ static float getResolutionScale(); static void setResolutionScale(float scale); /** * @js NA * @lua NA */ cocos2d::Node* readFileWithCleanUp(bool bCleanUp, CCBAnimationManagerMapPtr am); void addOwnerOutletName(std::string name); void addOwnerOutletNode(cocos2d::Node *node); private: void cleanUpNodeGraph(cocos2d::Node *pNode); bool readSequences(); CCBKeyframe* readKeyframe(PropertyType type); bool readHeader(); bool readStringCache(); //void readStringCacheEntry(); cocos2d::Node* readNodeGraph(); cocos2d::Node* readNodeGraph(cocos2d::Node * pParent); bool getBit(); void alignBits(); bool init(); friend class NodeLoader; private: std::shared_ptr _data; unsigned char *_bytes; int _currentByte; int _currentBit; std::vector _stringCache; std::set _loadedSpriteSheets; cocos2d::Ref *_owner; CCBAnimationManager* _animationManager; //retain CCBAnimationManagerMapPtr _animationManagers; std::set *_animatedProps; NodeLoaderLibrary *_nodeLoaderLibrary; NodeLoaderListener *_nodeLoaderListener; CCBMemberVariableAssigner *_CCBMemberVariableAssigner; CCBSelectorResolver *_CCBSelectorResolver; std::vector _ownerOutletNames; cocos2d::Vector _ownerOutletNodes; cocos2d::Vector _nodesWithAnimationManagers; cocos2d::Vector _animationManagersForNodes; std::vector _ownerCallbackNames; cocos2d::Vector _ownerCallbackNodes; cocos2d::ValueVector _ownerOwnerCallbackControlEvents; /* Jennal added */ cocos2d::Vector _subCCBFiles; std::string _CCBRootPath; bool _jsControlled; }; // end of effects group /// @} } #endif