(LWJGL) Как загрузить анимированные GIF-файлы?

1

Я делаю своего рода 2D-платформер, и я хочу анимацию взорвать, когда когда-либо происходит какая-то определенная вещь. Я использую lwjgl для загрузки текстур, но когда я пытаюсь загрузить gif, он просто показывает первый кадр. Итак, есть ли способ сказать, чтобы показать следующий кадр или есть специальный способ, которым вы должны его загрузить?

Теги:
lwjgl
2d
tile
gif

1 ответ

0

вы можете попробовать создать буфер таким образом:

    // create buffers for animated gifs
    if (logo != null) {
    logoBuffer = createImage(logo.getWidth(null), logo.getHeight(null));
    // add image observer, it will notify when next animated gif frame is ready
    offscreen.getGraphics().drawImage(logo, 0, 0, this);
    // in case image is not animated fill image buffer once
    imageUpdate(logo, ImageObserver.FRAMEBITS, 0, 0, 0, 0);
    /**
     * When an animated gif frame is ready to be drawn the ImageObserver
     * will call this method.
     *
     * The Image frame is copied into a buffer, which is then drawn.
     * This is done to prevent image tearing on gif animations.
     */
    public boolean imageUpdate(Image img, int flag, int x, int y, int width, int height) {

        // finish with this ImageObserver
        if (state == STATE_DONE) return false;

        // if image frame is ready to be drawn and is currently not being painted
        if (flag == ImageObserver.FRAMEBITS && !painting) {
            Image buffer;

            // select which buffer to fill
            if (img == logo) buffer = logoBuffer;
            else buffer = progressbarBuffer;

            Graphics g = buffer.getGraphics();

            // clear background on buffer
            g.setColor(bgColor);
            g.fillRect(0, 0, buffer.getWidth(null), buffer.getHeight(null));

            // buffer background is cleared, so draw logo under progressbar
            if (img == progressbar && logo != null) {
                g.drawImage(logoBuffer, progressbar.getWidth(null)/2-logo.getWidth(null)/2,
                                        progressbar.getHeight(null)/2-logo.getHeight(null)/2, null);
            }

            g.drawImage(img, 0, 0, this);
            g.dispose();

            repaint();
        }

        return true;
    }

так как вы не опубликовали фрагмент, это может быть то, что вам нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню