mirror of https://github.com/axmolengine/axmol.git
fixed #1743: Adding an additional transform for CCNode.
This commit is contained in:
parent
46ee771e1c
commit
b54b924923
|
@ -86,7 +86,8 @@ CCNode::CCNode(void)
|
||||||
, m_uOrderOfArrival(0)
|
, m_uOrderOfArrival(0)
|
||||||
, m_eGLServerState(ccGLServerState(0))
|
, m_eGLServerState(ccGLServerState(0))
|
||||||
, m_bReorderChildDirty(false)
|
, m_bReorderChildDirty(false)
|
||||||
, m_sOtherTransform(CCAffineTransformMakeIdentity())
|
, m_sAdditionalTransform(CCAffineTransformMakeIdentity())
|
||||||
|
, m_bAdditionalTransformDirty(false)
|
||||||
{
|
{
|
||||||
// set default scheduler and actionManager
|
// set default scheduler and actionManager
|
||||||
CCDirector *director = CCDirector::sharedDirector();
|
CCDirector *director = CCDirector::sharedDirector();
|
||||||
|
@ -1159,17 +1160,26 @@ CCAffineTransform CCNode::nodeToParentTransform(void)
|
||||||
m_sTransform = CCAffineTransformTranslate(m_sTransform, -m_obAnchorPointInPoints.x, -m_obAnchorPointInPoints.y);
|
m_sTransform = CCAffineTransformTranslate(m_sTransform, -m_obAnchorPointInPoints.x, -m_obAnchorPointInPoints.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_sTransform = CCAffineTransformConcat(m_sTransform, m_sOtherTransform);
|
|
||||||
|
if (m_bAdditionalTransformDirty)
|
||||||
|
{
|
||||||
|
m_sTransform = CCAffineTransformConcat(m_sTransform, m_sAdditionalTransform);
|
||||||
|
m_bAdditionalTransformDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
m_bTransformDirty = false;
|
m_bTransformDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_sTransform;
|
return m_sTransform;
|
||||||
}
|
}
|
||||||
void CCNode::translateFormOtherNode(CCAffineTransform &transform)
|
|
||||||
|
void CCNode::setAdditionalTransform(const CCAffineTransform& additionalTransform)
|
||||||
{
|
{
|
||||||
m_sOtherTransform = CCAffineTransformMake(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);
|
m_sAdditionalTransform = additionalTransform;
|
||||||
m_bTransformDirty = true;
|
m_bTransformDirty = true;
|
||||||
|
m_bAdditionalTransformDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CCAffineTransform CCNode::parentToNodeTransform(void)
|
CCAffineTransform CCNode::parentToNodeTransform(void)
|
||||||
{
|
{
|
||||||
if ( m_bInverseDirty ) {
|
if ( m_bInverseDirty ) {
|
||||||
|
|
|
@ -1257,9 +1257,54 @@ public:
|
||||||
CCPoint convertTouchToNodeSpaceAR(CCTouch * touch);
|
CCPoint convertTouchToNodeSpaceAR(CCTouch * touch);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Additional a transformation matrix, Used in is not parent-child relationship but we still need to maintain transformation parent-child
|
* Sets the additional transform.
|
||||||
|
*
|
||||||
|
* @note The additional transform will be concatenated at the end of nodeToParentTransform.
|
||||||
|
* It could be used to simulate `parent-child` relationship between two nodes (e.g. one is in BatchNode, another isn't).
|
||||||
|
* @code
|
||||||
|
// create a batchNode
|
||||||
|
CCSpriteBatchNode* batch= CCSpriteBatchNode::create("Icon-114.png");
|
||||||
|
this->addChild(batch);
|
||||||
|
|
||||||
|
// create two sprites, spriteA will be added to batchNode, they are using different textures.
|
||||||
|
CCSprite* spriteA = CCSprite::createWithTexture(batch->getTexture());
|
||||||
|
CCSprite* spriteB = CCSprite::create("Icon-72.png");
|
||||||
|
|
||||||
|
batch->addChild(spriteA);
|
||||||
|
|
||||||
|
// We can't make spriteB as spriteA's child since they use different textures. So just add it to layer.
|
||||||
|
// But we want to simulate `parent-child` relationship for these two node.
|
||||||
|
this->addChild(spriteB);
|
||||||
|
|
||||||
|
//position
|
||||||
|
spriteA->setPosition(ccp(200, 200));
|
||||||
|
|
||||||
|
// Gets the spriteA's transform.
|
||||||
|
CCAffineTransform t = spriteA->nodeToParentTransform();
|
||||||
|
|
||||||
|
// Sets the additional transform to spriteB, spriteB's postion will based on its pseudo parent i.e. spriteA.
|
||||||
|
spriteB->setAdditionalTransform(t);
|
||||||
|
|
||||||
|
//scale
|
||||||
|
spriteA->setScale(2);
|
||||||
|
|
||||||
|
// Gets the spriteA's transform.
|
||||||
|
t = spriteA->nodeToParentTransform();
|
||||||
|
|
||||||
|
// Sets the additional transform to spriteB, spriteB's scale will based on its pseudo parent i.e. spriteA.
|
||||||
|
spriteB->setAdditionalTransform(t);
|
||||||
|
|
||||||
|
//rotation
|
||||||
|
spriteA->setRotation(20);
|
||||||
|
|
||||||
|
// Gets the spriteA's transform.
|
||||||
|
t = spriteA->nodeToParentTransform();
|
||||||
|
|
||||||
|
// Sets the additional transform to spriteB, spriteB's rotation will based on its pseudo parent i.e. spriteA.
|
||||||
|
spriteB->setAdditionalTransform(t);
|
||||||
|
* @endcode
|
||||||
*/
|
*/
|
||||||
void translateFormOtherNode(CCAffineTransform &transform);
|
void setAdditionalTransform(const CCAffineTransform& additionalTransform);
|
||||||
/// @} end of Coordinate Converters
|
/// @} end of Coordinate Converters
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1294,7 +1339,8 @@ protected:
|
||||||
|
|
||||||
CCSize m_obContentSize; ///< untransformed size of the node
|
CCSize m_obContentSize; ///< untransformed size of the node
|
||||||
|
|
||||||
CCAffineTransform m_sOtherTransform;///< transform
|
|
||||||
|
CCAffineTransform m_sAdditionalTransform; ///< transform
|
||||||
CCAffineTransform m_sTransform; ///< transform
|
CCAffineTransform m_sTransform; ///< transform
|
||||||
CCAffineTransform m_sInverse; ///< transform
|
CCAffineTransform m_sInverse; ///< transform
|
||||||
|
|
||||||
|
@ -1326,7 +1372,7 @@ protected:
|
||||||
|
|
||||||
bool m_bTransformDirty; ///< transform dirty flag
|
bool m_bTransformDirty; ///< transform dirty flag
|
||||||
bool m_bInverseDirty; ///< transform dirty flag
|
bool m_bInverseDirty; ///< transform dirty flag
|
||||||
|
bool m_bAdditionalTransformDirty; ///< The flag to check whether the additional transform is dirty
|
||||||
bool m_bVisible; ///< is this node visible
|
bool m_bVisible; ///< is this node visible
|
||||||
|
|
||||||
bool m_bIgnoreAnchorPointForPosition; ///< true if the Anchor Point will be (0,0) when you position the CCNode, false otherwise.
|
bool m_bIgnoreAnchorPointForPosition; ///< true if the Anchor Point will be (0,0) when you position the CCNode, false otherwise.
|
||||||
|
|
Loading…
Reference in New Issue