2013-06-06 12:02:54 +08:00
/****************************************************************************
Copyright ( c ) 2013 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 .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
# ifndef __CCARMATURE_H__
# define __CCARMATURE_H__
# include "utils/CCArmatureDefine.h"
# include "CCBone.h"
# include "display/CCBatchNode.h"
2013-06-08 11:16:17 +08:00
# include "animation/CCArmatureAnimation.h"
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
class b2Body ;
struct cpBody ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
NS_CC_EXT_ARMATURE_BEGIN
class CCArmature : public NodeRGBA , public BlendProtocol
2013-06-06 12:02:54 +08:00
{
public :
2013-09-13 18:07:37 +08:00
2013-09-13 16:46:31 +08:00
/**
2013-09-13 18:07:37 +08:00
* Allocates and initializes an armature .
* @ return An initialized armature which is marked as " autorelease " .
*/
static CCArmature * create ( ) ;
2013-09-13 11:41:20 +08:00
/**
2013-09-13 18:07:37 +08:00
* Allocates an armature , and use the CCArmatureData named name in CCArmatureDataManager to initializes the armature .
*
* @ param name CCArmature will use the name to find the CCArmatureData to initializes it .
* @ return A initialized armature which is marked as " autorelease " .
*/
static CCArmature * create ( const char * name ) ;
static CCArmature * create ( const char * name , CCBone * parentBone ) ;
2013-06-06 12:02:54 +08:00
public :
2013-09-13 18:07:37 +08:00
CCArmature ( ) ;
~ CCArmature ( void ) ;
2013-06-06 12:02:54 +08:00
/**
* Init the empty armature
*/
virtual bool init ( ) ;
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
/**
2013-09-13 18:07:37 +08:00
* Init an armature with specified name
* @ param name CCArmature name
2013-06-06 12:02:54 +08:00
*/
virtual bool init ( const char * name ) ;
2013-09-13 18:07:37 +08:00
virtual bool init ( const char * name , CCBone * parentBone ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-13 18:07:37 +08:00
* Add a CCBone to this CCArmature ,
2013-06-06 12:02:54 +08:00
*
2013-09-13 18:07:37 +08:00
* @ param bone The CCBone you want to add to CCArmature
* @ param parentName The parent CCBone ' s name you want to add to . If it ' s NULL , then set CCArmature to its parent
2013-06-06 12:02:54 +08:00
*/
2013-09-13 18:07:37 +08:00
virtual void addBone ( CCBone * bone , const char * parentName ) ;
2013-06-06 12:02:54 +08:00
/**
* Get a bone with the specified name
*
* @ param name The bone ' s name you want to get
*/
2013-09-13 18:07:37 +08:00
virtual CCBone * getBone ( const char * name ) const ;
2013-06-06 12:02:54 +08:00
/**
* Change a bone ' s parent with the specified parent name .
*
* @ param bone The bone you want to change parent
2013-09-13 18:07:37 +08:00
* @ param parentName The new parent ' s name .
2013-06-06 12:02:54 +08:00
*/
2013-09-13 18:07:37 +08:00
virtual void changeBoneParent ( CCBone * bone , const char * parentName ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-13 18:07:37 +08:00
* Remove a bone with the specified name . If recursion it will also remove child CCBone recursionly .
2013-06-06 12:02:54 +08:00
*
* @ param bone The bone you want to remove
2013-09-13 18:07:37 +08:00
* @ param recursion Determine whether remove the bone ' s child recursion .
2013-06-06 12:02:54 +08:00
*/
2013-09-13 18:07:37 +08:00
virtual void removeBone ( CCBone * bone , bool recursion ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-13 18:07:37 +08:00
* Get CCArmature ' s bone dictionary
* @ return CCArmature ' s bone dictionary
2013-06-06 12:02:54 +08:00
*/
2013-09-13 18:07:37 +08:00
Dictionary * getBoneDic ( ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
/**
* This boundingBox will calculate all bones ' boundingBox every time
2013-06-06 12:02:54 +08:00
*/
2013-09-14 19:54:49 +08:00
virtual Rect getBoundingBox ( ) const ;
2013-09-13 18:07:37 +08:00
CCBone * getBoneAtPoint ( float x , float y ) ;
virtual void visit ( ) ;
virtual void update ( float dt ) ;
virtual void draw ( ) ;
2013-09-14 19:54:49 +08:00
virtual const AffineTransform & getNodeToParentTransform ( ) const ;
2013-06-06 12:02:54 +08:00
2013-09-13 11:41:20 +08:00
/**
2013-09-13 18:07:37 +08:00
* Set contentsize and Calculate anchor point .
2013-09-13 11:41:20 +08:00
*/
2013-09-13 18:07:37 +08:00
virtual void updateOffsetPoint ( ) ;
inline void setBlendFunc ( const BlendFunc & blendFunc )
{
m_sBlendFunc = blendFunc ;
}
inline const BlendFunc & getBlendFunc ( void ) const
{
return m_sBlendFunc ;
}
virtual void setAnimation ( CCArmatureAnimation * animation ) ;
virtual CCArmatureAnimation * getAnimation ( ) ;
2013-09-14 19:54:49 +08:00
virtual bool getArmatureTransformDirty ( ) ;
2013-09-13 18:07:37 +08:00
# if ENABLE_PHYSICS_BOX2D_DETECT
virtual b2Fixture * getShapeList ( ) ;
# elif ENABLE_PHYSICS_CHIPMUNK_DETECT
virtual cpShape * getShapeList ( ) ;
# endif
2013-06-06 12:02:54 +08:00
protected :
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
/*
2013-09-13 18:07:37 +08:00
* Used to create CCBone internal
2013-06-06 12:02:54 +08:00
*/
2013-09-13 18:07:37 +08:00
CCBone * createBone ( const char * boneName ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
//! Update blend function
void updateBlendType ( CCBlendType blendType ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CC_SYNTHESIZE ( CCArmatureData * , m_pArmatureData , ArmatureData ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CC_SYNTHESIZE ( CCBatchNode * , m_pBatchNode , BatchNode ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CC_SYNTHESIZE ( std : : string , m_strName , Name ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CC_SYNTHESIZE ( TextureAtlas * , m_pAtlas , TextureAtlas ) ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CC_SYNTHESIZE ( CCBone * , m_pParentBone , ParentBone ) ;
CC_SYNTHESIZE ( float , m_fVersion , Version ) ;
2013-06-06 12:02:54 +08:00
protected :
2013-09-14 19:54:49 +08:00
mutable bool m_bArmatureTransformDirty ;
2013-09-13 18:07:37 +08:00
Dictionary * m_pBoneDic ; //! The dictionary of the bones, include all bones in the armature, no matter it is the direct bone or the indirect bone. It is different from m_pChindren.
Array * m_pTopBoneList ;
static std : : map < int , CCArmature * > m_sArmatureIndexDic ; //! Use to save armature zorder info,
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
BlendFunc m_sBlendFunc ; //! It's required for CCTextureProtocol inheritance
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
Point m_pOffsetPoint ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
CCArmatureAnimation * m_pAnimation ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
# if ENABLE_PHYSICS_BOX2D_DETECT
CC_PROPERTY ( b2Body * , m_pBody , Body ) ;
# elif ENABLE_PHYSICS_CHIPMUNK_DETECT
CC_PROPERTY ( cpBody * , m_pBody , Body ) ;
# endif
2013-06-06 12:02:54 +08:00
} ;
2013-09-13 18:07:37 +08:00
NS_CC_EXT_ARMATURE_END
2013-06-06 12:02:54 +08:00
2013-06-07 10:52:32 +08:00
# endif /*__CCARMATURE_H__*/