Java.lang.IllegalArgumentException: емкость <0: (-1611268096 <0)

Ошибка:


java.lang.IllegalArgumentException: capacity < 0: (-1611268096 < 0)
    at java.base/java.nio.Buffer.createCapacityException(Buffer.java:279)
    at java.base/java.nio.Buffer.<init>(Buffer.java:242)
    at java.base/java.nio.ByteBuffer.<init>(ByteBuffer.java:288)
    at java.base/java.nio.ByteBuffer.<init>(ByteBuffer.java:296)
    at java.base/java.nio.MappedByteBuffer.<init>(MappedByteBuffer.java:112)
    at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:170)
    at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.newPixmap(Native Method)
    at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:137)
    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137)
    at com.tds.game.GifDecoder.getAnimation(GifDecoder.java:697)
    at com.tds.game.GifDecoder.loadGIFAnimation(GifDecoder.java:731)
    at com.tds.game.AfterBossScreen.show(AfterBossScreen.java:26)
    at com.badlogic.gdx.Game.setScreen(Game.java:63)
    at com.tds.game.updateAndDrawBulletsAndBadBoys.updateAndDrawBadBoys(updateAndDrawBulletsAndBadBoys.java:179)
    at com.tds.game.MainGameScreen.render(MainGameScreen.java:157)
    at com.badlogic.gdx.Game.render(Game.java:48)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:387)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:193)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:167)
    at com.tds.game.DesktopLauncher.main(DesktopLauncher.java:14)

Я пробовал использовать для расшифровки другие библиотеки, но не получилось. Я также создал класс gifdecoder.

Измененный:

Размер гифки 2560х1440 пикселей, не знаю, зачем вам эта информация.

Гифка не повреждена, и вы об этом спрашивали:

Код AfterBossScreen.java:26:

@Override
public void show() {
    System.out.println("AfterBossScreen show() called");
    font = new BitmapFont();
    batch = new SpriteBatch();

    // Загрузка GIF
    try {
        animation = GifDecoder.loadGIFAnimation(Animation.PlayMode.LOOP,Gdx.files.internal("begin.gif").read()); // stroke 26 
        System.out.println("AfterBossScreen: Animation loaded");
    } catch (Exception e) {
        System.out.println("Error loading GIF: " + e.getMessage());
        e.printStackTrace();
    }

    batch.begin();
    font.draw(batch, "Loading...", 100, 100);
    batch.end();
}

GifDecoder.java:697:

public Animation<TextureRegion> getAnimation(PlayMode playMode) {
        int nrFrames = getFrameCount();
        Pixmap frame = getFrame(0);
        int width = frame.getWidth();
        int height = frame.getHeight();
        int vzones = (int)Math.sqrt((double)nrFrames);
        int hzones = vzones;

        while(vzones * hzones < nrFrames) vzones++;

        int v, h;

        Pixmap target = new Pixmap(width * hzones, height * vzones, Pixmap.Format.RGBA8888); // stroke 697

        for(h = 0; h < hzones; h++) {
            for(v = 0; v < vzones; v++) {
                int frameID = v + h * vzones;
                if (frameID < nrFrames) {
                    frame = getFrame(frameID);
                    target.drawPixmap(frame, h * width, v * height);
                }
            }
        }

        Texture texture = new Texture(target);
        Array<TextureRegion> texReg = new Array<TextureRegion>();

        for(h = 0; h < hzones; h++) {
            for(v = 0; v < vzones; v++) {
                int frameID = v + h * vzones;
                if (frameID < nrFrames) {
                    TextureRegion tr = new TextureRegion(texture, h * width, v * height, width, height);
                    texReg.add(tr);
                }
            }
        }
        float frameDuration = (float)getDelay(0);
        frameDuration /= 1000; // convert milliseconds into seconds
        Animation<TextureRegion> result = new Animation<TextureRegion>(frameDuration, texReg, playMode);

        return result;
    }

updateAndDrawBulletsAndBadBoys.java:179:

if (boss != null){
    if (boss.x <= 16){
        System.out.println("}-- Boss is in the end");
        game.setScreen(new AfterBossScreen()); // stroke 179
        return;
    }
}

Можете ли вы добавить System.out.println("width: " + width + ", hzones: " + hzones + ", height: " + height + ", vzones: " + vzones + ", Format: " + Pixmap.Format .RGBA8888 ); перед целью Pixmap = ... и обновить вопрос с выводом?

John Williams 10.07.2024 15:42

"Я пытался использовать для расшифровки другие библиотеки" вопрос не связан с криптографией. Вы имели в виду декодирование?

aled 10.07.2024 16:29

@JohnWilliams Конечно! Результат: ширина: 2560, горизонтальные зоны: 13, высота: 1440, горизонтальные зоны: 14, формат: RGBA8888.

Prostoblodi 10.07.2024 17:23

@aled, да, я имел в виду декодирование

Prostoblodi 10.07.2024 17:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, у вас есть числовое переполнение:

Если вы посмотрите исходный код com.badlogic.gdx.graphics.Pixmap.java, то конструктор будет:

/** Creates a new Pixmap instance with the given width, height and format.
 * @param width the width in pixels
 * @param height the height in pixels
 * @param format the {@link Format} */
public Pixmap (int width, int height, Format format) {

Ваш код умножает ширину и высоту на hzones и vzones, что приводит к значениям 33 280 и 20 160 для ширины и высоты аргументов соответственно. Pixmap.Format.RGBA8888 имеет размер 4 байта. Это емкость ByteBuffer 2 683 699 200 байт (33 280 X 20 160 X 4).

Конструктор java.nio.ByteBuffer принимает аргумент ограничения (т.е. емкости) в качестве int. int переполняется выше 2 147 483 647, что ниже 2 683 699,20, поэтому по моим расчетам оно округляется до -1 611 268 096. (-2147483648 + 2683699,20 - 2147483647)

В любом случае причиной исключения является тот факт, что вы умножаете ширину и высоту на hzones и vzones.

Другие вопросы по теме