Atlas不按顺序渲染图像[libGDX]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Atlas不按顺序渲染图像[libGDX]相关的知识,希望对你有一定的参考价值。

我正在使用以下类在屏幕上呈现图集:

public class AnimationDemo implements ApplicationListener {
    private SpriteBatch batch;
    private TextureAtlas textureAtlas;
    private Animation animation;
    private float elapsedTime = 0;

    @Override
    public void create() {
        batch = new SpriteBatch();

        textureAtlas = new TextureAtlas(Gdx.files.internal("data/packOne.atlas"));
        animation = new Animation(1 / 1f, textureAtlas.getRegions());
    }

    @Override
    public void dispose() {
        batch.dispose();
        textureAtlas.dispose();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.begin();
        //sprite.draw(batch);
        elapsedTime += Gdx.graphics.getDeltaTime();
        batch.draw(animation.getKeyFrame(elapsedTime, true), 0, 0);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

我是libGDX的初学者,但是在上面的程序中,随着随机图像的出现,我的图像不会按顺序呈现。我之前使用的是同样的。 atlas文件,它工作正常:

public class MyGdxGame implements ApplicationListener {
    private SpriteBatch batch;
    private TextureAtlas textureAtlas;
    private Sprite sprite;
    private int currentFrame = 1;
    private String currentAtlasKey = new String("0001");

    @Override
    public void create() {
        batch = new SpriteBatch();

        textureAtlas = new TextureAtlas(Gdx.files.internal("data/packOne.atlas"));
        TextureAtlas.AtlasRegion region = textureAtlas.findRegion("0001");
        sprite = new Sprite(region);


        sprite.setPosition(Gdx.graphics.getWidth() / 2 - sprite.getWidth() / 2, Gdx.graphics.getHeight() / 2 - sprite.getHeight() / 2);
        sprite.scale(4.5f);
        Timer.schedule(new Timer.Task() {
            @Override
            public void run() {
                currentFrame++;
                if (currentFrame > 393)
                    currentFrame = 1;

                // ATTENTION! String.format() doesnt work under GWT for god knows why...
                currentAtlasKey = String.format("%04d", currentFrame);
                sprite.setRegion(textureAtlas.findRegion(currentAtlasKey));
            }
        }
                , 0, 1 / 30.0f);
    }

    @Override
    public void dispose() {
        batch.dispose();
        textureAtlas.dispose();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.begin();
        sprite.draw(batch);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

关于这里可能出错的任何提示?

我也试图用Screen Viewport调整我的程序任何标题,如何实现这一点也是受欢迎的。

编辑:.atlas文件位于here

答案

您的地图集文件未订购。如果您拨打以下代码,将会订购。

regions.sort(new Comparator<AtlasRegion>() {
            @Override
            public int compare(AtlasRegion o1, AtlasRegion o2) {
                return Integer.parseInt(o1.name) > Integer.parseInt(o2.name) ? 1 : -1;
            }
        });

但我仍在检查为什么你的地图集地区没有订购。

另一答案

你应该按字母顺序创建数组,而不是使用textureAtlas.getRegions(),它只是给你一个没有关心顺序的数组。

具有区域名称为:region1,region2等的地图集的示例将是:

    AtlasRegion[] frames = new AtlasRegion[framesCount];

    for(int i = 0; i < framesCount; i++)
    {
        frames[i] = atlas.findRegion("region" + i);
    }

所以你可以根据你的地区名称进行调整。

如果你想从textureAtlas获得所有帧,你也可以这样做:

    Array<String> names = new Array<String>();

    for(AtlasRegion region : textureAtlas.getRegions())
    {
        names.add( region.name );
    }

    names.sort();

    Array<AtlasRegion> frames = new Array<AtlasRegion>();

    for(String s : names)
    {
        frames.add( textureAtlas.findRegion(s) );
    }

然后在获取帧数组后,只需创建动画对象:

    animation = new Animation(1/1f, frames.items); //or just frames depending on which type frames is
另一答案

只要您遵循此处列出的命名方案https://github.com/libgdx/libgdx/wiki/Texture-packer#image-indexes,TexturePacker将为您索引图像。

所以你的框架会被命名为

anim1_001.png
anim1_002.png
...
anim1_100.png

而单独的动画就是这样

anim2_001.png
....
anim2_100.png

编辑:

此外,您可以获得仅与某些动画相关的区域。而不是

animation = new Animation(1 / 1f, textureAtlas.getRegions());

你可以使用(是的它是findRegions()而不是findRegion()):

animation1 = new Animation(1 / 1f, textureAtlas.findRegions("anim1"));
animation2 = new Animation(1 / 1f, textureAtlas.findRegions("anim2"));

Aaditi:

如果您正在使用舞台,则可以很容易地实现屏幕视口。我是这样做的,(stage是一个字段,这一步是在show / create方法中):

stage = new Stage(new ScreenViewport());

然后在resize方法中:

stage.getViewport().update(width, height, true);

没有舞台,它只会稍微复杂一些

camera = new WhateverCamera();
viewport = new ScreenViewport(camera);

然后在resize方法中:

viewport.update(width, height, true);

使用你想要的任何相机,WhateverCamera是占位符,可以是OrthographicCamera或PerspectiveCamera。最后一个参数true使摄像机居中,如果你不想这样做,将它设置为假或将其保留,则假设为假。

以上是关于Atlas不按顺序渲染图像[libGDX]的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx/Opengl alpha blending(结果 alpha 被源 alpha 替换)

Libgdx 渲染方法

c_cpp Atlas300代码片段

渲染2D块状地图 - LibGDX

libgdx - 如何在舞台中添加背景图片?

具有多个小部件的 LibGDX 和 ScrollPane