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.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __CCBONE_H__
|
|
|
|
#define __CCBONE_H__
|
|
|
|
|
|
|
|
#include "utils/CCArmatureDefine.h"
|
|
|
|
#include "datas/CCDatas.h"
|
|
|
|
#include "animation/CCTween.h"
|
|
|
|
#include "external_tool/CCTexture2DMutable.h"
|
|
|
|
#include "display/CCDecorativeDisplay.h"
|
|
|
|
#include "display/CCDisplayManager.h"
|
|
|
|
|
|
|
|
NS_CC_EXT_BEGIN
|
|
|
|
|
|
|
|
class CCArmature;
|
|
|
|
|
|
|
|
class CCBone : public CCNodeRGBA
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Allocates and initializes a bone.
|
|
|
|
* @return A initialized bone which is marked as "autorelease".
|
|
|
|
*/
|
|
|
|
static CCBone *create();
|
|
|
|
/**
|
|
|
|
* Allocates and initializes a bone.
|
2013-06-07 10:52:32 +08:00
|
|
|
*
|
|
|
|
* @param name If name is not null, then set name to the bone's name
|
2013-06-06 12:02:54 +08:00
|
|
|
* @return A initialized bone which is marked as "autorelease".
|
|
|
|
*/
|
2013-06-07 10:52:32 +08:00
|
|
|
static CCBone *create(const char *name);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
CCBone();
|
2013-06-07 10:52:32 +08:00
|
|
|
virtual ~CCBone(void);
|
|
|
|
|
|
|
|
/**
|
2013-06-06 12:02:54 +08:00
|
|
|
* Initializes an empty CCBone with nothing init.
|
|
|
|
*/
|
|
|
|
virtual bool init();
|
|
|
|
|
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Initializes a CCBone with the specified name
|
|
|
|
* @param name CCBone's name.
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-06-07 10:52:32 +08:00
|
|
|
virtual bool init(const char *name);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Add display and use _DisplayData init the display.
|
2013-06-06 12:02:54 +08:00
|
|
|
* If index already have a display, then replace it.
|
|
|
|
* If index is current display index, then also change display to _index
|
|
|
|
*
|
2013-06-07 10:52:32 +08:00
|
|
|
* @param displayData it include the display information, like DisplayType.
|
2013-06-06 16:22:58 +08:00
|
|
|
* If you want to create a sprite display, then create a CCSpriteDisplayData param
|
2013-06-06 12:02:54 +08:00
|
|
|
*
|
2013-06-07 10:52:32 +08:00
|
|
|
* @param _index the index of the display you want to replace or add to
|
2013-06-06 12:02:54 +08:00
|
|
|
* -1 : append display from back
|
|
|
|
*/
|
2013-06-06 16:22:58 +08:00
|
|
|
void addDisplay(CCDisplayData *displayData, int index);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
void changeDisplayByIndex(int index, bool force);
|
|
|
|
|
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Add a child to this bone, and it will let this child call setParent(CCBone *_parent) function to set self to it's parent
|
|
|
|
* @param _child the child you want to add
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-06-07 10:52:32 +08:00
|
|
|
void addChildBone(CCBone *_child);
|
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Set parent bone.
|
2013-06-06 12:02:54 +08:00
|
|
|
* If _parent is NUll, then also remove this bone from armature.
|
|
|
|
* It will not set the CCArmature, if you want to add the bone to a CCArmature, you should use CCArmature::addBone(CCBone *bone, const char* _parentName).
|
|
|
|
*
|
2013-06-07 10:52:32 +08:00
|
|
|
* @param parent the parent bone.
|
2013-06-06 12:02:54 +08:00
|
|
|
* NULL : remove this bone from armature
|
|
|
|
*/
|
|
|
|
void setParentBone(CCBone *parent);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Get parent bone
|
|
|
|
* @return parent bone
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
|
|
|
CCBone *getParentBone();
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Remove itself from its parent CCBone.
|
|
|
|
* @param recursion whether or not remove Child display
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
|
|
|
void removeFromParent(bool recursion);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Removes a child CCBone
|
|
|
|
* @param bone the bone you want to remove
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-06-07 10:52:32 +08:00
|
|
|
void removeChildBone(CCBone *bone, bool recursion);
|
|
|
|
|
|
|
|
void update(float delta);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
void updateDisplayedColor(const ccColor3B &parentColor);
|
|
|
|
void updateDisplayedOpacity(GLubyte parentOpacity);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
//! Update color to render display
|
|
|
|
void updateColor();
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
CCArray *getChildren();
|
|
|
|
CCTween *getTween();
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
virtual void setZOrder(int zOrder);
|
|
|
|
/*
|
|
|
|
* Whether or not the bone's transform property changed. if true, the bone will update the transform.
|
|
|
|
*/
|
|
|
|
virtual void setTransformDirty(bool dirty);
|
|
|
|
|
|
|
|
virtual bool isTransformDirty();
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
virtual CCAffineTransform nodeToArmatureTransform();
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
/*
|
2013-06-15 14:03:30 +08:00
|
|
|
* The origin state of the CCBone. Display's state is effected by _boneData, _node, _tweenData
|
2013-06-06 16:22:58 +08:00
|
|
|
* when call setData function, it will copy from the CCBoneData.
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_PROPERTY(CCBoneData *, _boneData, BoneData);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
//! A weak reference to the CCArmature
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_PROPERTY(CCArmature *, _armature, Armature);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
//! A weak reference to the child CCArmature
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_PROPERTY(CCArmature *, _childArmature, ChildArmature);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_SYNTHESIZE(CCDisplayManager *, _displayManager, DisplayManager)
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* When CCArmature play a animation, if there is not a CCMovementBoneData of this bone in this CCMovementData, this bone will hide.
|
|
|
|
* Set IgnoreMovementBoneData to true, then this bone will also show.
|
|
|
|
*/
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_SYNTHESIZE_PASS_BY_REF(bool, _ignoreMovementBoneData, IgnoreMovementBoneData)
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
protected:
|
2013-06-15 14:03:30 +08:00
|
|
|
CCTween *_tween; //! Calculate tween effect
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
//! Used for make tween effect between every frame
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_SYNTHESIZE_READONLY(CCFrameData *, _tweenData, TweenData);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-15 14:03:30 +08:00
|
|
|
CC_SYNTHESIZE_PASS_BY_REF(std::string, _name, Name);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
//! Lazy allocs
|
|
|
|
void childrenAlloc(void);
|
2013-06-15 14:03:30 +08:00
|
|
|
CCArray *_children;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-15 14:03:30 +08:00
|
|
|
CCBone *_parent; //! A weak reference to it's parent
|
|
|
|
bool _transformDirty; //! Whether or not transform dirty
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
//! self Transform, use this to change display's state
|
2013-06-15 14:03:30 +08:00
|
|
|
CCAffineTransform _worldTransform;
|
2013-06-06 12:02:54 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_CC_EXT_END
|
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
#endif /*__CCBONE_H__*/
|