Исключение деления на ноль, вызванное кадром анимации (LIBGDX) - PullRequest
4 голосов
/ 04 июня 2019

По сути, я попытался реализовать анимацию на одном из экранов моей игры, используя 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 здесь: Анимация массива спрайтов, созданного из текстурного атласа - однако это не помогло. Я также прочитал страницу GitHub, включая информацию об анимациях и текстурных областях.

Вот строки кода, которые были использованы для реализации анимации

Настройка анимации

//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);

Анимация, вызываемая в функции render () из класса Screen

  @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();
    }

Error

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 ]

1 голос
/ 04 июня 2019

Ваш атлас не создан правильно для анимации, поэтому, когда вы вызываете animationAtlas.findRegions, он возвращает пустой массив.Когда вы вызываете animation.getKeyFrame(), он делится на ноль кадров анимации, отсюда и исключение.

Для работы animationAtlas.findRegions("sunglasses") вашим регионам в файле пакета потребуется одно и то же имя (солнцезащитные очки),не tile000, tile001, tile003 и т. д. И каждый из них должен иметь различный index под ними, не все имеют index из -1.

Попытка создать атлас текстуры вручную - это просто наказание за себя,Используйте TexturePacker.

0 голосов
/ 04 июня 2019

В приведенном ниже коде истекшее время равно 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.001f или 1f, все должно работать нормально.

...