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]的主要内容,如果未能解决你的问题,请参考以下文章