我正在使用以下类在屏幕上呈现地图集:
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
答案 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或将其保留为假,则假定为假。