Почему мое расширенное изображение libgdx () ничего не показывает мне на экране, когда стандартное изображение () работает должным образом?

#android #image #animation #kotlin #libgdx

#Android #изображение #Анимация #kotlin #libgdx

Вопрос:

Я пытаюсь расширить Image() класс libgdx, используя добавление Animation() функциональности. Наконец, анимация ничего не показывает на экране, но имена кадров изменены, как и ожидалось. В то же время стандартный libgdx Image() работает должным образом (я вижу его на экране в правильном положении вижу зеленую рамку отладки).

Как это исправить?

Это код Kotlin. Код короткий, и я не могу найти никаких плохих мест. Веб-поиск не показывает мне ничего хорошего для моего случая. И нет хороших (полностью рабочих) примеров, которые я могу перекодировать и т.д.

ссылка github на расширенный Image() класс с именем ImageAnimationTextureRegion.kt . Возможно, плохое место внутри этого класса, но я не уверен. https://github.com/3dformortals/demo-libgdx/blob/master/DemoAnimation/core/src/animated/ImageAnimationTextureRegion.kt

ссылка на github на анимированный класс human, шаблон для проигрывателя, с именем AnimatedHumanTextureRegion.kt
https://github.com/3dformortals/demo-libgdx/blob/master/DemoAnimation/core/src/animated/AnimatedHumanTextureRegion.kt

ссылка github на экран главного меню MainMenuScreen.kt с именем, который является Stage() родительским объектом экземпляра libgdx https://github.com/3dformortals/demo-libgdx/blob/master/DemoAnimation/core/src/com/kda/MainMenuScreen.kt

полная ссылка на проект на github, может быть выполнена с использованием intellij IDEA https://github.com/3dformortals/demo-libgdx/tree/master/DemoAnimation

Как я могу это исправить? Или, может быть, есть лучший способ сделать объект player, по крайней мере, со следующей функциональностью: — может быть добавлен и отображен на экране как дочерний элемент libgdx Stage (), использует stage.addActor(aniimage) etc — смещение x y — несколько анимаций (если возможно внутри объекта player), которые можно переключать внутри MainMenuScreen.kt метода рендеринга

Комментарии:

1. Я не знаю, почему это не работает, но я думаю, что вы могли бы сами нарисовать объект рисования в пакете, расширив Actor вместо Image . Если проблема возникает из изображения, она будет решена. Поскольку вам нужна только часть рисования (не режимы масштабирования), нет смысла использовать Image.

Ответ №1:

Я просмотрел ваш код и обнаружил ошибку.

Вы сказали, что стандартный Image класс работает, но ваш наследник этого не делает. Это происходит потому, что вы устанавливаете drawable их по-разному. Для Image вас используется конструктор, который автоматически устанавливает его размер, см.:

 /** One of constructors called from other */
    public Image (Drawable drawable, Scaling scaling, int align) {
        setDrawable(drawable);
        this.scaling = scaling;
        this.align = align;
        setSize(getPrefWidth(), getPrefHeight()); // see
    }
  

Но когда вы используете пустой конструктор и устанавливаете drawable вручную, размер остается нулевым.

Итак, решение состоит в том, чтобы установить его в ImageAnimationTextureRegion act() :

 override fun act(delta: Float) {
     if (..) {
        val frame = this.animation!!.getKeyFrame(time, true)
        drawable = TextureRegionDrawable(frame)
        setSize(prefWidth, prefHeight)
     }
  

Я видел часть вашего кода. Вы пишете на Kotlin, как на Java, в стандартной библиотеке есть много полезных методов, которые вы не используете. Вы используете null-safety неправильно.
Не пишите this ключевое слово везде, оно используется для других целей, читайте об этом.

Btw, There is nice book about Kotlin on Russian — «Котлин в действии».

Комментарии:

1. наконец, я решаю проблему, используя Drawables vs TextureRegions, с сохранением / восстановлением stripWhiteSpaceXY из TextureAtlas. Но код теперь сильно отличается. Дыра в том, что у меня нет this.pack() после setDrawable() изображения. Способ TextureRegion тоже работает, но пробелы нарушены. И setSize нет необходимости, потому что оно автоматически будет установлено позже, когда начнется анимация.