我使用Libgdx框架和Spine一起使用Atlas进行Skeleton动画并导出Json文件。在文件中有许多动画。我能够从json文件加载动画。但有两个问题:
动画开始时滞后:动画开始前有3-4秒的延迟。我看到一个黑屏,然后动画就可以了。
Delta - 我在delta时间方面遇到了一些问题。只有一些动画从默认增量值运行,但是如果我更改(增加或减少增量值),则不同的动画会给出不同的结果。
不明白该怎么办?我已经在互联网上彻底搜索过,但还没有找到解决方案。
我在下面发布我的代码:
这是我的主要课程
public class AndroidLauncher extends AndroidApplication
{
SpriteBatch batch;
Texture img;
ShapeRenderer renderer;
TextureAtlas atlas;
Skeleton skeleton;
Animation animation;
float time;
Bone root;
float x,y;
View spine_view;
private Screen curScreen; // the current screen
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
//initialize(new Main(20), config);
spine_view=initializeForView(new ApplicationListener()
{
@Override
public void resume()
{
curScreen.resume();
}
@Override
public void resize(int width, int height)
{
}
@Override
public void render()
{
curScreen.render((Gdx.graphics.getDeltaTime()/(1.5f))); //call the rendermethod with the delta time as parameter
}
@Override
public void pause()
{
curScreen.pause();
}
@Override
public void dispose()
{
curScreen.dispose();
}
@Override
public void create()
{
Gdx.graphics.getWidth();
Gdx.graphics.getHeight();
Firstscreen temp = new Firstscreen();//just an example of the first screen to load up
setScreen(temp);
}
}, config);
LinearLayout l1 = (LinearLayout) findViewById(R.id.container);
l1.addView(spine_view);
}
public void setScreen(Screen s) {
if (curScreen != null) {
curScreen.hide();
curScreen.dispose();
}
curScreen = s;
curScreen.show();
}
}
...............................................
这是Iam渲染的屏幕
public class Firstscreen implements Screen
{
SpriteBatch batch;
Texture img;
ShapeRenderer renderer;
TextureAtlas atlas;
Skeleton skeleton;
Animation animation;
float time;
Bone root;
float x,y;
int count =0;
@Override
public void render(float delta)
{
// track
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
time += delta;
animation.apply(skeleton,delta,time, false, null);
SkeletonRenderer render = new SkeletonRenderer();
batch.begin();
render.draw(batch, skeleton);
skeleton.updateWorldTransform();
batch.end();
}
@Override
public void resize(int width, int height)
{
}
@Override
public void show()
{
batch = new SpriteBatch();
renderer = new ShapeRenderer();
atlas = new TextureAtlas(Gdx.files.internal("abc.atlas"));
SkeletonJson json = new SkeletonJson(atlas);
// set the scale of skeleton
json.setScale(0.3f);
SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("skeleton.json"));
skeleton = new Skeleton(skeletonData);
skeleton.setToSetupPose();
skeleton.setSkin("Carla");
// set the position of the skeleton to render( here middle)
skeleton.setPosition((Gdx.graphics.getWidth()/2)-(x/2),( Gdx.graphics.getHeight()/2)-(y/2));
//animation = skeletonData.findAnimation("KID-LEVEL 2 - Couch potato");
animation = skeletonData.findAnimation("LEVEL 91- Around a world");
//animation = skeletonData.findAnimation("KID-LEVEL 7 - Super Hero");
}
@Override
public void hide()
{
}
@Override
public void pause()
{
}
@Override
public void resume()
{
}
@Override
public void dispose()
{
batch.dispose();
}
}
答案 0 :(得分:0)
这是因为你正在手动管理时间表。
改为使用AnimationState
:
Skeleton skeleton = new Skeleton(skeletonData);
// sctruct for mix animations
AnimationStateData stateData = new AnimationStateData(skeletonData);
// and state
AnimationState state = new AnimationState(stateData);
在某些update
方法中(或render
,如果您希望在渲染时更新),请调用以下内容:
state.update(delta);
在实际的render
方法中:
// apply the state to skeleton
state.apply(skeleton);
// update transformations
skeleton.updateWorldTransform();
// draw then
render.draw(batch, skeleton);
因此,AnimationState
并非设计为仅用于管理增量,您可以使用它来播放和混合动画:
state.setAnimation(0, "LEVEL 91- Around a world", isLoop);
要更改动画速度,请使用setTimeScale
:
state.setTimeScale(0.5f); // set any time scale you want
此外,由于您使用new SkeletonRenderer()
方法调用render
,因此可能会遇到一些性能问题。要解决此问题,请将此代码移至构造函数。