Ноя
19

AndEngine. Анимируем спрайты

logo_100

В этой части расскажу об анимированных спрайтах и модификаторах.

Для создания анимированных спрайтов или спрайтов, состоящих из набора кадров, нужно все кадры предварительно подготовить и сохранить в один файл.

Все кадры должны быть одинакового размера. AndEngine читает кадры слева направо и сверху вниз. Вот как можно расположить кадры в спрайте:

anim_var

Старайтесь максимально компактно и полно заполнять Атласы, дабы экономить память.

Для анимированного / тайлового спрайта нужно сначала загрузить текстуру (файл с изображением):

TiledTextureRegion _TiledSprite_TR =
BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(
Texture1, this, "animated_sprite.png", 0, 0, 4, 1);

Два последних параметра — размер текстуры в кадрах (тайлах). В данном примере размер 4 кадра по горизонтали и 1 по вертикали — т.е. это спрайт из Варианта 1 (см. картинку выше).

Теперь создадим анимированный спрайт:

AnimatedSprite _AnimSprite = new AnimatedSprite(100, 100, _TiledSprite_TR);

Чтобы запустить анимацию, есть несколько методов. Можно указать длительность каждого кадра, зацикленность, указать список кадров для анимации (в любом порядке).

Добавим простую зацикленную анимацию всех кадров с одинаковой длительностью каждого кадра в 100 мс:

_AnimSprite.animate(100);

Готово. Теперь анимация будет бесконечно проигрываться.

Чтобы её остановить, нужно вызвать метод:

_AnimSprite.stopAnimation();

или

_AnimSprite.stopAnimation(2);

Метод stopAnimation (2) останавливает анимацию и показывает кадр номер 2 (отсчёт кадров всегда с 0).

А вот пример сложной анимации:

_AnimSprite.animate(new long[] {100, 200, 100, 50}, new int[] {3, 1, 2, 0}, -1);
  • Первый параметр — массив с длительностью отдельных кадров (в мс);
  • Второй параметр — какие кадры и в каком порядке играть;
  • Третий параметр — сколько раз играть анимацию. Значение -1 — играть бесконечно.

Модификаторы

Модификаторы (Modifiers) — аналог твинов на Flash. Модификаторы — очень полезная вещь, упрощающая жизнь и дающая возможность добавлять эффекты спрайтам.

Вот какие модификаторы предоставлет AndEngine:

  • Меняющие прозрачность;
  • Меняющие цвет;
  • Меняющие положение (x и y), в том числе изменение по заданным точкам (пути);
  • Меняющие угол (вращение спрайта);
  • Меняющие масштаб;

Вот пример запуска модификатора, изменяющего за 1 секунду прозрачность от 1 до 0:

_AnimSprite.registerEntityModifier(new AlphaModifier(1, 1, 0));

При добавлении модификатора к Entity (Сущности), он попадает в список EntityModifierList. В каждом такте движка этот список «прочёсывается» и все модификаторы в нём выполняют свою работу. Как только модификатор отработает заданное ему время, он из списка удаляется.

Однако, модификатору можно указать, нужно удалять его из списка модификаторов после завершения или нет. Для этого используется метод setRemoveWhenFinished:

AlphaModifier _AlphaModifier = new AlphaModifier(1, 1, 0);
_AlphaModifier.setRemoveWhenFinished(false);

Это можно использовать для экономии памяти и предотвращения запуска Сборщика мусора (расскажу об этом более подробно в следующих частях), а также для повторного использования модификатора.

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

_AlphaModifier.reset();

Кроме этого есть модификаторы для модификаторов:

  • LoopEntityModifier — зацикливает выполнение модификаторов;
  • ParallelEntityModifier — выполняет несколько модификаторов одновременно;
  • SequenceEntityModifier — выполняет модификаторы последовательно, в порядке их добавления;

И ещё. Модификаторам можно указывать «стиль» их выполнения — так называемые Ease-функции. Они должны быть вам знакомы из Flash: например, EaseBackOut или EaseElasticInOut.

Как использовать:

AlphaModifier _AlphaModifier = new AlphaModifier(1, 1, 0, EaseBounceOut.getInstance());

Примеры можно посмотреть в Пример работы движка для Android.




