#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
нет необходимости, потому что оно автоматически будет установлено позже, когда начнется анимация.