Libgdx时滞和delta值问题(与Spine一起运行Skeleton动画)

时间:2014-07-03 12:50:35

标签: android libgdx

我使用Libgdx框架和Spine一起使用Atlas进行Skeleton动画并​​导出Json文件。在文件中有许多动画。我能够从json文件加载动画。但有两个问题:

  1. 动画开始时滞后:动画开始前有3-4秒的延迟。我看到一个黑屏,然后动画就可以了。

  2. Delta - 我在delta时间方面遇到了一些问题。只有一些动画从默认增量值运行,但是如果我更改(增加或减少增量值),则不同的动画会给出不同的结果。

  3. 不明白该怎么办?我已经在互联网上彻底搜索过,但还没有找到解决方案。

    我在下面发布我的代码:

    这是我的主要课程

    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();
        }
    
    }
    

1 个答案:

答案 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,因此可能会遇到一些性能问题。要解决此问题,请将此代码移至构造函数。

相关问题