diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index d0f698d419..f1dc53a7af 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -36,6 +36,7 @@ NS_TIMELINE_BEGIN Frame::Frame() : _frameIndex(0) , _tween(true) + , _enterWhenPassed(false) , _timeline(nullptr) , _node(nullptr) { @@ -554,6 +555,7 @@ EventFrame* EventFrame::create() EventFrame* frame = new (std::nothrow) EventFrame(); if (frame) { + frame->init(); frame->autorelease(); return frame; } @@ -561,6 +563,11 @@ EventFrame* EventFrame::create() return nullptr; } +void EventFrame::init() +{ + _enterWhenPassed = true; +} + EventFrame::EventFrame() : _event("") { diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h index 46022f7f0e..10b72d36a4 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h @@ -54,6 +54,8 @@ public: virtual void setTween(bool tween) { _tween = tween; } virtual bool isTween() const { return _tween; } + virtual bool isEnterWhenPassed() { return _enterWhenPassed; } + virtual void onEnter(Frame *nextFrame) = 0; virtual void apply(float percent) {} @@ -68,6 +70,7 @@ protected: unsigned int _frameIndex; bool _tween; + bool _enterWhenPassed; Timeline* _timeline; cocos2d::Node* _node; @@ -300,6 +303,7 @@ class CC_STUDIO_DLL EventFrame : public Frame { public: static EventFrame* create(); + void init(); EventFrame(); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp index db0e78af9b..cac7ff5178 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp @@ -144,6 +144,13 @@ void Timeline::binarySearchKeyFrame(int frameIndex) if(_currentKeyFrameIndex >= _frames.at(0)->getFrameIndex()) needEnterFrame = true; + _fromIndex = 0; + + if(length > 1) + _toIndex = 1; + else + _toIndex = 0; + from = to = _frames.at(0); _currentKeyFrameIndex = 0; _betweenDuration = _frames.at(0)->getFrameIndex(); @@ -151,6 +158,9 @@ void Timeline::binarySearchKeyFrame(int frameIndex) } else if(frameIndex >= _frames.at(length - 1)->getFrameIndex()) { + _fromIndex = (int)(length - 1); + _toIndex = 0; + from = to = _frames.at(length - 1); _currentKeyFrameIndex = _frames.at(length - 1)->getFrameIndex(); _betweenDuration = 0; @@ -171,9 +181,16 @@ void Timeline::binarySearchKeyFrame(int frameIndex) else low=mid+1; } + + _fromIndex = (int)target; - from = _frames.at(target); - to = _frames.at(target+1); + if(length > 1) + _toIndex = (int)(target + 1); + else + _toIndex = (int)target; + + from = _frames.at(_fromIndex); + to = _frames.at(_toIndex); if(target == 0 && _currentKeyFrameIndexgetFrameIndex()) needEnterFrame = true; @@ -191,6 +208,8 @@ void Timeline::binarySearchKeyFrame(int frameIndex) void Timeline::updateCurrentKeyFrame(int frameIndex) { + if(frameIndex > 60) + int a = 0; //! If play to current frame's front or back, then find current frame again if (frameIndex < _currentKeyFrameIndex || frameIndex >= _currentKeyFrameIndex + _betweenDuration) { @@ -210,10 +229,10 @@ void Timeline::updateCurrentKeyFrame(int frameIndex) } else if(frameIndex >= _frames.at(length - 1)->getFrameIndex()) { - from = to = _frames.at(length - 1); - _currentKeyFrameIndex = _frames.at(length - 1)->getFrameIndex(); - _betweenDuration = 0; - break; + int lastFrameIndex = _frames.at(length - 1)->getFrameIndex(); + if(_currentKeyFrameIndex >= lastFrameIndex) + return; + frameIndex = lastFrameIndex; } do @@ -230,19 +249,25 @@ void Timeline::updateCurrentKeyFrame(int frameIndex) to = _frames.at(_toIndex); - if (frameIndex == from->getFrameIndex()) - { + if(frameIndex == from->getFrameIndex()) break; - } + if(frameIndex > from->getFrameIndex() && frameIndex < to->getFrameIndex()) + break; + if(from->isEnterWhenPassed()) + from->onEnter(to); } - while (frameIndex < from->getFrameIndex() || frameIndex >= to->getFrameIndex()); + while (true); + if(_fromIndex == length-1) + to = from; + _betweenDuration = to->getFrameIndex() - from->getFrameIndex(); - + } while (0); _currentKeyFrame = from; _currentKeyFrame->onEnter(to); + } }