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

时间:2015-09-30 04:19:36

标签: java android 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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 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

答案 2 :(得分:1)

只要您遵循此处列出的命名方案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"));

EDIT2:

如果您正在使用舞台,则可以很容易地实现屏幕视口。我这样做,(舞台是一个字段,这一步是在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使摄像机居中,如果您不想这样做将其设置为false或将其保留为假,则假定为假。