2013-09-20 22:23:13 +08:00
|
|
|
/****************************************************************************
|
2014-01-07 11:47:11 +08:00
|
|
|
Copyright (c) 2013-2014 Chukong Technologies Inc.
|
2013-09-20 22:23:13 +08:00
|
|
|
|
|
|
|
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-10-16 16:48:39 +08:00
|
|
|
#include "cocostudio/CCActionNode.h"
|
|
|
|
#include "cocostudio/CCActionFrameEasing.h"
|
|
|
|
#include "cocostudio/DictionaryHelper.h"
|
|
|
|
#include "gui/UIWidget.h"
|
|
|
|
#include "gui/UIHelper.h"
|
2013-09-20 22:23:13 +08:00
|
|
|
|
2013-10-15 18:00:03 +08:00
|
|
|
using namespace cocos2d;
|
2014-02-24 18:56:45 +08:00
|
|
|
using namespace ui;
|
2013-10-15 18:00:03 +08:00
|
|
|
|
|
|
|
namespace cocostudio {
|
2013-09-20 22:23:13 +08:00
|
|
|
|
2013-11-08 14:34:24 +08:00
|
|
|
ActionNode::ActionNode()
|
2013-12-26 16:36:21 +08:00
|
|
|
: _currentFrameIndex(0)
|
|
|
|
, _destFrameIndex(0)
|
|
|
|
, _fUnitTime(0.1f)
|
|
|
|
, _actionTag(0)
|
2013-12-26 23:40:50 +08:00
|
|
|
, _actionSpawn(nullptr)
|
|
|
|
, _action(nullptr)
|
|
|
|
, _object(nullptr)
|
2013-12-26 16:36:21 +08:00
|
|
|
, _frameArrayNum(0)
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
_frameArrayNum = (int)kKeyframeMax;
|
|
|
|
for(int i = 0; i < _frameArrayNum; i++)
|
|
|
|
{
|
|
|
|
_frameArray.push_back( new cocos2d::Vector<ActionFrame*>());
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
ActionNode::~ActionNode()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if (_action == nullptr)
|
|
|
|
{
|
|
|
|
CC_SAFE_RELEASE_NULL(_actionSpawn);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CC_SAFE_RELEASE_NULL(_action);
|
|
|
|
}
|
2013-12-26 16:29:59 +08:00
|
|
|
|
2013-12-27 12:45:05 +08:00
|
|
|
for (auto object : _frameArray)
|
|
|
|
{
|
|
|
|
object->clear();
|
2014-01-06 10:42:17 +08:00
|
|
|
CC_SAFE_DELETE(object);
|
2013-12-27 12:45:05 +08:00
|
|
|
}
|
2014-03-10 15:08:42 +08:00
|
|
|
_frameArray.clear();
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2014-02-20 10:53:49 +08:00
|
|
|
void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root)
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
setActionTag(DICTOOL->getIntValue_json(dic, "ActionTag"));
|
|
|
|
int actionFrameCount = DICTOOL->getArrayCount_json(dic, "actionframelist");
|
|
|
|
for (int i=0; i<actionFrameCount; i++)
|
|
|
|
{
|
|
|
|
const rapidjson::Value& actionFrameDic = DICTOOL->getDictionaryFromArray_json(dic, "actionframelist", i);
|
|
|
|
int frameInex = DICTOOL->getIntValue_json(actionFrameDic,"frameid");
|
2013-09-20 22:23:13 +08:00
|
|
|
|
2014-03-07 21:49:24 +08:00
|
|
|
int frameTweenType = DICTOOL->getIntValue_json(actionFrameDic,"tweenType");
|
2014-03-10 15:08:42 +08:00
|
|
|
|
2014-03-07 21:49:24 +08:00
|
|
|
std::vector<float> frameTweenParameter;
|
|
|
|
int frameTweenParameterNum = DICTOOL->getArrayCount_json(actionFrameDic, "tweenParameter");
|
2014-03-10 15:08:42 +08:00
|
|
|
|
2014-03-07 21:49:24 +08:00
|
|
|
for (int j = 0; j < frameTweenParameterNum; j++)
|
|
|
|
{
|
|
|
|
float value = DICTOOL->getFloatValueFromArray_json(actionFrameDic, "tweenParameter", j);
|
|
|
|
frameTweenParameter.push_back(value);
|
|
|
|
}
|
2014-03-10 15:08:42 +08:00
|
|
|
|
|
|
|
|
|
|
|
bool existPosition = DICTOOL->checkObjectExist_json(actionFrameDic,"positionx");
|
|
|
|
if (existPosition)
|
|
|
|
{
|
|
|
|
float positionX = DICTOOL->getFloatValue_json(actionFrameDic, "positionx");
|
|
|
|
float positionY = DICTOOL->getFloatValue_json(actionFrameDic, "positiony");
|
|
|
|
ActionMoveFrame* actionFrame = new ActionMoveFrame();
|
|
|
|
actionFrame->setFrameIndex(frameInex);
|
2014-03-07 21:49:24 +08:00
|
|
|
actionFrame->setEasingType(frameTweenType);
|
|
|
|
actionFrame->setEasingParameter(frameTweenParameter);
|
2014-03-10 15:08:42 +08:00
|
|
|
actionFrame->setPosition(Point(positionX, positionY));
|
|
|
|
auto cActionArray = _frameArray.at((int)kKeyframeMove);
|
|
|
|
cActionArray->pushBack(actionFrame);
|
|
|
|
actionFrame->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool existScale = DICTOOL->checkObjectExist_json(actionFrameDic,"scalex");
|
|
|
|
if (existScale)
|
|
|
|
{
|
|
|
|
float scaleX = DICTOOL->getFloatValue_json(actionFrameDic, "scalex");
|
|
|
|
float scaleY = DICTOOL->getFloatValue_json(actionFrameDic, "scaley");
|
|
|
|
ActionScaleFrame* actionFrame = new ActionScaleFrame();
|
|
|
|
actionFrame->setFrameIndex(frameInex);
|
2014-03-07 21:49:24 +08:00
|
|
|
actionFrame->setEasingType(frameTweenType);
|
|
|
|
actionFrame->setEasingParameter(frameTweenParameter);
|
2014-03-10 15:08:42 +08:00
|
|
|
actionFrame->setScaleX(scaleX);
|
|
|
|
actionFrame->setScaleY(scaleY);
|
|
|
|
auto cActionArray = _frameArray.at((int)kKeyframeScale);
|
|
|
|
cActionArray->pushBack(actionFrame);
|
|
|
|
actionFrame->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool existRotation = DICTOOL->checkObjectExist_json(actionFrameDic,"rotation");
|
|
|
|
if (existRotation)
|
|
|
|
{
|
|
|
|
float rotation = DICTOOL->getFloatValue_json(actionFrameDic, "rotation");
|
|
|
|
ActionRotationFrame* actionFrame = new ActionRotationFrame();
|
|
|
|
actionFrame->setFrameIndex(frameInex);
|
2014-03-07 21:49:24 +08:00
|
|
|
actionFrame->setEasingType(frameTweenType);
|
|
|
|
actionFrame->setEasingParameter(frameTweenParameter);
|
2014-03-10 15:08:42 +08:00
|
|
|
actionFrame->setRotation(rotation);
|
|
|
|
auto cActionArray = _frameArray.at((int)kKeyframeRotate);
|
|
|
|
cActionArray->pushBack(actionFrame);
|
|
|
|
actionFrame->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool existOpacity = DICTOOL->checkObjectExist_json(actionFrameDic,"opacity");
|
|
|
|
if (existOpacity)
|
|
|
|
{
|
|
|
|
int opacity = DICTOOL->getIntValue_json(actionFrameDic, "opacity");
|
|
|
|
ActionFadeFrame* actionFrame = new ActionFadeFrame();
|
|
|
|
actionFrame->setFrameIndex(frameInex);
|
2014-03-07 21:49:24 +08:00
|
|
|
actionFrame->setEasingType(frameTweenType);
|
|
|
|
actionFrame->setEasingParameter(frameTweenParameter);
|
2014-03-10 15:08:42 +08:00
|
|
|
actionFrame->setOpacity(opacity);
|
|
|
|
auto cActionArray = _frameArray.at((int)kKeyframeTint);
|
|
|
|
cActionArray->pushBack(actionFrame);
|
|
|
|
actionFrame->release();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool existColor = DICTOOL->checkObjectExist_json(actionFrameDic,"colorr");
|
|
|
|
if (existColor)
|
|
|
|
{
|
|
|
|
int colorR = DICTOOL->getIntValue_json(actionFrameDic, "colorr");
|
|
|
|
int colorG = DICTOOL->getIntValue_json(actionFrameDic, "colorg");
|
|
|
|
int colorB = DICTOOL->getIntValue_json(actionFrameDic, "colorb");
|
|
|
|
ActionTintFrame* actionFrame = new ActionTintFrame();
|
|
|
|
actionFrame->setFrameIndex(frameInex);
|
2014-03-07 21:49:24 +08:00
|
|
|
actionFrame->setEasingType(frameTweenType);
|
|
|
|
actionFrame->setEasingParameter(frameTweenParameter);
|
2014-03-10 15:08:42 +08:00
|
|
|
actionFrame->setColor(Color3B(colorR,colorG,colorB));
|
|
|
|
auto cActionArray = _frameArray.at((int)kKeyframeFade);
|
|
|
|
cActionArray->pushBack(actionFrame);
|
|
|
|
actionFrame->release();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
initActionNodeFromRoot(root);
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2014-02-20 10:53:49 +08:00
|
|
|
void ActionNode::initActionNodeFromRoot(Ref* root)
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
Node* rootNode = dynamic_cast<Node*>(root);
|
|
|
|
if (rootNode != nullptr)
|
|
|
|
{
|
|
|
|
Widget* rootWidget = dynamic_cast<Widget*>(root);
|
|
|
|
if (rootWidget != nullptr)
|
|
|
|
{
|
|
|
|
Widget* widget = Helper::seekActionWidgetByActionTag(rootWidget, getActionTag());
|
|
|
|
if (widget != nullptr)
|
|
|
|
{
|
|
|
|
setObject(widget);
|
|
|
|
}
|
|
|
|
}
|
2013-12-26 17:01:31 +08:00
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::setUnitTime(float fTime)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
_fUnitTime = fTime;
|
|
|
|
this->refreshActionProperty();
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
float ActionNode::getUnitTime()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
return _fUnitTime;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::setActionTag(int tag)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
_actionTag = tag;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int ActionNode::getActionTag()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
return _actionTag;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2014-02-20 10:53:49 +08:00
|
|
|
void ActionNode::setObject(Ref* node)
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
_object = node;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2014-02-20 10:53:49 +08:00
|
|
|
Ref* ActionNode::getObject()
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
return _object;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Node* ActionNode::getActionNode()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
Node* cNode = dynamic_cast<Node*>(_object);
|
|
|
|
if (cNode != nullptr)
|
|
|
|
{
|
|
|
|
return cNode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Widget* rootWidget = dynamic_cast<Widget*>(_object);
|
|
|
|
if (rootWidget != nullptr)
|
|
|
|
{
|
|
|
|
return rootWidget;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nullptr;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::insertFrame(int index, ActionFrame* frame)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if (frame == nullptr)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
int frameType = frame->getFrameType();
|
|
|
|
if(frameType < _frameArray.size())
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(frameType);
|
|
|
|
cArray->insert(index, frame);
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::addFrame(ActionFrame* frame)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if (frame == nullptr)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
int frameType = frame->getFrameType();
|
|
|
|
|
|
|
|
if(frameType < _frameArray.size())
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(frameType);
|
|
|
|
cArray->pushBack(frame);
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::deleteFrame(ActionFrame* frame)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if (frame == nullptr)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
int frameType = frame->getFrameType();
|
|
|
|
if(frameType < _frameArray.size())
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(frameType);
|
|
|
|
cArray->eraseObject(frame);
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::clearAllFrame()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
for(auto array : _frameArray)
|
|
|
|
{
|
|
|
|
array->clear();
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Spawn * ActionNode::refreshActionProperty()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if ( _object == nullptr )
|
|
|
|
{
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
Vector<FiniteTimeAction*> cSpawnArray;
|
|
|
|
|
|
|
|
for (int n = 0; n < _frameArrayNum; n++)
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(n);
|
|
|
|
if (cArray->size() <= 0)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector<FiniteTimeAction*> cSequenceArray;
|
|
|
|
auto frameCount = cArray->size();
|
|
|
|
for (int i = 0; i < frameCount; i++)
|
|
|
|
{
|
|
|
|
auto frame = cArray->at(i);
|
|
|
|
if (i == 0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
auto srcFrame = cArray->at(i-1);
|
|
|
|
float duration = (frame->getFrameIndex() - srcFrame->getFrameIndex()) * getUnitTime();
|
|
|
|
Action* cAction = frame->getAction(duration);
|
|
|
|
if(cAction != nullptr)
|
|
|
|
cSequenceArray.pushBack(static_cast<FiniteTimeAction*>(cAction));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Sequence* cSequence = Sequence::create(cSequenceArray);
|
|
|
|
if (cSequence != nullptr)
|
|
|
|
{
|
|
|
|
cSpawnArray.pushBack(cSequence);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_action == nullptr)
|
|
|
|
{
|
|
|
|
CC_SAFE_RELEASE_NULL(_actionSpawn);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
CC_SAFE_RELEASE_NULL(_action);
|
|
|
|
}
|
|
|
|
|
|
|
|
_actionSpawn = Spawn::create(cSpawnArray);
|
|
|
|
CC_SAFE_RETAIN(_actionSpawn);
|
|
|
|
return _actionSpawn;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2013-11-08 14:34:24 +08:00
|
|
|
void ActionNode::playAction()
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if ( _object == nullptr || _actionSpawn == nullptr)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
|
2014-03-10 15:08:42 +08:00
|
|
|
if (_action!=nullptr)
|
|
|
|
{
|
|
|
|
_action->release();
|
|
|
|
}
|
2013-11-08 14:34:24 +08:00
|
|
|
|
2014-03-10 15:08:42 +08:00
|
|
|
_action = Sequence::create(_actionSpawn, nullptr);
|
|
|
|
_action->retain();
|
2013-09-20 22:23:13 +08:00
|
|
|
|
2014-03-10 15:08:42 +08:00
|
|
|
this->runAction();
|
2013-09-20 22:23:13 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::runAction()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
Node* cNode = this->getActionNode();
|
|
|
|
if (cNode != nullptr && _action != nullptr)
|
|
|
|
{
|
|
|
|
cNode->runAction(_action);
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ActionNode::stopAction()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
Node* cNode = this->getActionNode();
|
|
|
|
if (cNode != nullptr && _action != nullptr)
|
|
|
|
{
|
|
|
|
cNode->stopAction(_action);
|
|
|
|
}
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int ActionNode::getFirstFrameIndex()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
int frameindex = 99999;
|
|
|
|
bool bFindFrame = false;
|
|
|
|
for (int n = 0; n < _frameArrayNum; n++)
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(n);
|
|
|
|
if (cArray->empty())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
bFindFrame = true;
|
|
|
|
auto frame = cArray->at(0);
|
|
|
|
int iFrameIndex = frame->getFrameIndex();
|
|
|
|
|
|
|
|
if (frameindex > iFrameIndex)
|
|
|
|
{
|
|
|
|
frameindex = iFrameIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!bFindFrame)
|
|
|
|
{
|
|
|
|
frameindex = 0;
|
|
|
|
}
|
|
|
|
return frameindex;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int ActionNode::getLastFrameIndex()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
int frameindex = -1;
|
|
|
|
bool bFindFrame = false;
|
|
|
|
for (int n = 0; n < _frameArrayNum; n++)
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(n);
|
|
|
|
if (cArray->empty())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
bFindFrame = true;
|
|
|
|
ssize_t lastInex = cArray->size() - 1;
|
|
|
|
auto frame = cArray->at(lastInex);
|
|
|
|
int iFrameIndex = frame->getFrameIndex();
|
|
|
|
|
|
|
|
if (frameindex < iFrameIndex)
|
|
|
|
{
|
|
|
|
frameindex = iFrameIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!bFindFrame)
|
|
|
|
{
|
|
|
|
frameindex = 0;
|
|
|
|
}
|
|
|
|
return frameindex;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
2014-03-10 15:08:42 +08:00
|
|
|
|
2013-09-20 22:23:13 +08:00
|
|
|
bool ActionNode::updateActionToTimeLine(float fTime)
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
bool bFindFrame = false;
|
|
|
|
|
|
|
|
ActionFrame* srcFrame = nullptr;
|
|
|
|
for (int n = 0; n < _frameArrayNum; n++)
|
|
|
|
{
|
|
|
|
auto cArray = _frameArray.at(n);
|
|
|
|
if (cArray->empty())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
ssize_t frameCount = cArray->size();
|
|
|
|
for (int i = 0; i < frameCount; i++)
|
|
|
|
{
|
|
|
|
auto frame = cArray->at(i);
|
|
|
|
|
|
|
|
if (frame->getFrameIndex()*getUnitTime() == fTime)
|
|
|
|
{
|
|
|
|
this->easingToFrame(1.0f,1.0f,nullptr,frame);
|
|
|
|
bFindFrame = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (frame->getFrameIndex()*getUnitTime() > fTime)
|
|
|
|
{
|
|
|
|
if (i == 0)
|
|
|
|
{
|
|
|
|
this->easingToFrame(1.0f,1.0f,nullptr,frame);
|
|
|
|
bFindFrame = false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
srcFrame = cArray->at(i-1);
|
|
|
|
float duration = (frame->getFrameIndex() - srcFrame->getFrameIndex())*getUnitTime();
|
|
|
|
float delaytime = fTime - srcFrame->getFrameIndex()*getUnitTime();
|
|
|
|
this->easingToFrame(duration,1.0f,nullptr,srcFrame);
|
|
|
|
//float easingTime = ActionFrameEasing::bounceTime(delaytime);
|
|
|
|
this->easingToFrame(duration,delaytime/duration,srcFrame,frame);
|
|
|
|
bFindFrame = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return bFindFrame;
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2013-12-24 20:33:55 +08:00
|
|
|
void ActionNode::easingToFrame(float duration,float delayTime,ActionFrame* srcFrame,ActionFrame* destFrame)
|
2013-09-20 22:23:13 +08:00
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
Action* cAction = destFrame->getAction(duration,srcFrame);
|
|
|
|
Node* cNode = this->getActionNode();
|
|
|
|
if (cAction == nullptr || cNode == nullptr)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
cAction->startWithTarget(cNode);
|
|
|
|
cAction->update(delayTime);
|
2013-09-20 22:23:13 +08:00
|
|
|
}
|
|
|
|
|
2013-11-08 14:34:24 +08:00
|
|
|
|
|
|
|
bool ActionNode::isActionDoneOnce()
|
|
|
|
{
|
2014-03-10 15:08:42 +08:00
|
|
|
if (_action == nullptr)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return _action->isDone();
|
2013-11-08 14:34:24 +08:00
|
|
|
}
|
|
|
|
|
2014-02-13 16:39:53 +08:00
|
|
|
}
|