О чем этот пример

Эмодзи стали неотъемлемой частью современного интерфейса, включая игры. Использование смайликов и пиктограмм в игровых текстах — отличный способ добавить эмоций, визуальных подсказок или просто создать стилизованный интерфейс. В Phaser работа с эмодзи через объект `Text` интуитивно понятна, но имеет свои особенности, связанные с кроссплатформенным отображением и кодированием. В этой статье мы разберем, как корректно отображать эмодзи и использовать юникод-последовательности для полного контроля над выводом символов.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        //  How this renders depends entirely on the browser, each does it a little differently
        //  Note that the fill color value is ignored for most emoji (as you'd expect)
        this.add.text(0, 60, '😜🍩🏄🕹💖🧟', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });
        this.add.text(0, 260, '🥪🤬🧠💩🤖👩‍💻', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });

        //  Here is how to embed an emoji using a unicode sequence instead:
        //  For more details see http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript
        this.add.text(0, 460, '\ud83d\ude03', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Базовое отображение эмодзи

Класс Text в Phaser позволяет отображать любые строки, включая эмодзи. Вы можете просто вставить нужные символы прямо в строку текста.

Однако важно помнить, что окончательный рендеринг эмодзи зависит от браузера и операционной системы пользователя. Шрифт, размер и даже детализация одного и того же смайлика могут незначительно отличаться.

this.add.text(0, 60, '😜🍩🏄🕹💖🧟', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });

В этом примере мы создаем текстовый объект в координатах (0, 60) и передаем ему строку, состоящую из последовательности эмодзи. Стиль текста задается объектом конфигурации, где fontFamily, fontSize и fill определяют внешний вид. Стоит отметить, что цвет заливки (fill) для большинства цветных эмодзи игнорируется браузером, так как они являются самостоятельными графическими символами.

Особенности рендеринга и цвета

При работе с эмодзи свойства стиля текста Phaser применяются, но их влияние ограничено возможностями браузера. Основное свойство, которое имеет эффект — это fontSize. Оно масштабирует весь текстовый блок, включая эмодзи.

this.add.text(0, 260, '🥪🤬🧠💩🤖👩‍💻', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });

Здесь мы создаем вторую строку эмодзи с таким же стилем. Обратите внимание, что, несмотря на указание красного цвета ('#ff0000'), эмодзи отобразятся в своих стандартных цветах. Свойство fill влияет только на те символы, которые браузер рисует с помощью шрифта (например, буквы). Для эмодзи, которые являются составными (например, 👩‍💻 — женщина-технолог), правильное отображение также зависит от поддержки последовательностей символов ZWJ (Zero Width Joiner) со стороны браузера.

Использование юникод-последовательностей

Иногда бывает необходимо вставить эмодзи не напрямую, а через его юникод-код. Это может быть полезно для динамической генерации строк или когда исходный код должен оставаться в кодировке ASCII.

Каждый эмодзи имеет свою юникод-последовательность. Например, смайлик 😃 соответствует последовательности \ud83d\ude03.

this.add.text(0, 460, '\ud83d\ude03', { fontFamily: 'Arial', fontSize: 96, fill: '#ff0000' });

В этом коде мы передаем в текстовый объект не сам символ, а его escape-последовательность в JavaScript. Браузер корректно интерпретирует эту последовательность и отображает эмодзи. Для поиска нужных юникод-кодов можно использовать специализированные ресурсы или таблицы символов. Такой подход дает больше контроля, особенно при работе с внешними данными или системами, где прямое использование многобайтовых символов невозможно.

Что попробовать дальше

Отображение эмодзи в Phaser — простая задача, которая сводится к использованию стандартного объекта Text. Ключевые моменты: помните о кроссплатформенных различиях в рендеринге, не рассчитывайте на изменение цвета через fill и используйте юникод-последовательности для программируемого управления символами. Для экспериментов попробуйте смешивать эмодзи с обычным текстом, анимировать их масштаб или положение, создавая динамичные интерфейсы, или загружать кастомные шрифты с эмодзи для уникального стиля вашей игры.