动画关键帧(LIBGDX)引起的零除异常

时间:2019-06-04 16:58:46

标签: java animation libgdx textures

基本上,我尝试使用TextureAtlas并使用.findRegions()在游戏的一个屏幕上实现动画,以用于动画对象。

我尝试将文件重命名为其各自的索引(以及更新.pack文件夹)

Sample Pack Folder:

sunglasses_1.png
format: RGBA8888
filter: Nearest,Nearest
repeat: none
tile000
  rotate: false
  xy: 1, 1
  size: 600, 600
  orig: 600, 600
  offset: 0, 0
  index: -1
...and so on until sunglasses_35.png

我在这里也了解了SAO中的同一问题:Animating the sprite array created from texture atlas-但是它没有帮助。我还阅读了GitHub页面,其中包含有关Animations和TextureRegions的信息。

以下是用于实现动画的代码行

动画设置

//animation setup with batch
        batch = new SpriteBatch();
        animationAtlas = new TextureAtlas(Gdx.files.internal("sunglasses.pack"));
        animation = new Animation<>(0.13f, animationAtlas.findRegions("sunglasses"), Animation.PlayMode.LOOP);

从Screen类的render()函数中调用的动画

  @Override
    public void render(float delta) {
        float elapsedTime = 0f;
        elapsedTime += Gdx.graphics.getDeltaTime();

        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.draw();

        batch.begin();
        batch.draw(animation.getKeyFrame(elapsedTime), 100, 100);
        batch.end();
    }

错误

Exception in thread "LWJGL Application" java.lang.ArithmeticException: / by zero
    at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrameIndex(Animation.java:138)
    at com.badlogic.gdx.graphics.g2d.Animation.getKeyFrame(Animation.java:122)
    at com.tantei.game.Screens.MainMenu.render(MainMenu.java:104)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.tantei.game.Game.render(Game.java:21)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)

感谢您的帮助!

[EDIT] animation.getKeyFrames()返回的大小为0-因此是例外。我仍然不明白为什么它没有元素

2 个答案:

答案 0 :(得分:1)

您没有为动画正确创建地图集,因此,调用animationAtlas.findRegions时,它会返回一个空数组。调用animation.getKeyFrame()时,它被动画的零帧所分割,因此是一个例外。

要使animationAtlas.findRegions("sunglasses")工作,打包文件中的每个区域都需要完全相同的名称(太阳镜),而不是tile000,tile001,tile003等。而且每个区域都应具有不同的index在它们下面,并非所有人的index都为-1。

尝试手动创建纹理图集只会惩罚自己。使用TexturePacker。

答案 1 :(得分:0)

在下面的代码中,经过的时间是0f,这会导致错误。

  @Override
    public void render(float delta) {
        float elapsedTime = 0f;
        elapsedTime += Gdx.graphics.getDeltaTime();

        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.draw();

        batch.begin();
        batch.draw(animation.getKeyFrame(elapsedTime), 100, 100); -- here is the errro
        batch.end();
    }

如堆栈跟踪所示,内部方法getKeyFrame中可能存在问题。将elapsedTime更改为0.001f1f,它应该可以正常工作。