Android Libgdx时间延迟和增量值问题(与脊椎一起使用以运行骨架动画)

Android Libgdx时间延迟和增量值问题(与脊椎一起使用以运行骨架动画),android,libgdx,Android,Libgdx,我使用Libgdx框架和Spine,使用Atlas和导出的Json文件制作骨架动画。文件中有许多动画。我能够从json文件加载动画。但有两个问题: 动画开始时的延迟:动画开始前有3-4秒的延迟。我看到一个黑屏,然后动画开始工作 增量-我对增量时间有一些问题。只有一些动画从默认增量值运行,但是如果我更改(增量或减少增量值),不同的动画会给出不同的结果 不知道该怎么办?我已经在网上彻底搜索过了,但还没有找到解决办法 我在下面发布我的代码: 这是我的主课 public class AndroidLau

我使用Libgdx框架和Spine,使用Atlas和导出的Json文件制作骨架动画。文件中有许多动画。我能够从json文件加载动画。但有两个问题:

  • 动画开始时的延迟:动画开始前有3-4秒的延迟。我看到一个黑屏,然后动画开始工作

  • 增量-我对增量时间有一些问题。只有一些动画从默认增量值运行,但是如果我更改(增量或减少增量值),不同的动画会给出不同的结果

  • 不知道该怎么办?我已经在网上彻底搜索过了,但还没有找到解决办法

    我在下面发布我的代码:

    这是我的主课

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

    这是因为您正在手动管理时间线

    改用
    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);
    
    在实际的
    渲染方法中:

    // 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
    

    另外,由于在
    render
    方法中调用
    newskeletonrenderer()
    ,您可能会遇到一些性能问题。要解决这个问题,请将此代码移到构造函数。

    我不确定这是否有帮助,但这就是我在LibGDX中跟踪时间的方式:我的场景非常不同。。我有一些预先加载的json动画。。。感谢您的评论我还没有将Spine与libgdx一起使用,但是从Animation类的文档来看,您似乎使用了错误的一行:
    Animation.apply(skeleton,delta,time,false,null)。第二个参数应该是最后传入的时间,而不是增量时间,因此使用
    animation.apply(skeleton,time delta,time,false,null)改为。@Tenfour04。。我试过你的方法。。但我还是得到了同样的结果。。开始时出现延迟和不正确的动画。谢谢你的建议。