Ноя
24

AndEngine. Работа с текстом

logo_100

Расскажу о работе с текстом.

В AndEngine есть два класса для вывода текста на экран:

  • Text — подходит для статичных надписей;
  • ChangeableText — используйте его, если текст будет меняться по ходу игры

Перед началом работы с текстом нужно загрузить в память шрифт. AndEngine опять это делает через Атласы.

font

Причём, если хотите писать шрифтом разного размера, то придётся для каждого размера создавать свой Атлас и загружать в него шрифт нужного размера.

Итак, выбираете понравившийся шрифт (файл .ttf), кидаете его в папку «assets/fonts» и пишете такой код (во время загрузки ресурсов):

//Загружаю шрифт BosaNova размером 22 пикселя
BitmapTextureAtlas font_BosaNova22_Texture = new BitmapTextureAtlas(512, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
Font font_BosaNova22 = FontFactory.createFromAsset(font_BosaNova22_Texture, this, "fonts/bosanova.ttf", 22, true, Color.WHITE);

//Загружаю шрифт BosaNova размером 54 пикселя
BitmapTextureAtlas font_BosaNova54_Texture = new BitmapTextureAtlas(512, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
Font font_BosaNova54 = FontFactory.createFromAsset(font_BosaNova54_Texture, this, "fonts/bosanova.ttf", 54, true, Color.WHITE);

this.mEngine.getTextureManager().loadTextures(font_BosaNova22_Texture, font_BosaNova54_Texture );
this.mEngine.getFontManager().loadFonts(font_BosaNova22, font_BosaNova54);

Размер Атласа подбирается опытным путём, чтобы все буквы шрифта в него влезли и при этом оставалось как можно меньше пустого места (экономим память).

Параметры метода FontFactory.createFromAsset:

FontFactory.createFromAsset(ITexture pTexture,
Context pContext,
String pAssetPath,
float pSize,
boolean pAntiAlias,
int pColor)

Если в будущем хотите изменять цвет текста, то всегда загружайте шрифт в БЕЛОМ цвете.

 

Итак, шрифт загрузили. Теперь создадим надпись и выведем на экран:

Text _text1 = new Text(100, 100, font_BosaNova22, "Hello, AndEngine!\n\nGoodbye.");
_text1.setColor(127/255f, 127/255f, 255/255f); //Цвет текста будет сиреневый
_myScene.attachChild(_text1);

Цвет задаётся в формате RGB в пределах от 0f до 1f. Для наглядности просто разделите значение от 0 до 255 на 255.

 

А теперь создадим Изменяемый Текст. При его создании важно указать длину текста в символах — это делается просто указанием строки (String) нужной длины:

ChangeableText _text2 = new ChangeableText(100, 300, font_BosaNova54, "999");
_text2.setColor(0, 1, 0); //Цвет текста будет зелёный
_myScene.attachChild(_text2);

Строка «999» (три символа в ней) указывает, что содержимое надписи не будет превышать 3-х символов.

Чтобы изменить надпись, пишем:

/**
 * Выводим в надписи кол-во монеток
 */
int _Coins = 123;
_text2.setText(String.valueOf(_Coins));

Ничего сложного вроде нет.

НЕБОЛЬШАЯ ПОДСКАЗКА: Наверняка в процессе создания игры вы с этим столкнётесь — при установке нового содержимого Текста происходит небольшая, но неприятная задержка в игре (игра Например, при установке нового значения Очков в игре.

Это происходит из-за того, что движок каждый раз выделяет память под отрисовку символа, который ещё не встречался в тексте. Допустим, изначально вы создали Текст со значением «0». Далее, в процессе игры устанавливаете новое значение «10». В этом случае произойдёт задержка из-за создания в памяти нового буффера для символа «1». Выход есть: при создании Текста указывайте все символы, которые будут использоваться в нём:

ChangeableText _Scoretext = new ChangeableText(100, 300, font_BosaNova54, "0123456789");

Другое решение — использовать свой класс. Смотрите здесь->

Работа с шрифтами

Я очень люблю оптимизировать и сокращать размеры файлов. Ведь это влияет на размер будущей игры и на использование памяти.

Для PNG файлов я пользуюсь программой PngOptimizer.

С шрифтами же я работаю в программе High-Logic Font Creator. Она позволяет удалять символы в шрифте, менять коды символов, изменять начертания символов и многое другое.

Допустим я выбрал шрифт для игры BosaNovaCaps. Причём в игре я буду использовать его только для показа цифр. Зачем мне тогда все остальные символы? Я могу их смело удалить из шрифта.

Размер файла шрифта — 44 404 байта. Открываю шрифт в Font Creator'e:

bosanova_before

Удаляю все символы, кроме цифр и слэша:

bosanova_after

Сохраняю и получаю размер файла — 3 552 байта. Теперь и Атлас можно будет использовать поменьше, и размер игры уменьшится.




12 комментариев к записи “AndEngine. Работа с текстом”

  • очень интересная информация... мне всегда интересно почитать

    КАК делают игры ))

  • Ну просто большущее СПАСИБО!!!))))

    Два дня игра тормозит при обновлении очков, не знал что делать, это то что нужно)

  • «Ничего сложного вроде нет.»

    Вот уже несколько дней как застопорился на шрифтах. Они тупо не работают, стандартные примеры TextExample и CustomFontExample, не работают. Если в загрузчике ресурсов не прописывать: this.getFontManager ().loadFont (мой Font) всё отлично, но естественно никаких шрифтов мне не видать, иначе вылаетает ошибка и всё, ничего не поделать. В чем может быть проблема?

  • Виталий — аналогичная проблема. Шрифты загружаю, как в данном уроке — но в самом начале загрузки приложения ошибка и вылетает даже не загрузившись. Если оставить весь код, кроме getFontManager ().loadFonr (myTestFont); то вроде все подгружает. Но тут шрифтов уже нет(

    public BitmapTextureAtlas fTextureAtlasTahoma;

    public Font fTahoma;

    @Override

    public void onLoadResources () {

    fTextureAtlasTahoma = new BitmapTextureAtlas (1024, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);

    fTahoma = FontFactory.createFromAsset (fTextureAtlasTahoma, this, «gfx/fonts/tahoma.ttf», 32, true, Color.WHITE);

    getTextureManager ().loadTextures (fTextureAtlasTahoma);

    getFontManager ().loadFonts (fTahoma); // Если убрать эту строку, то //ошибка нет, но без этой строки нельзя

    }

    • fTahoma.load ();

      • эх, в классе Font нет такого метода или что-то похожего. Тут что-то другое. Самое удивительное, раньше текст работал, вернулся опять к тексту когда он понадобился — и такая досадная ситуация.

      • методом проб и ошибок решил проблему.

        Нужно писать не

        getFontManager ().loadFonts (fTahoma);

        а:

        mEngine.getFontManager ().loadFonts (fTahoma);

        хотя для getTextureManager я mEngine впереди никогда не вставлял и все отлично работало

  • как правильно удалять символы из шрифта? удаляю любой символ, жму в проге Export as true type сохраняю как и было в ttf но все символы становятся квадратами, даже те которые не удалял.

    • Не надо делать export. Просто Save

      • а если я нажимаю save, то сохоаняется не сам файл шрифта а проект в формате fcp (font creator project) , юзаю версию 7.5.

        Чтоб на выходе получить ttf файл, для этого нашел только кнопку Export as ttf

      • А всё, разобрался. версия FC 6.5 сохраняет нормально. а вот в 7.5 квадратами, странно...может шрифт такой,в нём было 1000 с чем то иероглифов, удалил их и стал весить файл не 1.5Мб а 50 кб. спасибо =)

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