fix bug: #23532 AnchorPointFrame animation performance diffrent with cocos studio

This commit is contained in:
geron-cn 2015-10-20 15:49:12 +08:00
parent f4a2a53f6d
commit be8a158bd7
3 changed files with 37 additions and 11 deletions

View File

@ -478,17 +478,23 @@ inline ActionTimeline* ActionTimelineCache::createActionWithDataBuffer(const coc
action->addAnimationInfo(info);
}
auto timelines = nodeAction->timeLines();
int timelineLength = timelines->size();
auto timeLines = nodeAction->timeLines();
int timelineLength = timeLines->size();
std::multimap<std::string, cocostudio::timeline::Timeline*> properTimelineMap;// order the timelines depends property name
for (int i = 0; i < timelineLength; i++)
{
auto timelineFlatBuf = timelines->Get(i);
auto timelineFlatBuf = timeLines->Get(i);
Timeline* timeline = loadTimelineWithFlatBuffers(timelineFlatBuf);
if (timeline)
action->addTimeline(timeline);
{
properTimelineMap.insert(std::make_pair(timelineFlatBuf->property()->c_str(), timeline));
}
}
for (const auto& properTimelinePair : properTimelineMap)
{
action->addTimeline(properTimelinePair.second);
}
return action;
}
@ -969,17 +975,22 @@ ActionTimeline* ActionTimelineCache::createActionWithFlatBuffersForSimulator(con
auto timeLines = nodeAction->timeLines();
int timelineLength = timeLines->size();
std::multimap<std::string, cocostudio::timeline::Timeline*> properTimelineMap;// order the timelines depends property name
for (int i = 0; i < timelineLength; i++)
{
auto timelineFlatBuf = timeLines->Get(i);
Timeline* timeline = loadTimelineWithFlatBuffers(timelineFlatBuf);
if (timeline)
action->addTimeline(timeline);
{
properTimelineMap.insert(std::make_pair(timelineFlatBuf->property()->c_str(), timeline));
}
}
for (const auto& properTimelinePair : properTimelineMap)
{
action->addTimeline(properTimelinePair.second);
}
fbs->deleteFlatBufferBuilder();
return action;
}

View File

@ -506,7 +506,10 @@ void AnchorPointFrame::onEnter(Frame *nextFrame, int currentFrameIndex)
{
return;
}
if (_tween)
{
_betweenAnchorPoint = static_cast<AnchorPointFrame*>(nextFrame)->_anchorPoint - _anchorPoint;
}
_node->setAnchorPoint(_anchorPoint);
}
@ -521,6 +524,15 @@ Frame* AnchorPointFrame::clone()
return frame;
}
void AnchorPointFrame::onApply(float percent)
{
if ((nullptr != _node) && (_betweenAnchorPoint.x != 0 || _betweenAnchorPoint.y != 0))
{
auto applyAnchorP = _betweenAnchorPoint * percent + _anchorPoint;
_node->setAnchorPoint(applyAnchorP);
}
}
// InnerActionFrame

View File

@ -260,7 +260,10 @@ public:
inline cocos2d::Point getAnchorPoint() const { return _anchorPoint; }
protected:
cocos2d::Point _anchorPoint;
virtual void onApply(float percent) override;
cocos2d::Vec2 _betweenAnchorPoint;
cocos2d::Vec2 _anchorPoint;
};