Почему мой расширенный Imageg (libgdx) ничего не показывает на экране, когда стандартный Image () работает как положено? - PullRequest
0 голосов
/ 21 апреля 2019

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

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

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

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

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

github ссылка на экран главного меню с именем MainMenuScreen.kt, который является libgdx Stage() экземпляром родительского объекта 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

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

1 Ответ

0 голосов
/ 22 апреля 2019

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

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

Кстати, есть хорошая книга о Kotlin на русском языке - "Котлин в действии".

...