mirror of https://github.com/axmolengine/axmol.git
Change Tween Type to Frame Index
This commit is contained in:
parent
6fc0eaf5b1
commit
4a8cde4dad
|
@ -54,7 +54,6 @@ CCTween::CCTween()
|
|||
, m_pFrom(NULL)
|
||||
, m_pTo(NULL)
|
||||
, m_pBetween(NULL)
|
||||
, m_pCurrentKeyFrame(NULL)
|
||||
, m_pBone(NULL)
|
||||
|
||||
, m_eFrameTweenEasing(Linear)
|
||||
|
@ -101,11 +100,10 @@ void CCTween::play(CCMovementBoneData *movementBoneData, int durationTo, int dur
|
|||
|
||||
m_eLoopType = (AnimationType)loop;
|
||||
|
||||
m_pCurrentKeyFrame = NULL;
|
||||
|
||||
m_iTotalDuration = 0;
|
||||
m_BetweenDuration = 0;
|
||||
m_iToIndex = 0;
|
||||
m_iFromIndex = m_iToIndex = 0;
|
||||
|
||||
|
||||
bool difMovement = movementBoneData != m_pMovementBoneData;
|
||||
|
||||
|
@ -126,7 +124,6 @@ void CCTween::play(CCMovementBoneData *movementBoneData, int durationTo, int dur
|
|||
}
|
||||
m_eFrameTweenEasing = Linear;
|
||||
m_iRawDuration = m_pMovementBoneData->duration;
|
||||
m_iFromIndex = m_iToIndex = 0;
|
||||
}
|
||||
else if (m_pMovementBoneData->frameList.count() > 1)
|
||||
{
|
||||
|
@ -217,8 +214,6 @@ void CCTween::updateHandler()
|
|||
//
|
||||
m_fCurrentFrame = (1 - m_pMovementBoneData->delay) * (float)m_iNextFrameIndex;
|
||||
m_fCurrentPercent = m_fCurrentFrame / m_iNextFrameIndex;
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -266,10 +261,6 @@ void CCTween::updateHandler()
|
|||
{
|
||||
tweenNodeTo(percent);
|
||||
}
|
||||
else if(m_pCurrentKeyFrame)
|
||||
{
|
||||
tweenNodeTo(0);
|
||||
}
|
||||
}
|
||||
|
||||
void CCTween::setBetween(CCFrameData *from, CCFrameData *to)
|
||||
|
@ -328,7 +319,7 @@ void CCTween::arriveKeyFrame(CCFrameData *keyFrameData)
|
|||
}
|
||||
// if(keyFrameData->m_strSound.length() != 0)
|
||||
// {
|
||||
// //soundManager.dispatchEventWith(Event.SOUND_FRAME, m_pCurrentKeyFrame->sound);
|
||||
// //soundManager.dispatchEventWith(Event.SOUND_FRAME, keyFrameData->sound);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
@ -366,26 +357,33 @@ void CCTween::tweenColorTo(float percent, CCFrameData *node, bool dirty)
|
|||
|
||||
float CCTween::updateFrameData(float currentPrecent, bool activeFrame)
|
||||
{
|
||||
if (currentPrecent > 1)
|
||||
{
|
||||
currentPrecent = fmodf(currentPrecent,1);
|
||||
}
|
||||
|
||||
float playedTime = (float)m_iRawDuration * currentPrecent;
|
||||
|
||||
|
||||
CCFrameData *from;
|
||||
CCFrameData *to;
|
||||
bool isListEnd;
|
||||
|
||||
//! If play to current frame's front or back, then find current frame again
|
||||
if (playedTime >= m_iTotalDuration || playedTime < m_iTotalDuration - m_BetweenDuration)
|
||||
if (playedTime < m_iTotalDuration || playedTime >= m_iTotalDuration + m_BetweenDuration)
|
||||
{
|
||||
/*
|
||||
* Get frame length, if m_iToIndex >= _length, then set m_iToIndex to 0, start anew.
|
||||
* m_iToIndex is next index will play
|
||||
*/
|
||||
int length = m_pMovementBoneData->frameList.count();
|
||||
|
||||
CCFrameData *from = NULL;
|
||||
CCFrameData *to = NULL;
|
||||
bool isListEnd;
|
||||
CCFrameData **frames = (CCFrameData**)m_pMovementBoneData->frameList.data->arr;
|
||||
|
||||
do
|
||||
{
|
||||
m_BetweenDuration = m_pMovementBoneData->getFrameData(m_iToIndex)->duration;
|
||||
m_iTotalDuration += m_BetweenDuration;
|
||||
from = frames[m_iFromIndex];
|
||||
to = frames[m_iToIndex];
|
||||
m_iTotalDuration = from->frameID;
|
||||
m_iFromIndex = m_iToIndex;
|
||||
|
||||
if (++m_iToIndex >= length)
|
||||
|
@ -393,27 +391,29 @@ float CCTween::updateFrameData(float currentPrecent, bool activeFrame)
|
|||
m_iToIndex = 0;
|
||||
}
|
||||
}
|
||||
while (playedTime >= m_iTotalDuration);
|
||||
while (playedTime < from->frameID || playedTime>=to->frameID);
|
||||
|
||||
m_BetweenDuration = to->frameID - from->frameID;
|
||||
|
||||
|
||||
isListEnd = m_eLoopType == ANIMATION_MAX && m_iToIndex == 0;
|
||||
|
||||
if(isListEnd)
|
||||
{
|
||||
to = from = m_pMovementBoneData->getFrameData(m_iFromIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
from = m_pMovementBoneData->getFrameData(m_iFromIndex);
|
||||
to = m_pMovementBoneData->getFrameData(m_iToIndex);
|
||||
to = from = frames[m_iFromIndex];
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// from = frames[m_iFromIndex];
|
||||
// to = frames[m_iToIndex];
|
||||
// }
|
||||
|
||||
m_eFrameTweenEasing = from->tweenEasing;
|
||||
|
||||
setBetween(from, to);
|
||||
|
||||
}
|
||||
currentPrecent = 1 - (m_iTotalDuration - playedTime) / (float)m_BetweenDuration;
|
||||
currentPrecent = (playedTime - m_iTotalDuration) / (float)m_BetweenDuration;
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -124,7 +124,6 @@ protected:
|
|||
CCFrameData *m_pTo; //! To frame data, used for calculate between value
|
||||
CCFrameData *m_pBetween; //! Between frame data, used for calculate current CCFrameData(m_pNode) value
|
||||
|
||||
CCFrameData *m_pCurrentKeyFrame; //! A weak reference to the current CCFrameData. The data is in the data pool
|
||||
|
||||
CCBone *m_pBone; //! A weak reference to the CCBone
|
||||
|
||||
|
|
|
@ -269,7 +269,8 @@ CCBoneData *CCArmatureData::getBoneData(const char *boneName)
|
|||
}
|
||||
|
||||
CCFrameData::CCFrameData(void)
|
||||
: duration(1)
|
||||
: frameID(0)
|
||||
, duration(1)
|
||||
, tweenEasing(Linear)
|
||||
, displayIndex(0)
|
||||
|
||||
|
@ -288,6 +289,7 @@ void CCFrameData::copy(CCFrameData *frameData)
|
|||
{
|
||||
CCBaseData::copy(frameData);
|
||||
|
||||
frameID = frameData->frameID;
|
||||
duration = frameData->duration;
|
||||
displayIndex = frameData->displayIndex;
|
||||
tweenEasing = frameData->tweenEasing;
|
||||
|
@ -313,7 +315,6 @@ bool CCMovementBoneData::init()
|
|||
void CCMovementBoneData::addFrameData(CCFrameData *frameData)
|
||||
{
|
||||
frameList.addObject(frameData);
|
||||
duration += frameData->duration;
|
||||
}
|
||||
|
||||
CCFrameData *CCMovementBoneData::getFrameData(int index)
|
||||
|
|
|
@ -285,6 +285,7 @@ public:
|
|||
|
||||
virtual void copy(CCFrameData *frameData);
|
||||
public:
|
||||
int frameID;
|
||||
int duration; //! The frame will last m_iDuration frames
|
||||
CCTweenType tweenEasing; //! Every frame's tween easing effect
|
||||
|
||||
|
|
|
@ -562,12 +562,21 @@ CCMovementBoneData *CCDataReaderHelper::decodeMovementBone(tinyxml2::XMLElement
|
|||
CCFrameData *frameData = decodeFrame( frameXML, parentFrameXML, boneData);
|
||||
movBoneData->addFrameData(frameData);
|
||||
|
||||
frameData->frameID = totalDuration;
|
||||
totalDuration += frameData->duration;
|
||||
movBoneData->duration = totalDuration;
|
||||
|
||||
frameXML = frameXML->NextSiblingElement(FRAME);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
CCFrameData *frameData = CCFrameData::create();
|
||||
frameData->copy((CCFrameData*)movBoneData->frameList.lastObject());
|
||||
frameData->frameID = movBoneData->duration;
|
||||
movBoneData->addFrameData(frameData);
|
||||
|
||||
|
||||
return movBoneData;
|
||||
}
|
||||
|
||||
|
@ -1049,12 +1058,22 @@ CCMovementBoneData *CCDataReaderHelper::decodeMovementBone(cs::CSJsonDictionary
|
|||
{
|
||||
cs::CSJsonDictionary *dic = json.getSubItemFromArray(FRAME_DATA, i);
|
||||
CCFrameData *frameData = decodeFrame(*dic);
|
||||
movementBoneData->addFrameData(frameData);
|
||||
//movementBoneData->duration += frameData->duration;
|
||||
|
||||
movementBoneData->addFrameData(frameData);
|
||||
|
||||
frameData->frameID = movementBoneData->duration;
|
||||
movementBoneData->duration += frameData->duration;
|
||||
|
||||
delete dic;
|
||||
}
|
||||
|
||||
//
|
||||
CCFrameData *frameData = CCFrameData::create();
|
||||
frameData->copy((CCFrameData*)movementBoneData->frameList.lastObject());
|
||||
movementBoneData->addFrameData(frameData);
|
||||
|
||||
frameData->frameID = movementBoneData->duration;
|
||||
|
||||
return movementBoneData;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue