spine 切换动画完成后 闪烁一帧这个 求助。
package com.quanyecha.assets;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.ObjectMap;
import com.esotericsoftware.spine.Animation;
import com.esotericsoftware.spine.AnimationState;
import com.esotericsoftware.spine.AnimationStateData;
import com.esotericsoftware.spine.Event;
import com.esotericsoftware.spine.Skeleton;
import com.esotericsoftware.spine.SkeletonData;
import com.esotericsoftware.spine.SkeletonJson;
import com.esotericsoftware.spine.SkeletonRenderer;
import com.esotericsoftware.spine.AnimationState.AnimationStateListener;
import com.esotericsoftware.spine.AnimationState.TrackEntry;
import com.quanyecha.utii.State;
import com.quanyecha.utii.StateView;
public abstract class SpineAnimation extends Actor{
SkeletonRenderer render;//spine画笔
PolygonSpriteBatch poluginBath;//spine画布
TextureAtlas platycodon; //图片纹理
SkeletonData playerSkeletonDate; //骨骼数据
AnimationStateData platycodonAnimationStateData;
AnimationState animationState; //播放和设置动画
Skeleton skeleton; //spine骨骼
public float direction =1;
ObjectMap<State, StateView> playerStates = new ObjectMap();
int sacle;
public SpineAnimation(String atlas,String jsons) {
render = new SkeletonRenderer(); //创建画笔
render.setPremultipliedAlpha(true);
poluginBath = new PolygonSpriteBatch(); //创建画布
platycodon = new TextureAtlas(Gdx.files.internal(atlas)); //装载纹理图片
SkeletonJson json = new SkeletonJson(platycodon); //解析纹理
json.setScale(250f/625f);//设置比例
playerSkeletonDate = json.readSkeletonData(Gdx.files.internal(jsons));//获取spine json数据
platycodonAnimationStateData = new AnimationStateData(playerSkeletonDate);//创建动画数据
platycodonAnimationStateData.setDefaultMix(0.25f); //动画数据默认过度时间
setMix();
steupState();
skeleton = new Skeleton(playerSkeletonDate);//创建骨骼控制器
animationState = new AnimationState(platycodonAnimationStateData); //创建动画控制器
animationState.apply(skeleton);//动画添加上骨骼
setAnimation();
skeleton.setPosition(getX(), getY());
skeleton.setScale(1f, 1f); //设置比例,负数为反转动画
}
//设置动画
boolean setAnimation(StateView state,boolean force) {
Animation animation = state.animation;
TrackEntry current = animationState.getCurrent(0);
Animation oldAnimation = current == null?null:current.getAnimation();
if(force||oldAnimation != animation) {
if(state.animation == null) {return false;}
if(state.animation.equals(oldAnimation)) return true;
TrackEntry entry = animationState.setAnimation(0, state.animation, state.loop);
if(oldAnimation != null)entry.setTrackEnd(state.startTimes.get(oldAnimation, state.defaultStartTime));
if(!state.loop)entry.setTrackEnd(Float.MAX_VALUE);
return true;
}
return false;
}
@Override
public void act(float arg0) {
// TODO Auto-generated method stub
super.act(arg0);
// 动画控制器更新时间步
animationState.update(arg0);
skeleton.setScale(direction, 1f);
// 动画控制器控制骨骼动画
animationState.apply(skeleton);
animationState.setTimeScale(1);
skeleton.setPosition(getX(), getY());
// 骨骼逐级进行矩阵变换
skeleton.updateWorldTransform();
}
@Override
public void draw(Batch batch, float parentAlpha) {
// TODO Auto-generated method stub
// 绘制
poluginBath.begin();
render.draw(poluginBath, skeleton);
poluginBath.end();
}
/**
* 初始设置动画
* */
public abstract void setAnimation() ;
/**
* 初始设置过度时间
* */
public abstract void setMix() ;
/**
* 初始设置添加动画
* */
public abstract void steupState() ;
public abstract class MyAnimationStateListener implements AnimationStateListener{};
}
1 在用spine+libgdx 做一个动画例子
2 解决切换动画时 出现一帧这个图片