package com.junerking.skeleton; import java.util.ArrayList; import com.junerking.skeleton.DataDef.AnimationData; import com.junerking.skeleton.DataDef.MovementBoneData; import com.junerking.skeleton.DataDef.MovementData; public class Animation extends ProcessBase { private Armature _armature; private MovementData _movement_data; private AnimationData _animation_data; public Animation(Armature armature) { this._armature = armature; } @Override public void setProcessTimeScale(float time_scale) { ArrayList<Bone> bones = _armature._bone_in_depth_list; for (int i = 0; i < bones.size(); i++) { bones.get(i)._tween.setProcessTimeScale(time_scale); } this._time_process_scale = time_scale; } public void setAnimationData(AnimationData data) { this._animation_data = data; } public AnimationData getAnimationData() { return _animation_data; } @Override public void gotoAndPlay(Object movement_name, int duration_to, int duration_tween, boolean loop, int tween_easing) { if (_animation_data == null) return; _movement_data = _animation_data.getMovementData((String) movement_name); if (_movement_data == null) return; duration_to = duration_to < 0 ? _movement_data.duration_to : duration_to; duration_tween = duration_tween < 0 ? _movement_data.duration_tween : duration_tween; duration_tween = duration_tween == 0 ? _movement_data.duration : duration_tween; tween_easing = tween_easing == -2 ? _movement_data.tween_easing : tween_easing; loop &= _movement_data.loop; _time_scale = _movement_data.scale; super.gotoAndPlay(null, duration_to, duration_tween, loop, tween_easing); _duration = _movement_data.duration; if (_duration == 1) { _loop = SINGLE; } else { if (loop) { _loop = LIST_LOOP_START; } else { _loop = LIST_START; --_duration; } _duration_tween = duration_tween; } for (int i = 0; i < _armature._bone_dic.size(); i++) { Bone bone = _armature._bone_dic.get(i); if (bone == null) continue; MovementBoneData movement_bone_data = _movement_data.getMovementBoneData(bone.name); movement_bone_data.duration = _movement_data.duration; bone._tween.setTimeScale(_time_scale); bone._tween.setProcessTimeScale(_time_process_scale); bone._tween.gotoAndPlay(movement_bone_data, duration_to, duration_tween, loop, tween_easing); } } @Override protected void updateHandler() { if (_current_percent >= 1.0f) { switch (_loop) { case LIST_START: { _loop = LIST; _current_percent = (_current_percent - 1.0f) * _total_frames / _duration_tween; if (_current_percent > 1) { } else { _total_frames = _duration_tween; //listener } } break; case LIST: case SINGLE: { _current_percent = 1; _is_complete = true; } break; case LIST_LOOP_START: { _loop = 0; _total_frames = _duration_tween > 0 ? _duration_tween : 1; _current_percent %= 1; } break; default: { _loop += _current_percent; _current_percent %= 1; _to_index = 0; } break; } } } }