23 коммент. к записи “AndEngine. Анимируем спрайты”

  • ЗдОрово. Даже рисовальщику полезно — чтобы понимать, чего от него хочет программист и почему 🙂

    • Писал для программистов — пригодилось рисовальщику 🙂

  • как сделать правильную раскадровку? экспортирует тот же флэш анимацию в данный формат? или придется руками собирать её в фотошопе?

    • Я собираю во флеше, даже если графика растровая. Делаю раскадровку в одном мувиклипе, а потом выписываю в PNG — но не каждый кадр отдельно, а весь мувиклип. Размер спрайтшита задаю размерами сцены. Посмотри пример в посте про Минди

  • а вот у меня такая беда: есть много анимированных спрайтов у которых один и тот же TiledTextureRegion. так вот когда я включаю или останавливаю анимацию у одного конкретного спрайта она включается/выключается у всех. А мне надо чтобы у одного. Как это победить?

    • Добавить deepCopy () к TextureRegion при создании спрайта: new TiledSprite (0,0, _sprite_TR.deepCopy ());

      • new TiledSprite (0,0, _sprite_TR.deepCopy ());

        В случае с AnimatedSprite почему-то не срабатывает.

        • Что именно не срабатывает?

          • Создаю в цикле 20 анимированных спрайтов в случайных местах сцены, включаю анимацию и указываю случайный текущий кадр. Применяю deepCopy (), конечно.

            Все спрайты движутся синхронно, показывают одно и то же.

            Если заменить у создаваемых объектов AnimatedSprite на TiledSprite, видно, что у них разные кадры (естесственно, они статичны, не анимированы).

          • При запуске анимации текущий установленный кадр не играет никакой роли!!! Именно в анимации задаются номера и последовательность проигрываемых кадров.

        • чтобы показать конкретный кадр надо вызвать метод .stopAnimation (номер кадра)

          • Хрм грм...к примеру, хочу я сделать дискотеку пляшущих вразнобой человечков из одной текстуры с анимацией. Если я просто создам AnimatedSprite'ы, то они будут двигаться синхронно. Если напишу .stopAnimation (номер кадра), то они замрут как статуи. Что написать чтобы они дрыгались как самостоятельные индивидуумы, а не толпа конформистов? 🙂

          • Подробнее изучи метод animate () и ты увидишь, как ему передать нужные тебе последовательности кадров

          • Всё, спасибо, прозрел: надо вместо animate () использовать animate (параметры).

            Просто я зациклился на том, что все спрайты с фаерболами (которые, по логике должны быть хаотичными сгустками огня) у меня всё время отображают один и тот же кадр, и я винил в этом несработавший deepCopy ().

          • Наконец-то! Рад за тебя 🙂

  • А как добавить анимацию к сцене? А то у меня при вылетает ошибка. Делаю так:

    TiledTextureRegion _TiledSprite_TR =

    BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset (

    Texture1, this, «animated_sprite.png», 0, 0, 4, 1);

    AnimatedSprite _AnimSprite = new AnimatedSprite (100, 100, _TiledSprite_TR);

    _AnimSprite.animate (100);

    myscene.attachChild (_AnimSprite);

    • Во-первых, какая ошибка? Во-вторых, ты грузишь текстуру в память-то? Если нет, то смотри пример (их там на все случаи есть)

  • Здравствуйте, я посмотрел примеры , нагуглиг исходники...и в примере про физику игр я наткнулся на box2d в импорте . Чтобы создать реальную физику , мне нужно загружать этот движок тоже?, если да то как?

    • Нужно загрузить расширение AndEngineBox2DExtension — не помню точно как называется

  • Привет еще раз 🙂

    есть такая проблема... уже доделали игру, но есть одно но, как обычно)

    короче через раз по краям спрайтов прорисовываются непонятные линии.

    В чём может быть проблема и есть ли её решение?

    • Зазор в пиксель я полагаю в текстурах есть. Попробуй округлять координаты спрайтов до целых чисел. Или может у атласа задан режим NEAREST?

  • Здравствуйте.

    У меня есть анимированный спрайт, я двигаю его, при достижении правой границы экрана проигрываю анимацию и мне нужно сделать действие(показать меню) после того как анимация пройдёт.

    Есть ли какое-нибудь событие на окончание анимации или подскажите как лучше это реализовать?

    Заранее спасибо)

    • Конечно событие есть. Изучайте исходники и все методы. Подскажу лишь, что событие — это слушатель IAnimationListener, который дописывается в методе animate

Прокомментировать



ЗАДАЙ СВОЙ ВОПРОС