/**************************************************************************** Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. 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 _CCB_CCBREADER_H_ #define _CCB_CCBREADER_H_ #include #include #include #include "2d/CCNode.h" #include "base/CCData.h" #include "base/CCMap.h" #include "editor-support/cocosbuilder/CCBSequence.h" #include "extensions/GUI/CCControlExtension/CCControl.h" #include "editor-support/cocosbuilder/CCBAnimationManager.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) #ifdef ABSOLUTE #undef ABSOLUTE #endif #endif #define CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(T, METHOD) static T * METHOD() { \ T * ptr = new (std::nothrow) 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 (std::nothrow) 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 CCBFile : public cocos2d::Node { private: cocos2d::Node *_CCBFileNode; public: CCBFile(); static CCBFile* create(); cocos2d::Node* getCCBFileNode(); void setCCBFileNode(Node *pNode); // 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 CC_DLL 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, }; 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; /** * @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; std::string _CCBRootPath; bool _jsControlled; }; // end of effects group /// @} } #endif