关于动画最后一帧可能放可能不放的问题

由于开始使用cocostudio的时候 默认最后一帧不会放到,导致我们后面做的很多动画都 默认有一帧空白帧。。
随着版本更新 到后面变成了 最后一帧有些动画会放,然后循环播放动画的时候,出现了闪帧的问题(闪一下空白帧)
这个bug查了很久,最近项目上线的压力,只能详细debug 最后发现的问题在void CCTween::updateHandler() 这个函数中

void CCTween::updateHandler()
{
if (m_fCurrentPercent >= 1)
{

case ANIMATION_TO_LOOP_FRONT:
{
m_eLoopType = ANIMATION_LOOP_FRONT;

        m_iNextFrameIndex = m_iDurationTween > 0 ? m_iDurationTween : 1;


        if (m_pMovementBoneData->delay != 0)
        {
            //
            m_fCurrentFrame = (1 - m_pMovementBoneData->delay) * (float)m_iNextFrameIndex;
            m_fCurrentPercent = m_fCurrentFrame / m_iNextFrameIndex;
        }
        else
        {

m_fCurrentPercent = 0;
m_fCurrentFrame = 0;
}

超过100%的时候 不管超过多少都会将帧设置为0 就出现了随机闪现的问题 也就是中间有很小的一部分时间被截掉了,然后出现了闪的问题(随机出现最后一帧)
m_fCurrentPercent = fmodf(m_fCurrentPercent, 1);
m_fCurrentFrame = fmodf(m_fCurrentFrame, m_iNextFrameIndex);

改为这样后 就保留了那部分被截掉的时间
这样修改了以后 也不知道为什么就不会出现最后一帧了,原意是想让所有动画都出现空白帧闪的问题,然后在json文件读取器里面吧最后一帧截掉,不过我自己查看动画除了最后一帧都不会播放到,也就无所谓啦。。
希望官方尽快查看这个bug的问题~

感谢您的反馈,该问题已经提交至Armature负责人,如果严重存在,会尽快同步至主版本。

我们也遇到了这个问题,后来发现这是编辑器的bug,具体修复看下面python代码,直接检查json文件

def fix_last_frame_add(hero_path):
if not hero_path.endswith(’/’):
hero_path += ‘/’
list_hero = os.listdir(hero_path)
for hero in list_hero:
json_path = hero_path
json_path += hero
json_path += ‘/Json/’
json_path += hero
json_path += ‘.json’
if not os.path.exists(json_path):
continue
handle_json = open(json_path)
obj_json = json.load(handle_json)
handle_json.close()
flag_change = 0
for lam in obj_json’animation_data’]:
for lmv in lam’mov_data’]:
frame_index = 0
for lmb in lmv’mov_bone_data’]:
num_bone = len(lmb’frame_data’])
if frame_index <= lmb’frame_data’]‘fi’]:
frame_index = lmb’frame_data’]‘fi’]
for lmb in lmv’mov_bone_data’]:
num_bone = len(lmb’frame_data’])
if frame_index <= lmb’frame_data’]‘fi’]:
m = lmb’frame_data’]-1]
n = lmb’frame_data’]-2]
# if m’fi’] == n’fi’] + 1:
# lmb’frame_data’] = lmb’frame_data’]:-1]
# flag_change += 1
# print ‘delete last frame …’
if lmv’dr’] != m’fi’] + 1:
lmv’dr’] = m’fi’] + 1
flag_change += 1
print “已修正 dr 导致的最后一帧问题”, hero, lmv’name’], lmb’name’], ‘dr =’, lmv’dr’]
if flag_change > 0:
data_json = json.dumps(obj_json, indent=2, sort_keys=True)
handle_json = open(json_path, ‘w’)
handle_json.write(data_json)
handle_json.close()
if flag_change <= 0:
print “\n\tdr 正常,(解决由索引值导致的最后一帧无法播放的bug)”

3.2 3.3 + ccs1.6 我这重来灭有播过最后一帧

找到dr的值,如果不等于fi + 1,就修改成等于就可以了!