void ActionTimeline::step(float delta)
{
    if (!_playing || _timelineMap.size() == 0 || _duration == 0)
    {
        return;
    }

    _time += delta * _timeSpeed;
    const float endtoffset = _time - _endFrame * _frameInternal;

    if (endtoffset < _frameInternal)
    {
        _currentFrame = (int)(_time / _frameInternal);
        stepToFrame(_currentFrame);
        if (endtoffset >= 0 && _lastFrameListener != nullptr) // last frame
            _lastFrameListener();
    }
    else
    {
        _playing = _loop;
        if (!_playing)
        {
            _time = _endFrame * _frameInternal;
            if (_currentFrame != _endFrame)
            {
                _currentFrame = _endFrame;
                stepToFrame(_currentFrame);
                if (_lastFrameListener != nullptr)  // last frame
                    _lastFrameListener();
            }
        }
        else
            gotoFrameAndPlay(_startFrame, _endFrame, _loop);
    }
}
void ActionTimeline::step(float delta)
{
    if (!_playing || _timelineMap.size() == 0 || _duration == 0)
    {
        return;
    }

    _time += delta * _timeSpeed;
    _currentFrame = (int)(_time / _frameInternal);

    stepToFrame(_currentFrame);

    if(_time > _endFrame * _frameInternal)
    {
        _playing = _loop;
        if(!_playing)
            _time = _endFrame * _frameInternal;
        else           
            gotoFrameAndPlay(_startFrame, _endFrame, _loop);
    }

}