1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/redw1234567-phaser3_wx

Клонировать/Скачать
CHANGELOG.md 340 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.06.2025 20:41 544fcf6

Журнал изменений

Версия 3.13.0 - Yuuki - разработка

Новые возможности

Обновления

  • Графический буфер рендерера теперь автоматически вызывает beginPath на целевом контексте перед обработкой стека команд. Это приводит к очистке любых подпутей, которые могли сохраниться в стеке из предыдущих объектов Graphics или кадров. Это делает его более соответствующим ожиданиям WebGL при вызове Graphics.clear.

Исправленные ошибки

  • Метод TileSprite.setTileScale ошибочно устанавливал позицию плитки вместо масштаба. Прямое использование свойств работало корректно, но метод был некорректен (спасибо @alexeymolchan)
  • Вызов Text.setStyle приводил к исчезновению текста, если не было указано свойство resolution в конфигурационном объекте стиля. Теперь вызов setStyle изменяет только указанные свойства, оставляя предыдущие без изменений. Исправление #4011 (спасибо @okcompewter)
  • В Matter.js, если свойство render.visible объекта было установлено на false, то все последующие отладочные объекты не рисовались. Теперь рендер пропускает только объекты с скрытыми отладочными графическими элементами (спасибо @jf908)

Примеры, документация и TypeScript

Благодарю следующих участников за помощь в создании примеров, документации и определений TypeScript для Phaser 3, либо отчетами об ошибках, их исправлением или авторством документации:## Версия 3.12.0 - Silica - 4 сентября 2018

Обновления FlatTintPipeline

В версии 3.11 я полностью переработал TextureTintPipeline, WebGL-пакет, используемый для рендера всех объектов на основе текстур, таких как спрайты. В этой версии я сделал то же самое для FlatTintPipeline. Этот пакет использовался исключительно объектом Graphics для рисования заполненных и заливаемых примитивов в WebGL. Также он использовался классами, такими как камера, для рисования их цветных фонов и эффектов пульсации и затухания.Когда я внимательно изучил шейдеры, используемые в текстурном и графическом пакетах, я обнаружил, что они практически одинаковы. Однако, если вы использовали объекты Graphics и Sprites в своей игре, это приводило к полной очистке пакета при переключении между ними, вызывая перезагрузку шейдеров, что увеличивало количество вызовов рендера и операций OpenGL на кадр. Чем больше я изучал графический пайплайн, тем больше видел тех же самых вещей, что и в текстурном пайплайне: дублированные переменные, встроенные матричные операции и так далее. Поэтому я прошел через процесс рефакторинга, сводя всё к нескольким основным методам и переиспользуя методы, которые уже были в текстурном пайплайне. В результате я смог полностью удалить пайплайн FlatTintPipeline. Это экономит 42,3 КБ (не сжатые) и удаляет 1000 строк кода из сборки. Конечно, многие методы были добавлены в текстурный пайплайн, но это увеличение составило всего от 730 до 1087 строк кода, что является лишь небольшой частью исходного объёма! И преимущества не заканчиваются на этом. Если у вас были какие-либо пользовательские конвейеры, которые расширяли FlatTintPipeline, пожалуйста, обновите их, чтобы они расширяли TextureTintPipeline вместо этого. Вам, вероятно, придется переопределить несколько методов, но большинство из них останется без изменений. Проверьте подпись методов, однако.Теперь тот же конвейер может рисовать как графические объекты, так и спрайты, используя один и тот же шейдер и без необходимости переключения текстур. Это означает, что вы можете смело использовать объекты Graphics вместе со спрайтами, и это не будет стоить вам дополнительных затрат по производительности. Есть и другие преимущества, которые описаны в списке ниже.

  • TextureTintPipeline теперь имеет 100% покрытие jsdoc.
  • Удаление FlatTintPipeline уменьшает размер пакета на 42.3 КБ и 1000 строк кода.
  • Стили заливки и линий объектов Graphics теперь кэшируются в конвейере, а не пересчитываются для каждого рисуемого примитива.
  • Новый метод batchTri добавляет треугольник в батч вершин, либо текстурированный, либо заполненный.
  • drawFillRect — новый метод, который добавляет неизмененный прямоугольник в батч. Эти методы используются для заполнения цветом фона, например, камерами.
  • batchFillRect перемещен в TextureTintPipeline и имеет более компактную подпись метода.
  • batchFillTriangle перемещен в TextureTintPipeline и имеет более компактную подпись метода.
  • batchFillPath перемещен в TextureTintPipeline и имеет более компактную подпись метода.
  • batchLine перемещен в TextureTintPipeline.
  • При рисовании путей Graphics с шириной линии 1 пиксель больше не тратится время на рисование соединений линий, что ускоряет рендеринг 1-пиксельных линий.### Обновление режима вырезки WebGL

Процесс управления режимом вырезки в WebGLRenderer был полностью переписан. Ранее, режим вырезки gl постоянно включался и выключался для каждого камеры в вашей игре, что приводило к бесполезным операциям gl.

  • Камеры имеют новый внутренний метод updateSystem, который автоматически вызывается при изменении значений области видимости камеры. Это, в свою очередь, сообщает менеджеру сцен, если есть камеры с пользовательскими областями видимости в любой сцене вашей игры. Если таких камер нет, режим вырезки никогда не включается или не устанавливается, что означает нулевые операции gl! Если ваша игра использует камеры полного размера, теперь это не будет стоить вам ничего по поводу режима вырезки.
  • Если устанавливается новый режим вырезки, он теперь проверяет, совпадает ли его размер и положение с текущим режимом вырезки, и если это так, он пропускает установку режима вырезки.

Новые возможности и обновления для Render Texture

Класс Render Texture был полностью переписан с нуля, и все игровые объекты обновлены для поддержки его. Ранее он был очень ограничен в том, что вы могли с ним делать. Ранее он использовал матричную стековую структуру для внутренних трансформаций, но это было заменено на Camera. Это означает, что у вас есть полная мощь системы Camera (скроллинг, масштабирование, вращение), но это влияет только на содержимое Render Texture.* Самое большое обновление — это изменение того, что метод draw может принимать. Ранее вам нужно было передать текстуру и ссылку на кадр. Это изменилось, а также сигнатура метода. Теперь он может принимать любое из следующего:

- Любое рендеримое игровое объекта, такое как Sprite, Text, Graphics или TileSprite.
- Динамические и статические слои Tilemap.
- Группу. Содержимое которой будет перебрано и нарисовано последовательно.
- Контейнер. Содержимое которого будет перебрано полностью, и нарисовано последовательно.
- Сцену. Передайте `Scene.children`, чтобы нарисовать весь список отображения.
- Другую Render Texture.
- Объект Texture Frame.
- Строка. Это используется для поиска текстуры в менеджере текстур.* Новый метод `drawFrame` позволяет передать строковую текстуру и ключ кадра и нарисовать его на Render Texture.
  • Новый метод saveTexture позволяет сохранить Render Texture в менеджере текстур с использованием вашего собственного ключа. Затем вы можете использовать Render Texture для любого игрового объекта, который принимает текстуры как источник, например, для спрайтов или даже слоев Tilemap. Вы можете добавить данные кадров к Render Texture с помощью метода RenderTexture.texture.add.
  • Новое свойство camera — это экземпляр полной 2D камеры. Вы можете использовать его для изменения вида в вашей Render Texture. Скролл, вращение, масштабирование, как и с обычной камерой, но это будет влиять только на объекты, которые рисуются на Render Texture.
  • Все методы матричного стиля были удалены: save, translate, restore, scale, rotate. Теперь вы можете достичь того же с помощью трансформации объекта, который вы хотите нарисовать на Render Texture, или с помощью встроенной камеры.
  • Теперь вы можете обрезать Render Texture. Используйте метод setCrop, чтобы определить область обрезки. См. полную документацию для получения более подробной информации и изучения обширных примеров и тестов.### Новые функции и обновления объекта текстовой игры

Объект текстовой игры получил внутреннее обновление, чтобы сделать его более гибким. Некоторые свойства были переименованы или перемещены, а также добавлены новые функции:

  • Текст теперь может быть обрезан в WebGL и Canvas! Используйте метод setCrop, чтобы обрезать текст.
  • Текст теперь сохраняет ссылку на рендерер в свойстве renderer.
  • Свойство canvasTexture было удалено.
  • Текст теперь имеет внутренние свойства texture и frame. Эти свойства заменяют старое canvasTexture, но выполняют ту же задачу, позволяя обрезку текстуры и значительно уменьшая код рендерера.
  • Ранее, изменение объекта текста путем прямого изменения его свойства text не приводило к изменению отображаемого текста, так как ожидалось использование метода setText для изменения отображаемого текста. Внутри свойство text было переименовано в _text и помечено как приватное, а также добавлен новый геттер / сеттер для text, который передает управление методу setText, что позволяет использовать оба способа установки текста. Исправление #3919 (спасибо @hackhat @samid737)

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

  • Tile Sprites теперь могут быть обрезаны в WebGL и Canvas! Используйте метод setCrop, чтобы обрезать Tile Sprite.
  • Введен новый метод setTileScale, который устанавливает масштаб Tile Sprite в цепочке вызовов.
  • Введен новый внутренний параметр canvas. Tile Sprites теперь работают по-другому в режиме Canvas: ранее они использовали команду fillRect на игровом canvas для отрисовки себя каждый кадр, даже если они не изменились. Теперь они отрисовываются на внутреннем canvas только при изменении их положения или масштаба. Этот canvas затем отрисовывается на игровом canvas. Это быстрее, так как не заполняется каждый кадр fillRect, и позволяет отрисовывать их на других контекстах, таких как Render Textures.
  • Введены два новых внутренних параметра _tilePosition и _tileScale, которые являются Vector 2 и хранят положение и масштаб. Добавлены геттеры, поэтому используйте те же параметры, что и раньше, в вашем коде.
  • Введены два новых параметра displayTexture и displayFrame. Эти параметры заменяют предыдущие параметры texture и frame и хранят ссылки на исходный текстур Tile Sprite.
  • Параметр canvasPattern переименован в fillPattern.
  • Параметр oldFrame удален.
  • Параметр canvasBuffer переименован в fillCanvas.
  • Параметр canvasBufferCtx переименован в fillContext.

Новые функции и обновления TilemapКлассы Tilemap и Dynamic и Static Tilemap Layer теперь поддерживают 4 различных режима порядка рендера для отрисовки плиток. Это позволяет вам контролировать z-порядок плиток во время рендера. Эта функция была запрошена @etienne (который также предоставил тестовые карты) — см. новые примеры в Labs для лучшего понимания влияния этой функции.

По умолчанию используется режим 'right-down', что означает, что плитки будут упорядочены, начиная с верхнего левого угла, отрисовываясь вправо и затем переходя к следующей строке.

Четыре режима отрисовки:

0 = right-down 1 = left-down 2 = right-up 3 = left-up* Tilemap имеет новое свойство renderOrder, которое представляет собой строковую версию режима рендера, используемую при создании новых слоев через карту. Если карта создается из Tiled JSON данных, она будет использовать тот режим рендера, который указан в данных карты.

  • Tilemap имеет новый метод setRenderOrder. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Затем он используется во время создания любых слоев с этого момента.
  • DynamicTilemapLayer имеет новый метод setRenderOrder. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Затем он используется во время рендера слоя. Вы можете изменять значение на лету.
  • StaticTilemapLayer имеет новый метод setRenderOrder. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Под WebGL он пересоздает весь буфер вершин, используя новый режим отрисовки. Под Canvas он использует его во время рендера. Вы можете изменять его на лету.
  • ParseJSONTiled теперь извлекает свойство renderorder из Tiled JSON.
  • MapData имеет новое свойство renderOrder, которое заполняется парсером Tiled.### Обновления Matter.js

Версия Matter.js, используемая в Phaser, была обновлена с 0.13.1 до 0.14.2. Для ясности, почему мы не включаем Matter через npm, это потому, что мы используем кастомизированную версию Matter, которая включает дополнительные функции и оптимизации, которые еще не включены в официальной библиотеке.Большинство обновлений касались документации и пространства имен модулей, однако те, которые относятся к Phaser, перечислены ниже. Вы также можете просмотреть полный Change Log Matter.

  • Устранена глобальная проблема Composite.bounds, закрывает #627, закрывает #544 (f7f77b4), закрывает #627 #544
  • Обновлено библиотека pathseg, закрывает #548, закрывает #602, закрывает #424 (1e5758f), закрывает #548 #602 #424
  • Устранена проблема Common.isElement на node, закрывает #535 (ec38eeb), закрывает #535
  • Добавлен Query.collides, закрывает #478 (6593a72), закрывает #478
  • Устранена проблема аргумента point в Body.scale, закрывает #428 (894c1ef), закрывает #428
  • Устранена проблема Body.scale для составных тел (50a89d0)
  • Устранена проблема центроида для статических составных тел, закрывает #483 (ece66e6), закрывает #483
  • Устранена проблема Common.isElement, закрывает #501, закрывает #507, закрывает #459, закрывает #468, закрывает #517 (18a0845), закрывает #501com/liabru/matter-js/issues/501) #507 #459 #468 #517
  • устранена проблема изменения инерции в Body.setMass, закрывает #378 (f7d1877), закрывает #378
  • устранена проблема аргумента radius в Vertices.chamfer, закрывает #467 (3bceef4), закрывает #467### Плагин камеры 3D

Поддержка камеры 3D и объектов игры Sprite 3D были удалены из основного пакета Phaser и перемещены в опциональный плагин. Вы можете найти исходный код для Camera 3D в новой папке plugins/camera3d, вместе с файлом README, который объясняет, как теперь использовать плагин в ваших играх.

  • Когда объект Sprite3D добавляется к камере через Camera.add, он теперь добавляется в списки Отображения и Обновления. Fix #3945 (спасибо @vvega)### Новые возможности

  • Camera.resolution — это новое только для чтения свойство, которое хранит текущее разрешение конфигурации игры, используемое камерой. Это используется внутренне для вычислений области видимости.

  • Text.resolution и метод Text.setResolution позволяют контролировать разрешение статического текстового объекта игры. По умолчанию оно будет установлено для соответствия разрешению, заданному в конфигурации игры, но вы можете переопределить его через TextStyle. Это позволяет получить более четкий текст на устройствах с высоким DPI, в ущерб большему размеру внутренних текстур Canvas для текста — поэтому используйте с осторожностью, так как чем больше текстовых объектов с высоким разрешением у вас есть, тем больше памяти они потребляют. Исправление #3528 (спасибо @kirillbunin)

  • TransformMatrix.getCSSMatrix вернет строку с форматированным CSS-матрицей преобразования на основе текущих значений матрицы.

  • CacheManager теперь создает новый кэш под названием html, который используется для хранения всех загруженных фрагментов HTML.

  • FileType.HTML — это новая загрузка типа файла, которая загружает фрагмент HTML и сохраняет его в новом кэше html. Доступ к нему можно получить через load.html (ранее этот метод использовался для загрузки HTML в текстуры, для этой функции теперь используйте load.htmlTexture).

  • TransformMatrix.``TransformMatrix.getX — это новый метод, который возвращает компонент x на основе заданных значений x и y и текущей матрицы. Этот метод широко используется в конвейерах.

  • TransformMatrix.getY — это новый метод, который возвращает компонент y на основе заданных значений x и y и текущей матрицы. Этот метод широко используется в конвейерах.

  • TransformMatrix.copyToArray — это новый метод, который копирует значения матрицы в заданный массив. Это противоположный метод copyFromArray.

  • Graphics.setTexture — это новый метод для WebGL, который позволяет установить текстуру для использования при рисовании форм на объекте Graphics. Вы также можете указать, как текстура должна быть смешана с текущими цветами заполнения или градиентов. Обратите внимание, что текстура не тайлит, она растягивается для соответствия форме.

  • Graphics.fillGradientStyle — это новый метод для WebGL, который позволяет установить градиент для заполнения форм. Вы можете контролировать цвета в четырех углах прямоугольника. Цвета затем автоматически смешиваются в шейдере. Использование этой функции ограничено. Например, вы не можете заполнить градиентом весь путь или дугу, так как они состоят из множества треугольников. Но для быстрого создания градиентных фонов или кнопок это идеально. lineGradientStyle — это новый метод, доступный только в WebGL, который позволяет задать градиент для фигур, которые вы рисуете.Вы можете контролировать цвета в четырёх углах прямоугольника. Цвета затем автоматически смешиваются в шейдере. Использование этой функции ограничено. Например, вы не можете применить градиент к целому пути или дуге, так как они состоят из множества треугольников. Но для быстрого создания градиентных линий это идеально.

  • TextureManager.getBase64 — это новый метод, который принимает ключ кадра текстуры и возвращает базовую 64-битную версию кадра. Вы также можете предоставить тип изображения и параметры кодирования.

  • Глобальные плагины теперь имеют новый необязательный объект data, содержимое которого передаётся в метод init плагина. Это позволяет пользователям передавать данные напрямую в плагин при добавлении его в конфигурации: { key: 'BankPlugin', plugin: BankPluginV3, start: true, data: { gold: 5000 } } или при добавлении плагина через метод install (спасибо @samme).

  • Теперь вы можете воспроизводить анимации в обратном порядке! Используйте новый метод Sprite.anims.playReverse, чтобы воспроизводить предопределённую анимацию в обратном порядке с её начального кадра. Или вызовите Sprite.anims.reverse, чтобы сразу перевернуть поток уже запущенной анимации. Анимации, воспроизводимые в обратном порядке, всё ещё учитываются в общем количестве повторений и уважают флаг yoyo (спасибо @khaleb85 @Ben-Millions).

  • ParticleEmitterManager теперь имеет компонент Transform.Это означает, что вы можете задавать положение, поворот или масштаб Emitter Manager, и это будет влиять на каждый эмиттер, который он рендерит. Преобразование менеджера смешивается с преобразованием камеры. Это работает как в Canvas, так и в WebGL.

  • TextureManager.addRenderTexture — это новый метод, который добавляет Render Texture в Texture Manager, позволяя использовать её как текстуру для Game Objects, используя ключ текстуры. Модификация исходной Render Texture сразу изменяет любые Game Objects, использующие её.

  • TextureSource имеет новый булевый параметр isRenderTexture, который автоматически устанавливается при создании.

  • Canvas Renderer имеет новый метод setContext, который позволяет ему переключаться между контекстами рисования для всех операций рисования. Вызовите метод без аргументов, чтобы сбросить его на стандартный игровой canvas.

  • Если вы установите window.FORCE_WEBGL или window.FORCE_CANVAS в окне, в котором загружается Phaser game, это перекроет тип рендерера, заданный в конфигурации игры, и заставит использовать либо WebGL, либо Canvas. Это полезно для быстрого тестирования различий между рендерерами без необходимости выполнения нового сбора каждый раз.

  • TextureSource.source — это новое свойство, которое содержит исходный источник изображения текстуры. Оно сбрасывается, когда источник уничтожается.

  • TransformMatrix.copyToContext — это новый метод, который копирует значения из матрицы в заданный контекст рендеринга Canvas.

  • Phaser.Utils.String.UUID` вернет RFC4122-совместимый UUID в виде строки. Это используется внутренне для избежания конфликтов ключей кэша, но также доступен для вашего использования.

  • Введен новый компонент Crop, который используется для игровых объектов, не основанных на текстуре, таких как Text и TileSprite. Вы либо используете TextureCrop, либо Crop, но не оба вместе на одном объекте.

  • TransformMatrix. setToContext — это новый метод, который устанавливает значения из матрицы в заданный контекст рендеринга Canvas с использованием setTransform вместо transform.

  • SetTransform — это новый функционал рендерера Canvas, который консолидирует процесс подготовки игрового объекта к рендерингу без фактического рендеринга. Это используется внутренне классами Graphics и Bitmap Text.

  • Управитель текстур имеет новый метод renameTexture, который позволяет переименовать текстуру, изменяя ключ на новый. Все существующие игровые объекты будут продолжать сохранять свои ссылки даже после переименования.

  • При загрузке файла SVG вы теперь можете изменять размер SVG во время процесса загрузки, до рендеринга его в текстуру. Это очень полезно, если вы хотите увеличить SVG с маленькими viewBox, или пытаетесь уменьшить потребление памяти от SVG с большими размерами. Вы можете либо передать фиксированную ширину и высоту: this. load. svg('morty', 'file. svg', { width: 300, height: 600 }), либо предоставить коэффициент масштабирования: this. load. svg('morty', 'file. svg', { scale: 4 }) (спасибо @ysraelJMM) * Polygon.Perimeter вернет периметр для заданного многоугольника (спасибо @iamchristopher)

  • Polygon.GetPoints вернет массив объектов Point, содержащий координаты точек вокруг периметра многоугольника, на основе заданного количества или значения stepRate. Это доступно как статическая функция и как метод getPoints на многоугольнике (спасибо @iamchristopher)

Обновления

  • Класс Camera был разделен на два: BaseCamera, который содержит все основные функции и свойства камеры и может служить отличной базой для создания собственных камер, и Camera, который имеет то же имя класса, что и ранее. Класс Camera наследует BaseCamera и добавляет поддержку захватчика и специальных эффектов. Вам не нужно обновлять свой код, даже если вы расширяете текущую камеру, так как они работают так же, как и раньше.

  • Camera.x и Camera.y были преобразованы в геттеры/сеттеры, отображающиеся на внутренних приватных значениях _x и _y соответственно. Это позволяет непосредственному изменению позиции области видимости камеры обновлять также внутренние переменные вычисления разрешения.

  • Метод Camera.setScene теперь устанавливает свойство resolution камеры и обновляет внутренние переменные области видимости одновременно.

  • Метод Cull Tiles, используемый слоем динамической плиточной карты, был значительно оптимизирован.Теперь он использует размеры области вычеркивания для ограничения количества итераций плиток на каждом слое, что приводит к значительным сокращениям времени обработки на больших слоях или нескольких слоях (спасибо @tarsupin).

  • Метод GameObject.willRender теперь принимает камеру в качестве единственного аргумента и использует его в проверке. Это позволило мне удалить 23 дублирующих проверки, распределенных по различным объектам игры, все они выполняли одну и ту же задачу, экономя как память, так и время процессора, так как флаги проверялись дважды в большинстве случаев.

  • Загрузчик типа файла HTML был переименован в HTMLTexture. Если вы использовали этот загрузчик, пожалуйста, измените вызовы с load.html на load.htmlTexture. Аргументы остались без изменений.

  • Метод setBlendMode в рендере WebGL теперь возвращает булево значение. True, если новый режим смешивания был установлен, иначе False. Ранее он возвращал ссылку на экземпляр рендера.

  • Метод batchVertices в TextureTintPipeline был переименован в batchQuad, что более точно описывает его функциональность.

  • В ArcadePhysics метод Body.setSize теперь позволяет не передавать значения ширины и высоты. Если вы это сделаете, он проверит, есть ли у родительского объекта игры текстурная рамка, и если да, он будет использовать размеры рамки для размеров тела (спасибо @tarsupin).

  • Метод PluginCache.destroyCorePlugins удаляет все основные плагины из кэша.Будьте очень осторожны при вызове этого метода, так как Phaser не сможет перезапустить или создать новые сцены после его вызова. destroyCustomPlugins удаляет все пользовательские плагины из кэша.

    • PluginManager.destroy теперь очищает все пользовательские плагины из кэша плагинов. Это исправляет проблему с невозможностью уничтожения экземпляра Phaser и последующего его перезапуска, если он использовал пользовательский плагин (спасибо jd. joshuadavison).
    • Game.destroy имеет новый булев аргумент noReturn. Если он установлен, все плагины ядра будут удалены при уничтожении экземпляра игры. После этого нельзя будет перезапустить Phaser на том же веб-странице, поэтому устанавливайте его только если вы уверены, что закончили и больше не нужно запускать Phaser.
    • MouseManager больше не будет обрабатывать свои native события, если ссылка на менеджер была удалена (например, вы перемещаете указатель, когда игра уничтожает себя).
    • TouchManager больше не будет обрабатывать свои native события, если ссылка на менеджер была удалена (например, вы перемещаете указатель, когда игра уничтожает себя).
    • Particle.color был удален, так как теперь он вычисляется во время рендеринга для поддержки прозрачности камеры.
    • Поток событий запуска игры был немного изменен. Теперь игра будет слушать событие texturesready, которое отправляется менеджером текстур после завершения обработки стандартных текстур.После получения этого события игра отправляет событие ready, которое все остальные системы слушают и на которое реагируют. Разница заключается в том, что рендерер использует событие texturesready для обеспечения того, что он будет первым активированным компонентом, до активации любого другого компонента.
  • WebGLRenderer имеет новое свойство blankTexture, которое является ссылкой на пустую прозрачную текстуру WebGL размером 32x32. Это используется внутренне для рендеринга графики без заполнения текстур и когда нет других текстур.

  • WebGLRenderer имеет новый метод setBlankTexture, который заставляет его установить пустую текстуру как текущую. Это используется после рисования рендерной текстуры для предотвращения рисования других объектов на ней.

  • В статическом слое TilemapLayer были добавлены следующие свойства и методы: skipCull, tilesDrawn, tilesTotal, cullPaddingX, cullPaddingY, cullCallback, setSkipCull и setCullPadding, так как все они используются рендерером Canvas Static Layer. Статические слои в 3.11 не рисовались в Canvas из-за отсутствия значений culling, но теперь они правильно рисуются и могут также рисоваться на других целях, таких как рендерная текстура.

  • Методы Math.Snap.Floor, Math.Snap.Ceil и Math.Snap.Round получили новый необязательный булевый аргумент divide. Если он установлен, то полученное округленное значение будет разделено на количество промежутков перед возвратом.Это полезно, если вы пытаетесь быстро округлить значение в сетку или местоположение массива.

    • Свойство currentBlendMode было удалено из Canvas Renderer и больше не проверяется ни одним классом. Режимы смешивания теперь устанавливаются напрямую в контексте для избежания некорректного сохранения состояния.
    • Свойство currentAlpha было удалено из Canvas Renderer и больше не проверяется ни одним классом. Значения прозрачности теперь устанавливаются напрямую в контексте для избежания некорректного сохранения состояния.
    • Классы TextureCrop и Crop имеют новый метод resetCropObject, который генерирует объект данных обрезки, необходимый для игровых объектов, поддерживающих обрезку. Это позволяет нам удалить дублирующийся код из нескольких игровых объектов и заменить его одним вызовом функции.
    • Canvas Renderer имеет новый метод batchSprite, который объединяет процесс рисования текстурного игрового объекта на холсте. Он обрабатывает прозрачность, режим смешивания и матричные вычисления в одной функции и теперь используется почти всеми рендерерами игровых объектов на холсте.
    • Метод batchTexture в конвейере текстурного окрашивания теперь поддерживает обрезанные игровые объекты и будет корректировать рисуемый текстурный кадр соответственно.
    • Компонент Matrix Stack был удален. Он больше не используется внутренне и просто занимал место. * Вы можете теперь указать lineHeight для ретро шрифта в объекте конфигурации ретро шрифта (спасибо @FelixNemis)
    • При генерации статического слоя Tilemap в WebGL он будет использовать значение roundPixels камеры для ограничения координат плиток.
    • Функция CanvasRenderer.DrawImage была удалена, как и связанное с ней свойство drawImage из Canvas Renderer, так как они больше не используются.
    • Функция CanvasRenderer.BlitImage была удалена, как и связанное с ней свойство blitImage из Canvas Renderer, так как они больше не используются.
    • Вы можете теперь напрямую получить доступ к экземпляру игры из сцены с помощью this.game, если оно существует в карте инъекций сцены, что по умолчанию так и есть. Будьте очень осторожны с тем, что вы делаете здесь: практически нет причин для использования этого.
    • Метод Camera.ignore теперь может принимать вложенные массивы игровых объектов и также поддерживает как группы, так и контейнеры.
    • Событие changedata, отправляемое менеджером данных, теперь включает предыдущее значение в качестве четвертого аргумента обратного вызова, поэтому сигнатура события теперь выглядит так: родитель, ключ, значение, предыдущее_значение (спасибо @iamchristopher)
  • Вызов gl.clearColor теперь пропускается, когда clearBeforeRender установлен в false (спасибо @goldfire)

  • Вызовы DistanceBetween были заменены на DistanceSquared в функциях closest и furthest в Arcade Physics (спасибо @Mursaat)* RandomDataGenerator теперь создает по умолчанию случайный seed, если вы создаете свою собственную версию класса (вместо использования Phaser.Math.RND) и не предоставляете seed (спасибо michaeld).

  • Метод createFromObjects Tilemap теперь добавляет пользовательские свойства к игровым объектам. Это работает путем проверки наличия свойства, и если оно отсутствует, устанавливается в менеджере данных игровых объектов (спасибо @scalemailted @samme).

  • В Matter.js, если вы масштабировали тело, оно масштабировалось правильно только один раз из-за внутреннего способа обработки масштабирования в Matter. Теперь мы автоматически сбрасываем масштаб Matter перед применением нового значения, что позволяет поддерживать синхронизацию масштабов объектов Phaser и Matter. Исправление #3785 #3951 (спасибо @bergben).

  • По умолчанию режим смешивания контейнера теперь SKIP_TEST. Это позволяет либо установить режим смешивания для контейнера, в этом случае все дочерние элементы используют этот режим смешивания. Либо вы можете установить режим смешивания для дочерних элементов, и дочерние элементы будут рендериться с использованием своих собственных режимов смешивания, так как у контейнера нет установленного режима. Функции рендеринга WebGL и Canvas также были обновлены для поддержки этого изменения. Исправление #3684 (спасибо @TadejZupancic).

  • Ранее менеджер ввода создавал обработчик касаний, если конфигурация игры не содержала input.touchустановленного вfalse(по умолчанию былоtrue). Если такая конфигурация не установлена, она больше не устанавливается по умолчанию в true, а вместо этого устанавливается в то, что возвращает Device.input.touch`. На нетouch-десктопах это означает, что теперь будет создан только один указатель, а не два.

  • Свойство _tempMatrix тела Arcade Physics было удалено. Оно использовалось только, если игровой объект тела имел родителя. Матрица была перемещена в экземпляр мира, используемый всеми телами.

  • Мир Arcade Physics получил два новых приватных свойства _tempMatrix и _tempMatrix2. Эти свойства используются всеми телами в симуляции, которые требуют временной матрицы для вычислений, вместо создания своих собственных экземпляров.

  • Менеджер ввода получил новое приватное свойство _tempMatrix2. Это используется внутренне в проверках hitTest для избежания постоянного создания матриц.

  • Матрица преобразования имеет новый метод applyInverse, который принимает x/y позицию и обратно переводит её через текущую матрицу.

  • Использование keyboard.addKeys("W, A, S, D") не работало из-за пробелов между символами. Теперь addKeys будет обрезать входные данные, позволяя вам разделять символы, если вам это нужно (спасибо @dhruvyad).

  • Вызов setTimeScale для компонента анимации спрайта теперь устанавливает значение масштаба времени и сохраняет его до тех пор, пока вы его снова не измените.Ранее это значение сбрасывалось до 1 при загрузке нового анимационного файла в компонент, но теперь это больше не происходит — после установки масштаба времени он остаётся в силе, независимо от того, какие анимации воспроизводятся на спрайте. ### Исправления ошибок, связанных с разрешением в конфигурации игрыУстановка свойства resolution в конфигурации игры на значение, отличное от 1, вызывала различные ошибки в API. В следующем перечне указаны исправленные проблемы:

  • Канвас игры был размером неверным, если вы не включили автоматическое изменение размера. Теперь канвас масштабируется до заданного размера, сохраняя разрешение. Исправление #3468 (спасибо @Legomite)

  • Камеры с заданными цветами фона отображали заполненную область цвета неверного размера. Заполнение камеры теперь учитывает разрешение.

  • Эффект затухания камеры отображал область затухания неверного размера. Затухание камеры теперь учитывает разрешение.

  • Эффект вспышки камеры отображал область вспышки неверного размера. Вспышка камеры теперь учитывает разрешение.

  • Эффект тряски камеры использовал неверные значения ширины. Тряска камеры теперь учитывает разрешение.

  • Вычисления ввода не учитывали корректно разрешение игры. Если область просмотра камеры не была расположена в точке 0x0 или не была полного размера, или камера была повернута или зумирована, области ввода были неверными, если resolution был > 1. Теперь эти параметры учитываются корректно, и изменение разрешения больше не нарушает ввод. Исправление #3606 (спасибо @Secretmapper @thanh-taro)### Исправления ошибок

  • Метод setCrop случайно сохранял объект обрезки на цепочке прототипов, что приводило к отображению одной и той же рамки для всех изображений или спрайтов, обрезанных. Данные обрезки были перемещены в экземпляр объекта игры, где они должны находиться, что устранило эту проблему (спасибо NoxBrutalis).

  • Если файл аудио не загружался и выбрасывал неполные ошибки, это приводило к падению JavaScript при попытке логирования ошибки. Теперь он логирует сообщение только в том случае, если оно существует. Исправление #3830 (спасибо @kelostrada).

  • Частички, использующие режим смешивания, не отображались правильно после обновлений в версии 3.11. Если режим смешивания изменялся во время обработки менеджера эмиттера, теперь он правильно перезаписывает текстуру, что прекращает исчезновение частичек. Исправление #3851 (спасибо @maxailloud).

  • Добавление массива дочерних элементов в группу приводило к ошибочному пониманию передачи объекта конфигурации. Исправление #3854 (спасибо @pedro-w).

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

  • Если сетка вызывала сброс батча, она не отображалась из-за потери текстуры.Теперь она правильно перезаписывается после сброса.

    • ArcadePhysics.closest и ArcadePhysics.furthest использовали неправильную ссылку на дерево, что приводило к выбрасыванию ошибок (спасибо @samme)
    • BlitterCanvasRenderer не отображал объект Bob в режиме Canvas, если он был перевернут (спасибо @SBCGames)
    • RenderTexture.draw не отображал кадр в режиме Canvas (спасибо @SBCGames)
    • ParticleEmitter не отображал текстурированные частицы в режиме Canvas (спасибо @SBCGames)
    • RenderTexture.preDestroy теперь возвращает canvas обратно в CanvasPool при работе в режиме Canvas (спасибо @SBCGames)
    • Значение alpha теперь всегда устанавливается для Render Textures в режиме Canvas, независимо от предыдущего значения alpha в рендерере (спасибо @SBCGames)
    • Зона теперь вызывает updateDisplayOrigin в конструкторе, что приводит к правильному значению displayOriginX и displayOriginY, если вы создаете зону и не изменяете её размер. Исправление #3865 (спасибо @rexrainbow)
    • CameraManager случайно добавлял дополнительные события уничтожения при перезапуске сцены, что приводило к выбрасыванию ошибки Uncaught TypeError: Cannot read property 'events' of null при попытке уничтожить экземпляр игры, переключившись между сценами. Исправление #3878 (спасибо @mbunby)
    • RenderTextures в WebGL теперь устанавливают размер области просмотра, что прекращает предупреждение консоли в Firefox. Исправление #3823 (спасибо @SBCGames)
    • Частицы теперь учитывают значение прозрачности камеры при вычислении их окончательных значений прозрачности в WebGL.Они ранее игнорировали это значение. Если вы теперь сделаете камеру прозрачной, все частицы изменятся соответственно.
    • Обновления CullTiles из версии 3.11 не учитывали положение слоя Tilemap при вычислении границ, что приводило к тому, что статические слои, отображаемые за пределами области просмотра камеры, никогда не рисовались в режиме Canvas. Метод также был оптимизирован, теперь он выполняет меньше делений и меньше проверок при отключении отсечения.
    • Эмиттер частиц при работе в режиме Canvas не позволял более чем одному эмиттеру использовать режим смешивания (как в примерах Electric). Режим смешивания теперь правильно устанавливается для каждого эмиттера.
    • Режим смешивания теперь устанавливается напрямую во всех рендерерах Canvas без сравнения с тем, что хранится в рендерере Canvas. Это исправляет проблемы, когда режим смешивания теряется между двумя разными объектами игры, если они восстанавливают контекст, но не обновляют флаг рендерера. Объекты игры в режиме Canvas теперь могут сочетать различные режимы смешивания по всему списку отображения.
    • Модуль Matter.js получил небольшое обновление, которое предотвращает триггеринг collisionEnd многократно, когда он должен срабатывать только один раз (спасибо @mikewesthad).
    • Объекты графики не могли быть установлены для игнорирования камерами.Теперь каждый рисуемый объект игры может быть игнорирован камерой, как напрямую, так и через контейнер. Исключением являются группы, так как они не рисуются и являются непересекающимися родителями.
    • Функция отсечения Tilemap теперь использует размеры ячеек Tilemap для вычисления границ, а не размеры ячеек слоя, так как эти два значения не обязаны совпадать, и размер подлежащего отображению грида имеет приоритет при вычислении видимых ячеек. Исправление #3893 (спасибо @Zax37)
    • Свойство Body.speed физики Arcade Physics теперь устанавливается всякий раз, когда вы задаете скорость через setVelocity, setVelocityX или setVelocityY, что предотвращает сброс скорости тела до нуля, если useDamping включено. Исправление #3888 (спасибо @samme)
    • Метод getPixelAlpha менеджера текстур не использовал правильное имя кадра. Теперь это имя передается правильно. Исправление #3937 (спасибо @goldfire)
    • Методы getPixelAlpha и getPixel менеджера текстур позволяли координатам x/y за пределами вырезанной области кадра. Теперь они проверяются на соответствие границам кадра. Исправление #3937 (спасибо @goldfire)
    • Объекту игры не удавалось установить режим смешивания SKIP_TEST с помощью геттера или метода setBlendMode.
    • В Arcade Physics вызов World.disable передавал неверный аргумент, поэтому тело никогда не отключалось. (спасибо @samme) * В Canvas режиме появился визуальный дефект с округленными прямоугольниками из-за добавления аргумента overshoot в вызове Graphics arc. Это было исправлено, теперь дуги рендерятся правильно и последовательно в WebGL и Canvas, а также округленные прямоугольники снова работают нормально. Исправление #3912 (спасибо @valse)
    • Метод InputManager.inputCandidate, который определяет, может ли объект игры быть взаимодействован с указателем и камерой, теперь учитывает полное состояние камеры. Это означает, что если камера игнорирует объект игры, вы больше не сможете взаимодействовать с ним, или если камера игнорирует контейнер с интерактивным объектом игры внутри него, вы не сможете взаимодействовать с детьми этого контейнера. Ранее они взаимодействовали бы независимо от состояния камеры. Исправление #3984 (спасибо @NemoStein @samid737)
    • Метод Transform.getWorldTransformMatrix был переписан для корректного итерирования родителей трансформации и применения матричных умножений по ходу. Это (вместе с некоторыми изменениями в Input Manager) исправляет проблему с объектами игры внутри контейнеров, которые не проходят тесты столкновений при определенных углах. Исправление #3920 (спасибо @chaping @hackhat)
    • Вызов Arcade Physics collide во время метода update не возвращал результаты обратно в родительский объект тела, что приводило к продолжительному движению тел. Использование Colliders работало, но ручная проверка не работала.Теперь оба метода работают. Исправление #3777 (спасибо @samme)
    • Метод setTintFill игнорировал значение alpha объекта игры в шейдере. Теперь значение alpha смешивается с заполнением цвета, что позволяет правильно выключать альфа-канал заполненных цветом объектов игры. Исправление #3992 (спасибо @trl-bsd)
    • Метод Arcade Physics World collideSpriteVsTilemapLayer теперь синхронизирует результаты столкновений обратно в тело, что позволяет вызывать collide из цикла обновления снова. Исправление #3999 (спасибо @nkholski @mikewesthad)
    • Методы Arcade Physics Body deltaX и deltaY теперь возвращают предыдущие значения delta, а не ноль. Исправление #3987 (спасибо @HaoboZ)

Примеры, документация и TypeScriptМои благодарности следующим людям за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как за отчет об ошибках, так и за их исправление или помощь в написании документации:

@SBCGames @rgk @rook2pawn @robbintt @bguyl @halilcakarr @PhaserEditor2D @Edwin222 @tfelix @Yudikubota @hexus @guzmonne @ampled @thanh-taro @dcbriccetti @Dreaded-Gnu @padme-amidala @rootasjey @ampled @thejonanshow @polarstoat @jdjoshuadavison @alexeymolchan @samme @PBird @spontoreau @hypertrifle @kid-wumeng

Благодарю @khaleb85 за исправление крайне раздражающей задержки на страницах документации API, которая блокировала браузер при индексировании поля поиска.

Версия 3.11.0 - Leafa - 13 июля 2018### Камера - Новые возможности, обновления и исправления

  • Все классы 2D камеры теперь полностью охвачены JSDocs!
  • Все классы 3D камеры теперь устарели и будут удалены в следующей версии. Они будут перемещены в отдельный плагин.
  • Camera.alpha (и связанный с ним метод Camera.setAlpha) позволяет установить уровень прозрачности для всего камеры. Это влияет на все, что камера рендерит, даже если у этих объектов есть свои собственные значения прозрачности. Вы можете анимировать это свойство, чтобы сделать содержимое камеры постепенно появляющимся или исчезающим, или установить его так, как это необходимо для вашей игры.
  • Camera.deadzone (и связанный с ним метод Camera.setDeadzone) позволяет указать зону бездействия для камеры. Зона бездействия — это прямоугольная область, используемая при следовании камеры за целевым объектом. Если цель находится в зоне бездействия, камера не будет прокручиваться. Как только цель выходит за пределы зоны бездействия, камера начнет следовать за ней (применяя линейную интерполяцию, если необходимо). Это позволяет установить область камеры, в которой игрок может свободно перемещаться до начала следования. Зона бездействия пересчитывается по центру камеры каждый кадр, что означает, что вы также можете использовать прямоугольник для других проверок в игре по мере необходимости.
  • Camera.pan` — это новое эффектное свойство камеры, которое позволяет контролировать автоматическое перемещение камеры между точками в мире игры. Вы можете указать продолжительность и тип плавности для перемещения, и оно будет генерировать события, как и все другие эффекты камеры, поэтому вы можете подключиться к началу, обновлению и завершению перемещения. См. примеры и документацию для получения дополнительных сведений.
  • Camera.zoom — это новое эффектное свойство камеры, которое позволяет контролировать автоматическое масштабирование камеры. Вы можете указать продолжительность и тип плавности для масштабирования, а также, конечно, коэффициент масштабирования, и оно будет генерировать события, как и все другие эффекты камеры, поэтому вы можете подключаться к началу, обновлению и завершению масштабирования. Используя это в сочетании с новым эффектом перемещения, вы можете легко масштабировать и перемещать камеру. См. примеры и документацию для получения дополнительных сведений.
  • Camera.midPoint — это новое свойство Vec2, которое обновляется каждый кадр. Используйте его для получения точного местоположения центра камеры в мире.
  • Camera.displayWidth — это новое свойство, которое возвращает ширину отображения камеры, учитывая текущий уровень масштабирования.
  • Camera.displayHeight` — это новое свойство, которое возвращает высоту отображения камеры, учитывая текущий уровень масштабирования.
  • Camera.worldView — это новое свойство, экземпляр прямоугольника, которое содержит размеры области мира, видимой камерой в данный момент. Его можно использовать для тестов пересечения или отсечения, которые не требуют учета вращения камеры.
  • Camera.dirty — это новое булевое свойство. Загрязненная камера была изменена либо по размеру области видимости, либо по границам, либо по прокрутке, либо по вращению, либо по уровню масштабирования с момента последнего кадра. Флаг сбрасывается в методе postCameraRender, но до этого момента его можно проверять и использовать.
  • Camera.centerOn — это новая метод, которая перемещает камеру так, чтобы область видимости была центрирована на указанные координаты. Практический способ перехода к различным точкам на карте без необходимости вычисления смещений прокрутки.
  • Границы камеры не учитывали масштабирование камеры правильно, что означало, что вы часто не могли бы достичь углов области видимости камеры при масштабировании, отличном от 1. Теперь границы вычисляются каждый кадр для обеспечения соответствия уровню масштабирования, и вы больше не сможете прокручивать за пределы границ. Исправление #3547 (спасибо @nkholski)
  • Camera.centerToBounds не учитывал смещение границ, поэтому границы на позициях, отличных от нуля, не центрировались правильно. Теперь все границы центрируются правильно. Исправление #3706 (спасибо @cyantree)
  • Camera.setBounds имеет новый необязательный аргумент centerOn. Если он указан, камера автоматически центрируется на новых границах.
  • Камера больше не дергается при следовании за игровыми объектами при высоком масштабировании.
  • Camera._id переименован в Camera.id, это прочитанное только для чтения маски-бит, используемое для исключения камеры из игровых объектов.
  • Управление камер cameraPool полностью удалено. В основном это было бесполезно на практике, так как камеры не обновляются достаточно часто для того, чтобы требовалось пулинг. Оно также не поддерживало список масок-бит правильно до этого.
  • CameraManager.resetAll теперь уничтожает все текущие камеры, сбрасывает маркер ID камеры до 1 и добавляет одну новую камеру.
  • CameraManager.currentCameraId удален. ID теперь назначаются более умно, через внутренний метод getNextID.
  • CameraManager.addExisting больше не требует передачи камеры, которая уже существует в пуле (так как пула больше нет), что позволяет вам создавать свои собственные камеры и передавать их addExisting, и они будут обрабатываться как обычные камеры и не будут игнорироваться менеджером. Они также получают правильный ID при добавлении.addExisting теперь имеет новый булевый аргумент makeMain, который сделает новую камеру основной.
  • CameraManager.getTotal — это новая метод, которая вернет общее количество камер, управляемых менеджером, с опциональным аргументом isVisible, который учитывает только видимые камеры, если он установлен.
  • CameraManager.remove теперь может принимать массив камер для удаления из менеджера, а также одну камеру.
  • Ранее CameraManager.remove не позволял удалять камеру, если это означало, что в менеджере камеры не останется ни одной камеры. Это ограничение было снято. Теперь Менеджер камер может работать даже с нулевым количеством камер. Ваша игра, конечно, не будет отображать ничего, но это теперь возможно.
  • CameraManager.remove теперь вернет общее количество удаленных камер. ### Округление пикселейПеред тем как объяснить изменения, стоит остановиться на том, что делают три различных свойства конфигурации игры:

roundPixels - это свойство заставляет рендерер рисовать большинство объектов игры в целочисленных позициях. Их фактические позиции могут быть любыми, но рендерер округляет значения до ближайшего целого числа сразу перед рисованием. Это работает только с объектами на основе текстур. Объекты графики, например, игнорируют это свойство.antialias - когда установлено в true, WebGL текстуры создаются с использованием gl.LINEAR, что позволяет WebGL попытаться интерполировать текстуру при рендеринге в размерах, отличных от размера текстуры. Это может произойти, если вы масштабируете объект игры или увеличиваете камеру. В обоих случаях WebGL будет интерполировать значения пикселей, чтобы адаптироваться к новому размеру. Если это свойство установлено в false, то будет использоваться gl.NEAREST вместо него. Это метод интерполяции с использованием ближайшего соседа, и он почти всегда является лучшим вариантом, если нужно сохранить текстуры четкими, например, при использовании масштабированного пиксельного искусства. Отключение antialias включает метод ближайшего соседа для интерполяции на самом холсте игры. Если вам нужно использовать смесь алиасированных и антиалиасированных текстур в вашей игре, вы можете изменить их на уровне каждой текстуры, используя Texture.setFilter.Еще одно свойство конфигурации игры называется pixelArt. Если установлено в true, это то же самое, что включение roundPixels и отключение antialias. Это оптимальная настройка для игр с пиксельным искусством.

  • Оба рендерера теперь проверяют pixelArt ИЛИ antialias перед установкой режима масштабирования холста. Оба значения проверяются во время создания текстур.
  • Если в конфигурации игры вы включили режим пиксельного искусства или roundPixels, то все камеры будут иметь значения roundPixels установленными по умолчанию в true. Вы можете переключать это, изменяя свойство CameraManager.roundPixels, или изменяя его на уровне каждой камеры, как требуется.
  • Camera.roundPixels теперь используется во всех кодах рендеринга для обоих Canvas и WebGL. Ранее он проверял значение конфигурации рендерера, но теперь весь код рендерера использует значение камеры для определения, нужно ли округлять позицию рисования или нет.### Новые возможности, обновления и исправления в конвейере окрашивания текстур

Пайплайн окраски текстур был переписан для упрощения сотен строк дублирующегося кода и для переноса ответственности за отрисовку на сами объекты игры. Ранее, если бы вы исключили, например, Tilemaps из сборки Phaser, рендерер всё равно включал бы множество кода, связанный с отрисовкой этих элементов. Теперь эта задача перенесена на объекты игры, а пайплайн предоставляет набор чистых вспомогательных функций для батчинга, очистки и отрисовки. Решение о внесении этой изменений было принято не легкомысленно. Однако я почувствовал, что ни один из конвейеров не соответствовал своему названию. Вы никогда не могли передать объекты из одного конвейера в другой, так как у них не было входных и выходных точек, и они были просто усеченными одиночными пакетами. Хотя вы могли изменять используемый конвейер на объекте Game Object, это действие означало, что каждый конвейер должен был быть ответственным за каждый тип объекта Game Object, как сейчас, так и в будущем, и они были полны избыточных функций-заглушек. Размер пакета также был значительным. Теперь количество строк кода уменьшилось с 1,961 (76 КБ) до 729 строк (27 КБ). Это не единственный файл, который получил выгоду. Конвейер ForwardDiffuseLightPipeline также уменьшился с 402 строк (15,7 КБ) до 159 строк и 6 КБ. Размеры включают комментарии и не минифицированы.В производственном пакете разница будет ещё больше. Это работа, которую мы продолжим в следующем выпуске, когда мы сделаем те же обновления для конвейера FlatTintPipeline, отвечающего за рендеринг объектов Graphics, и рассмотрим возможность консолидации шейдеров, что позволит вам использовать Graphics и Sprites в списке отображения без затрат на переключение шейдеров. * Теперь вы можете установить размер батча WebGL в конфигурации игры через свойство batchSize. По умолчанию значение равно 2000, прежде чем батч будет очищен, что является счастливым средним между настольными компьютерами и мобильными устройствами. Если вы ориентируетесь на настольные компьютеры, вы можете увеличить это значение, чтобы снизить количество вызовов рисования.

  • Введён новый метод batchVertices, который добавляет блок вершин в текущий батч. Этот метод теперь используется внутренне почти всеми функциями рендеринга.
  • Шейдер имеет новое атрибутное поле: tintEffect. Это одно значение типа FLOAT.
  • Размер вершин увеличился на 1 FLOAT для учёта дополнительного атрибутного поля шейдера.
  • Все функции рендеринга теперь используют класс TransformMatrix гораздо чаще, чем раньше. Это позволяет выполнять операции с матрицами в режиме реального времени и уменьшает объём кода.
  • Метод drawTexture был удалён. Он был заменён методом drawTextureFrame, который имеет новый и более компактный синтаксис. Подробности см.в документации API.
  • Метод batchTileSprite был удалён. Теперь он обрабатывается в функции рендеринга WebGL TileSprite.
  • Метод drawStaticTilemapLayer был удалён. Теперь он обрабатывается в функции рендеринга WebGL Static Tilemap Layer.
  • Метод drawEmitterManager был удалён. Теперь он обрабатывается в функции рендеринга WebGL Particle Manager.
  • Метод batchText был удалён. Теперь он обрабатывается в функции рендеринга WebGL Static Text.
  • Метод batchDynamicTilemapLayer был удалён. Теперь он обрабатывается в функции рендеринга WebGL Dynamic Tilemap Layer.
  • Метод batchMesh был удалён. Теперь он обрабатывается в функции рендеринга WebGL Mesh.
  • Метод batchBitmapText был удалён. Теперь он обрабатывается в функции рендеринга WebGL BitmapText.
  • Метод batchDynamicBitmapText был удалён. Теперь он обрабатывается в функции рендеринга WebGL DynamicBitmapText.
  • Метод batchBlitter был удалён. Теперь он обрабатывается в функции рендеринга WebGL Blitter. В связи с изменениями в текстурном тинт-пайплайне класс Textures.Frame также был обновлен. Следующие изменения касаются данных UV-карты:* Ранее данные UV-карты занимали 8 свойств: x0, y0, x1, y1, x2, y2, x3 и y3 и хранились в объекте data.uvs. Эти свойства были заменены на прямые доступные свойства: u0, v0, u1 и v1. Эти 4 свойства теперь используются напрямую во всех кодах рендерера. Хотя было яснее иметь 8 свойств, 4 из них были просто дубликатами, поэтому мы обменяли немного ясности на меньший общий объект и меньше обращений к словарю.
  • Объект Frame.uvs (и соответствующий объект Frame.data.uvs) был удален.

Новые тинт-эффекты

В дополнение к упрощению текстурного тинт-пайплайна, я также обновил шейдер. Теперь он имеет новое свойство 'tintEffect', которое позволяет контролировать, как тинт применяется к игровому объекту. По умолчанию тинтинг работал так, что значения цвета тинта умножались на значения пикселей текстуры. Это означало, что вы не могли делать такие вещи, как тинтинг игрового объекта белым цветом, потому что умножение цвета на белый не изменяет его. Новый режим тинта позволяет вам буквально заменять значения цвета пикселей.* setTintFill — это новый метод доступный для всех игровых объектов, имеющих компонент Tint. Он отличается от setTint тем, что цвета буквально заменяют значения пикселей текстуры (сохраняя прозрачность). Это означает, что вы теперь можете создавать эффекты, такие как вспышка спрайта белым цветом при попадании или красным при повреждении, и т.д. Вы все еще можете использовать разные цвета для каждого угла игрового объекта, позволяя вам создавать красивые плавные градиентные эффекты.

  • tintFill — это новое булевое свойство, которое позволяет переключаться между двумя разными типами тинта: умножение или замена.
  • isTinted — это новое только для чтения булевое свойство, которое указывает, тинтован ли игровой объект или нет. Полезно для определения, нужно ли сбрасывать тинт после эффекта.
  • Mesh.tintFill позволяет контролировать эффект тинта, применяемый к вершинам сетки при смешивании цветов.Документация по компоненту Tint была переработана для объяснения этих различий более подробно, и вы можете найти множество новых примеров.

Новый компонент обрезки текстуры

Существует новый компонент игрового объекта TextureCrop. Он заменяет компонент Текстуры (который все еще существует) и добавляет возможность обрезки используемой текстуры. Этот компонент теперь используется для игровых объектов Sprite и Image. Вы можете обрезать используемый кадр с помощью нового метода setCrop. Обрезка представляет собой прямоугольник, ограничивающий область текстурного кадра, которая видима во время рендеринга. Обрезка объекта игры не изменяет его размер, размеры, тело физики или область столкновения, она просто изменяет то, что отображается при рендеринге. Это идеально для скрытия части спрайта без использования маски или для эффектов, таких как отображение прогресса или полосы загрузки. Обрезка работает даже в том случае, если объект игры перевёрнут или является обрезанным кадром из атласа.

  • Вы можете включать и выключать обрезку у объекта игры, изменяя булево значение isCropped в любое время.

  • Обрезка автоматически применяется заново, когда текстура или кадр объекта игры изменяются. Если вы хотите отключить это поведение, выключите обрезку перед изменением кадра.### Новые возможности, обновления и исправление ошибок для BitmapText

  • Объекты Multi-line BitmapText теперь могут быть выровнены. Конструктор имеет новый аргумент align, который может принимать значения выравнивания по левому краю (по умолчанию), по центру или по правому краю. Выравнивание осуществляется путем вычисления самой длинной строки текста в объекте и смещения других строк для совпадения с ней.

  • BitmapText.setCenterAlign — это новый цепной метод для выравнивания текста по центру.

  • BitmapText.setLeftAlign — это новый цепной метод для выравнивания текста по левому краю.

  • BitmapText.setRightAlign — это новый цепной метод для выравнивания текста по правому краю.

  • BitmapText.align — это новое свойство, которое хранит выравнивание текста.

  • BitmapText.setFont — это новый метод, который позволяет изменять шрифт, используемый для рендеринга.

  • Внутри все свойства BitmapText были переименованы с добавлением подчеркивания (например, letterSpacing теперь _letterSpacing), чтобы не изменять API. Для них добавлены геттеры и сеттеры.

  • Внутри добавлен новый флаг dirty, который отслеживает, изменилась ли какая-либо часть BitmapText. Этот флаг используется при получении объекта границ BitmapText, который используется в рендерере для выравнивания строк, а также в свойствах width и height. Флаг dirty гарантирует, что границы пересчитываются только при изменении, что уменьшает количество ненужных вычислений.* GetBitmapTextSize, используемый внутренне в объектах BitmapText Game Objects, теперь будет выдавать разные границы по сравнению с предыдущей версией. Ранее границы были тесно прилегающими к буквам в тексте. Однако это означало, что границы не были правильно выровнены относительно начала BitmapText, и следовательно, вы могли получить разные границы, если текст состоял из разных символов. Теперь границы вычисляются исключительно на основе данных глифа и значений интервалов между буквами. Это даст более стабильный общий опыт, но это означает, что если вы использовали границы для позиционирования текста ранее, вам придется пересмотреть этот код снова. Подробнее см. issue #3799 (и обсудить это дальше, если вы хотите) (спасибо @SBCGames).

  • GetBitmapTextSize и его открытый метод BitmapText.getTextBounds теперь учитывают отображаемое начало BitmapText в глобальном положении, возвращаемом.

  • WebGL-рендерер BitmapText неправильно вычислял масштаб шрифта при очень маленьких размерах, что приводило к перекрытию символов, когда этого не должно было быть. Теперь масштаб применяется к правильным компонентам в коде рендера.

  • В WebGL текст BitmapText отсекался, если указывалось значение разрешения > 1. Исправление #3642 (спасибо @kanthi0802).

  • В WebGL текст DynamicBitmapText с установленным выравниванием по краям не рисовался, если что-либо было выше его в списке отображения.Теперь он корректно выравнивается, независимо от того, что находится выше или ниже его в списке отображения.

    • Класс DynamicBitmapText теперь наследует класс BitmapText. Это экономит много места в пакете и объединяет функциональность между двумя классами. Будьте внимательны к этому, если у вас есть классы, которые наследуются от одного из них.
    • Если вы использовали displayCallback в классе DynamicBitmapText, он генерировал новый объект, содержащий все данные глифов, каждый кадр для каждого глифа, и отправлял его в обратный вызов. Это было изменено так, чтобы теперь использовать кэшированный локальный объект: callbackData. Этот объект перерабатывается для каждого глифа, что прекращает ненужное накопление сборки мусора. ### Новые функции, обновления и исправления ошибок в динамическом слое TilesПожалуйста, обратите внимание, что термин "Dynamic Tilemap Layer" переведен как "динамический слой карты" для сохранения смысла и структуры оригинального термина.
  • DynamicTilemapLayer.tilesDrawn — это только-для-чтения свойство, которое содержит количество плиток, отправленных рендеру в предыдущем кадре.

  • DynamicTilemapLayer.tilesTotal — это только-для-чтения свойство, которое содержит общее количество плиток в слое, обновляющееся каждый кадр.

  • DynamicTilemapLayer.skipCull и связанное с ним цепочечное методом setSkipCull позволяют контролировать, должны ли камеры исключать плитки слоя перед их рендерингом или нет. По умолчанию они будут исключать, чтобы избежать пере-рендеринга, но в некоторых случаях вы можете захотеть отключить это и теперь можете это сделать, переключая это свойство.

  • Компонент CullTiles, используемый Dynamic Tilemap, был переписан с нуля, чтобы воспользоваться обновлениями в системе камер. Теперь он правильно исключает плитки, независимо от масштаба слоя или зума камеры. Он также теперь поддерживает свойство слоя skipCull, позволяющее вам переопределить исключение. Лабораторный демонстрационный пример генератора подземелий теперь снова работает благодаря этому исправлению и был обновлен с режимом отладки и пользовательским интерфейсом управления камерой.Вы можете редактировать исходный пример, чтобы переключаться между четырьмя разными планировками подземелий, от 2500 плиток до 1 миллиона плиток. Однако есть ограничения в работе исключения. Если вы повернете камеру, вы можете заметить края исключения. Вы можете отключить это с помощью нового свойства skipCull. Исправление этого также исправило #3818 (спасибо @Mursaat).

  • DynamicTilemapLayer.cullPaddingX, cullPaddingY и связанное с ними цепочечное методом setCullPadding позволяют контролировать, сколько дополнительных плиток добавляется в прямоугольник исключения при его вычислении. Если вы обнаружите, что размер камеры и настройки зума приводят к раннему исключению плиток, что приводит к обрезанию при прокрутке, установите значения cullPadding, чтобы добавить дополнительные слои плиток к вычислениям в обоих направлениях без необходимости полностью отключать исключение.

  • DynamicTilemapLayer.cullCallback позволяет изменять функцию, используемую для выполнения исключения плиток. По умолчанию он вызывает TilemapComponents.CullTiles, но вы можете переопределить это, чтобы вызывать любую функцию, которую пожелаете. Ему передаются три аргумента: данные слоя, камера и массив для хранения плиток. Используя эту функциональность, вы теперь можете создать любую систему исключения, которую вам нужно, если стандартная не подходит для вашей игры. Исправление #3811 (спасибо @georgzoeller)* Слои Dynamic Tilemap теперь правильно поддерживают Pipeline Lights2D. Это означает, что вы можете предоставить обычную карту для набора плит слоя, и она будет освещаться с помощью шейдера Lights правильно. Увидеть новый пример light map в лаборатории для демонстрации. Обратите внимание, что есть ограничения на количество плит, которые можно отрендерить с включенным освещением. Закрыть #3544 (спасибо @FrancescoNegri)

Новые функции

  • Graphics.fillRoundedRect будет рисовать заштрихованный закругленный прямоугольник в объекте Graphics. Радиус углов может быть либо числом, либо объектом, что позволяет указывать разные радиусы для каждого угла (спасибо @TadejZupancic)
  • Graphics.strokeRoundedRect будет рисовать заливаемый закругленный прямоугольник в объекте Graphics. Радиус углов может быть либо числом, либо объектом, что позволяет указывать разные радиусы для каждого угла (спасибо @TadejZupancic)
  • ParticleEmitter.stop — это новый цепной метод для остановки эмиттера частиц. Это то же самое, что установить on в false, но позволяет не прерывать цепочку методов (спасибо @samme)
  • ScenePlugin.pause (и соответствующие методы в системах сцен и менеджере сцен) теперь имеет новый необязательный аргумент data, который передается целевой сцене и излучается в ее событии 'pause'.резюме(и соответствующие методы в системах сцен и менеджере сцен) теперь имеет новый необязательный аргументdata`, который передается целевой сцене и излучается в ее событии 'резюме'.
  • ScenePlugin.sleep (и соответствующие методы в системах сцен и менеджере сцен) теперь имеет новый необязательный аргумент data, который передается целевой сцене и излучается в ее событии 'спать'.
  • ScenePlugin.wake (и соответствующие методы в системах сцен и менеджере сцен) теперь имеет новый необязательный аргумент data, который передается целевой сцене и излучается в ее событии 'проснуться'.
  • ScenePlugin.setActive теперь имеет новый необязательный аргумент data, который передается целевой сцене и излучается в ее событиях 'пауза' или 'резюме'.
  • TileSprite.tileScaleX и tileScaleY — это два новых свойства, которые позволяют контролировать масштаб текстуры внутри Tile Sprite. Это влияет на способ масштабирования повторяющейся текстуры и независимо от масштабирования самого Tile Sprite. Это работает в режимах Canvas и WebGL.
  • TransformMatrix.copyFrom — это новый метод, который копирует заданную матрицу в значения текущей матрицы.
  • TransformMatrix.multiplyWithOffset — это новый метод, который умножает заданную матрицу на текущую матрицу, учитывая дополнительное смещение в результатах. Это используется внутренне в коде рендерера в различных местах.
  • Rectangle.Intersection будет принимать два объекта Rectangle и возвращать область пересечения между ними.Если пересечений нет, возвращается пустой Rectangle.
  • Pointer.prevPosition — это новый объект Vector2, который хранит предыдущее положение указателя до последнего события DOM. Вы можете использовать это для выполнения вычислений между старым и текущим положением, например для отслеживания скорости указателя.
  • Pointer.getInterpolatedPosition — это новый метод, который вернет массив плавно интерполированных значений между старым и предыдущим положением указателя. Вы можете настроить количество шагов интерполяции (по умолчанию 10) и предоставить выходной массив для хранения этих значений. Этот метод полезен, если у вас есть объект, который следует за указателем, и вы хотите убедиться, что он имеет плавное движение (так как DOM часто обрабатывает события указателя быстрее, чем игровой цикл может обновляться).
  • TransformMatrix.copyFromArray заполнит матрицу значениями из данного массива. Где 0, 1, 2, 3, 4 и 5 соответствуют a, b, c, d, e и f.
  • WebGLPipeline имеет новый перегружаемый метод, называемый boot, который вызывается, когда рендерер и все основные игровые системы завершили настройку.
  • KeyboardPlugin.checkDown — это новый метод, который позволяет проверить, нажата ли клавиша или нет в цикле обновления. Разница между этим методом и прямым проверкой свойства Key.isDown заключается в том, что вы можете предоставить продолжительность этому методу.Например, если вы хотите, чтобы нажатие клавиши выпускало пулю, но хотели бы, чтобы она могла выпускать пулю каждые 100 миллисекунд, вы можете вызвать этот метод с продолжительностью 100, и он будет возвращать true каждые 100 миллисекунд.

Обновления

  • Метод DataManager.removeValue (а также метод remove) больше не передаст родительский объект DataManager как второй аргумент в событие removedata, чтобы сохранить последовательность с событиями set (спасибо @rexrainbow)
  • Документация для события filecomplete загрузчика указывала, что можно прослушивать конкретный файл, используя его тип и ключ, например: filecomplete-image-monster, однако, код использовал подчеркивание вместо дефиса. Мы считаем, что дефис выглядит аккуратнее, поэтому код загрузчика был обновлен, что позволяет теперь использовать версию события с дефисом (спасибо @NokFrt)
  • Если объект игры уже перетаскивается, он не может быть перетащен другим указателем (в режиме многотачечного ввода) до тех пор, пока исходный указатель не отпустит его (спасибо @rexrainbow)
  • Вызов Tween.play для твистера, созданного через TweenManager.create, не начинал воспроизведение до тех пор, пока твистер не был добавлен в TweenManager. Теперь вызов play автоматически добавляет твистер в TweenManager, если он еще не находится там (спасибо @pantoninho)
  • Если объект Blitter не имеет Bobs для рендеринга, он теперь немедленно прекращает выполнение, избегая нескольких вызовов контекста в режиме Canvas.* Метод Scene.run теперь передает опциональный объект data во всех случаях, независимо от того, просыпается, возобновляется или начинается сцена (спасибо @rook2pawn).
  • Методы ScenePlugin.start и ScenePlugin.restart теперь всегда помещают операцию в очередь с менеджером сцен, независимо от состояния сцены, чтобы избежать проблем, когда плагины продолжают работать на одном кадре перед завершением (спасибо @jjalonso).
  • Новое свойство Tileset.glTexture отображает WebGL текстуру для изображения Tileset. Это свойство используется внутренне рендерером для избежания дорогостоящих поисков объектов и автоматически устанавливается в методе Tileset.setImage.
  • Новое свойство Frame.glTexture отображает WebGL текстуру для изображения источника текстуры Frame. Это свойство используется внутренне рендерером для избежания дорогостоящих поисков объектов и автоматически устанавливается в конструкторе Frame.
  • Два новых свойства TransformMatrix.e и TransformMatrix.f являются псевдонимами для значений tx и ty.
  • Метод Graphics.arc теперь имеет новый необязательный аргумент overshoot. Это небольшое значение, добавляемое к концу endAngle, что позволяет продлить дугу дальше 360 градусов по умолчанию. Вы можете сделать это, если пытаетесь нарисовать дугу с особенно толстой линией, чтобы гарантировать отсутствие пропусков. Исправление #3798 (спасибо @jjalonso). * Парсер таблицы текстур TextureManager теперь будет выводить краткое предупреждение в консоль, если вы укажете недопустимые размеры кадров, что приведет к отсутствию сгенерированных кадров (спасибо @andygroff)
    • Объект игры Quad теперь имеет новый метод setFrame, который позволяет изменять кадр, отображаемый объектом Quad, включая использование кадров, являющихся частью текстурного атласа. Исправление #3161 (спасибо @halgorithm)
    • Компонент ScenePlugin теперь будет помещать все следующие операции в очередь менеджера сцен: start, run, pause, resume, sleep, wake, switch и stop. Это означает, что для всех этих вызовов менеджер сцен добавит вызов в свою очередь и обработает его в начале следующего кадра. Это исправляет #3812 и делает работу более предсказуемой (спасибо @Waclaw-I)
    • Метод TransformMatrix.multiply теперь имеет новый необязательный аргумент out, который представляет собой матрицу для хранения результатов умножения. Если этот аргумент не указан, метод будет работать так же, как и раньше, умножая текущую матрицу.
    • Объекты Zones теперь имеют метод setAlpha, который не выполняет никаких действий (NOOP), что позволяет добавлять их в контейнеры (спасибо @TadejZupancic)
    • Метод setPipeline теперь возвращает экземпляр объекта игры, на котором он был вызван. Ранее он возвращал установленный пайплайн, что делало его нецепочным, что противоречило соглашениям, установленным для всех других методов set.Если вы используете setPipeline в вашем коде для получения ссылки на пайплайн, пожалуйста, используйте свойство pipeline объекта игры вместо этого.

Исправления ошибок

  • Событие changedata менеджера данных DataManager теперь отправляет новое значение данных вместо исходного (спасибо @iamchristopher).
  • LoaderPlugin не отправлял событие filecomplete, если хотя бы один из файлов не удалось загрузить, что приводило к невозможности запуска функции create сцены. Исправление #3750 (спасибо @NokFrt).
  • Исправлены вызовы установщиков в BuildGameObjectAnimation, теперь задержка, повторение, задержка повторения и режим yoyo конфигурационного анимационного объекта устанавливаются правильно (спасибо @DannyT).
  • Свойство blocked.none тела Arcade Body теперь устанавливается в false после разделения с статическими телами или плитами. Ранее, направление блокировки устанавливалось правильно, но none оставался true (спасибо @samme).
  • Метод setFrame объекта Bob не устанавливал кадр на объекте Bob, теперь это исправлено. Исправление #3774 (спасибо @NokFrt).
  • Свойство alpha объекта Bob игнорировалось рендерером canvas, работало только в WebGL. Это исправлено.
  • Несмотря на наличие компонента Alpha в объекте Blitter, его установка не оказывала влияния. Теперь установка alpha объекта Blitter влияет на рендеринг всех дочерних объектов, как в Canvas, так и в WebGL, и можно также указать alpha для каждого объекта Bob.* Метод run менеджера сцен SceneManager игнорировал сцены, которые уже находились в очереди для добавления. Теперь сцена добавляется в очередь для запуска, как только она готова (спасибо @rook2pawn).
  • Метод disableInteractive объекта GameObject переключал ввод. Каждый второй вызов включал ввод (спасибо @TadejZupancic).
  • Положение слоя плит TilemapLayer не учитывалось при отсечении плит для камеры. Теперь это учитывается как часть потока отсечения (спасибо @Upperfoot).
  • Исправлено передача дополнительного аргумента в Array.each (спасибо @samme).
  • Объект TileSprite использовал компонент Size вместо ComputedSize, что приводило к неправильным результатам getBounds, displayWidth и displayHeight. Исправление #3789 (спасибо @jjalonso).
  • Метод AddAt класса ArrayUtils не правильно вычислял смещение массива, если передавался массив для слияния с существующим массивом. Это также приводило к ошибке в методе Container.addAt, если передавался массив. Исправление #3788 (спасибо @jjalonso).
  • Свойство camera объекта Pointer теперь устанавливается независимо от наличия подходящего объекта в поле зрения камеры. Теперь это всегда камера, с которой взаимодействует указатель.
  • Добавлен компонент Mask к объекту Container. Работал без него, но теперь соответствует документации и другим объектам игры. Исправление #3797 (спасибо @zilbuz).
  • Менеджер данных не мог переопределить ранее удаленные свойства. Исправление #3803 (спасибо @AleBles @oo7ph). * Функция рисования изображения Canvas была полностью переписана, чтобы теперь правильно поддерживать вычисления матрицы родителя и матрицы камеры. Это исправляет проблему, при которой дочерние элементы внутри контейнеров теряли свою ориентацию и другие проблемы, когда находились в рендерере Canvas. Исправление #3728 (спасибо @samid737)
    • clearMask(true) теперь проверяет наличие маски перед ее уничтожением, чтобы избежать исключения, если объект игры не имеет маски. Исправление #3809 (спасибо @NokFrt)
    • В WebGL GeometryMask стеклянная маска была изменена с INVERT на KEEP, чтобы исправить проблемы при маскировании графических объектов и других сложных объектов. Исправление #3807. Это также исправляет проблему, при которой дочерние элементы внутри контейнеров отображались некорректно вне Geometry маски. Исправление #3746 (спасибо @zilbuz @oklar)
    • BitmapMask.destroy теперь удаляет текстуры и буферы кадров, созданные рендерером WebGL, как часть процесса уничтожения. Исправление #3771 (спасибо @nunof07)### Примеры, документация и TypeScriptМои благодарности следующим людям за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как за отчет об ошибках, так и за помощь в написании документации:

@DannyT @squilibob @dvdbrink @t1gu1 @cyantree @DrevanTonder @mikewesthad @tarsupin @shadowofsoul

Также особая благодарность @andygroff за его отличную работу по улучшению поисковой строки на сайте с примерами, и @hexus за его помощь в завершении документации для игровых объектов.

Версия 3.10.1 - Хаяши - 13 июня 2018

Исправления ошибок

  • Менеджер ввода InputManager создавал только один указатель, даже если в конфигурации был включен ввод с помощью касания. Это означало, что вы не могли использовать события касания, если не вызвали addPointer или не указали один указатель в конфигурации. Теперь, если касание включено в конфигурации, по умолчанию всегда создаются два указателя.

Версия 3.10.0 - Хаяши - 13 июня 2018### Новые возможности и обновления системы ввода

  • Все классы ввода теперь полностью охвачены JSDocs.
  • Менеджер ввода и плагин ввода были обновлены для поддержки нескольких одновременных указателей. Ранее поддерживался только один активный указатель (мышь или касание). Теперь вы можете иметь столько активных указателей, сколько вам нужно, что позволяет создавать сложные игры с множественным касанием. Эти указатели хранятся в массиве pointers менеджера ввода.
  • Метод addPointer позволяет добавлять один или несколько новых указателей в менеджер ввода. Нет жестко закодированного ограничения на количество указателей, хотя на практике вам никогда не потребуется больше 10. Этот метод доступен как в менеджере ввода, так и в плагине, что позволяет использовать this.input.addPointer из кода вашей игры.
  • Свойство pointersTotal менеджера ввода содержит общее количество активных указателей, которое можно установить в конфигурации игры с помощью свойства input.activePointers. Phaser создает 2 указателя при запуске, если другое значение не указано в конфигурации, или вы можете добавить их в процессе выполнения.
  • Новое свойство mousePointer специально выделено для использования мыши. Это идеально подходит для игр только для настольных компьютеров, но следует игнорировать, если вы создаете игру с использованием мыши и касания (используйте activePointer вместо этого).* Свойство activePointer теперь отражает самый недавно активный указатель в игре, который считается указателем, взаимодействовавшим с областью рисования игры недавно.
    • Менеджер ввода и плагин ввода имеют три новых метода: addUpCallback, addDownCallback и addMoveCallback. Эти методы позволяют добавлять обратные вызовы, которые будут вызваны каждый раз, когда происходит нативное событие мыши или касания DOM. Обратные вызовы, переданные этому методу, вызываются немедленно при получении события DOM, в контексте обработчика события DOM. Поэтому они считаются "нативными" с точки зрения браузера. Это означает, что они могут использоваться для задач, таких как открытие новых окон браузера или любых действий, которые явно требуют активации пользовательским вводом. Однако из-за этого они приносят свои собственные риски и, как следствие, не должны использоваться для общего ввода в игре, а должны использоваться только для особых случаев. Обратные вызовы могут быть установлены как isOnce, чтобы контролировать, вызывается ли обратный вызов один раз и удаляется, или каждый раз, когда происходит событие DOM.
    • Указатель имеет два новых свойства worldX и worldY, которые содержат положение указателя, преобразованное в пространство координат последней камеры, с которой он взаимодействовал.* При проверке, взаимодействовал ли указатель с какими-либо объектами, теперь будет перебираться список камер. Ранее проверка производилась только по самой верхней камере в списке, но теперь, если верхняя камера не вернула ничего, проверка будет продолжена по следующей камере и так далее. Это также решает проблему #3631 (спасибо @samid737).
    • InputManager.dirty — это новое внутреннее свойство, которое отражает, был ли обновлен какой-либо указатель в текущем кадре.
    • InputManager.update теперь использует внутренние константы для проверки типа события, вместо строковых значений, как это было раньше.
    • InputManager.startPointer — это новый внутренний метод, автоматически вызываемый циклом обновления, который обрабатывает события начала касания.
    • InputManager.updatePointer — это новый внутренний метод, автоматически вызываемый циклом обновления, который обрабатывает события перемещения касания.
    • InputManager.stopPointer — это новый внутренний метод, автоматически вызываемый циклом обновления, который обрабатывает события окончания касания.
    • Аргументы метода InputManager.hitTest были изменены. Теперь он принимает объект указателя (из которого извлекаются координаты x/y), вместо того чтобы принимать x/y как первые два аргумента.
    • Метод TouchManager.handler был удален, так как больше не используется внутренне.
    • TouchManager.onTouchStart, onTouchMove и onTouchEnd — это новые обработчики событий касания DOM.Они передают события в методы queueTouchStart, queueTouchMove и queueTouchEnd класса InputManager соответственно.
    • Метод MouseManager.handler был удален, так как больше не используется внутренне.
    • MouseManager.onMouseDown, onMouseMove и onMouseUp — это новые обработчики событий мыши DOM. Они передают события в методы queueMouseDown, queueMouseMove и queueMouseUp класса InputManager соответственно.
    • Установка свойства enabled в значение false для TouchManager, MouseManager или KeyboardManager предотвратит обработку любых нативных событий DOM до тех пор, пока это свойство не будет снова установлено.
    • InputPlugin имеет следующие новые только для чтения свойства: mousePointer, pointer1, pointer2, pointer3, pointer4, pointer5, pointer6, pointer7, pointer8 и pointer10. Большинство из этих свойств будут неопределены, пока вы не вызовете метод addPointer или не установите количество активных указателей в конфигурации игры.
    • InputManager имеет новый метод transformPointer, который устанавливает преобразованные свойства x и y указателя в одном вызове, вместо двух вызовов, как это было раньше. Этот метод теперь используется всеми обработчиками событий указателя.
    • InputPlugin имеет новый метод makePixelPerfect, который позволяет указать текстуру-основу для игрового объекта как пиксель-совершенный при выполнении всех проверок ввода. Вы можете использовать его следующим образом: this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect()), или более простым способом: setInteractive({ pixelPerfect: true }) — вы также можете передать или установить необязательный уровень терпимости по прозрачности. См. документацию метода для полных подробностей и новых примеров, чтобы увидеть его в действии. Обратите внимание, что при взаимодействии указателя с игровым объектом будет постоянно проверяться текстура, извлекая один пиксель из заданных координат и проверяя его цветовые значения. Этот процесс является дорогостоящим, поэтому он должен быть включен только для тех игровых объектов, которые действительно в этом нуждаются. ### Ввод - Пользовательские указатели* Теперь вы можете задать пользовательский указатель для вашей игры через this.input.setDefaultCursor(). Это примет любую допустимую строку CSS указателя, включая URL к файлам изображений указателя.
  • Теперь вы можете задать пользовательский указатель для конкретных объектов игры. Это примет любую допустимую строку CSS указателя, включая URL к файлам изображений указателя, и используется всякий раз, когда указатель находится над этим объектом игры. Например, чтобы показать указатель руки над кнопкой спрайта, вы можете сделать: button.input.cursor = 'pointer', или чтобы показать указатель помощи: button.input.cursor = 'help', или чтобы показать пользовательское изображение: button.input.cursor = 'url(assets/cursors/sword.cur), pointer'.
  • Вы также можете задать пользовательский указатель в новом объекте конфигурации ввода. Чтобы использовать pointer (указатель руки) там есть новый сокращённый способ: setInteractive({ useHandCursor: true }). Чтобы использовать что-либо ещё: setInteractive({ cursor: CSSString }), где CSSString — это любая допустимая строка CSS для задания указателя.
  • Пожалуйста, будьте осведомлены о ограничениях при использовании изображений указателей между браузерами. Это зависит от вас найти подходящий формат и размер, который подходит для браузеров, которые вы хотите поддерживать (заметка: практически все современные браузеры больше не поддерживают анимированные CSS указатели).### Ввод - Объекты конфигурации* Метод setInteractive теперь может принимать объект конфигурации ввода в качестве единственного аргумента. Это позволяет задавать несколько свойств, связанных с вводом, в одном вызове, например: setInteractive({ draggable: true, pixelPerfect: true }). Доступные свойства включают:
    • hitArea - Объект / форма для использования в качестве области удара. Если не указано, попытается создать прямоугольник на основе кадра текстуры.
    • hitAreaCallback - Возвратный вызов, который определяет, находится ли указатель внутри формы области удара или нет.
    • draggable - Если true, то взаимодействующий объект будет установлен для перетаскивания и будет излучать события перетаскивания.
    • dropZone - Если true, то взаимодействующий объект будет установлен для перетаскивания объектов.
    • useHandCursor - Если true, то взаимодействующий объект будет установлен для использования указателя руки, когда указатель находится над ним. Это сокращённый способ установки cursor: 'pointer'.
    • cursor - Строка CSS для использования, когда указатель находится над этим взаимодействующим объектом.
    • pixelPerfect - Если true, то будет установлен функционал точного пикселя для возвратного вызова области удара. Работает только с объектами игры на основе текстур.
    • alphaTolerance - Если pixelPerfect установлен, это пороговое значение порога прозрачности, используемое в возвратном вызове.

Ввод - Обновления менеджера клавиатуры

  • Класс KeyboardManager был удален.Он был заменен на KeyboardPlugin, который теперь является плагином уровня ввода и регистрируется сам с помощью нового InputPluginCache. Класс плагина ввода (который принадлежит сцене) теперь автоматически внедряет зарегистрированные плагины в себя при запуске. Каждая сцена имеет собственный экземпляр плагина ввода (если он включен в плагинах сцены), который в свою очередь имеет собственный экземпляр KeyboardPlugin. Класс InputManager больше не имеет никаких ссылок на класс Keyboard. Преимущества этого двойные: во-первых, теперь вы можете полностью исключить все классы клавиатуры из пользовательского сборки, что экономит много места, если они не требуются. Во-вторых, это означает, что сцены теперь отвечают за события клавиатуры, в то время как ранее они были глобальными. Это означает, что сцену можно приостановить и прекратить обработку событий клавиатуры, а также прекратить обновление объектов клавиатуры, в то время как другая сцена может продолжать это делать. Это также предотвращает вызовы обратных вызовов, связанных с клавиатурой, в спящих сценах (что решает проблему #3733, спасибо @JoeMoov2).

  • Метод KeyboardManager.handler был переименован в onKeyHandler.

  • Свойство KeyboardManager.captures было удалено, так как его можно более эффективно обрабатывать путем опроса объекта keys.* Менеджер клавиатуры больше не обрабатывает события нажатия и отпускания клавиш, если его свойство enabled установлено в false, или если сцена, к которой он принадлежит, не активна.

  • Менеджер клавиатуры теперь вызывает event.preventDefault на нативном событии DOM, если ключ существует в массиве ключей и его свойство preventDefault установлено в true (что является значением по умолчанию). Это означает, что теперь вы можете контролировать конкретно, какие ключи предотвращают выполнение по умолчанию в браузере, в то время как ранее каждый добавленный ключ делал это.

  • Методы KeyboardManager.addKeyCapture и removeKeyCapture были удалены, так как теперь вы контролируете, какие ключи предотвращают захват, используя методы addKey или addKeys (см. выше). Создание ключа теперь достаточно для включения захвата и может быть переключено (во время выполнения) для каждого ключа отдельно.

  • Метод KeyboardManager.addKeys теперь может принимать объект, коды клавиш или строку, разделенную запятыми, как входные данные. Это означает, что теперь вы можете сделать: keyboard.addKeys('W,S,A,D') и получить объект с свойствами WSAD, отображающими соответствующие объекты ключей.

  • Метод KeyboardManager.addKey теперь может принимать объект ключа, строку, такую как A или SPACE, или значение кода клавиши.

  • Метод KeyboardManager.removeKey теперь может принимать либо объект Key, либо строку, такую как A или SPACE, либо значение кода клавиши.### Ввод - Обновления управляющего модуля для джойстикаДля точного перевода необходимо знать исходный язык текста. Предполагая, что исходный текст на английском, вышеуказанный перевод соответствует заданным правилам. Если исходный текст на другом языке, пожалуйста, предоставьте его для точного перевода.

Класс GamepadManager был удален. Он был заменен на GamepadPlugin, который теперь является плагином уровня ввода и регистрируется сам с новым InputPluginCache. Класс плагина ввода (который принадлежит сцене) теперь автоматически внедряет зарегистрированные плагины в себя при запуске. Каждая сцена имеет собственный экземпляр плагина ввода (если он включен в плагинах сцены), который в свою очередь имеет собственный экземпляр плагина GamepadPlugin. Класс InputManager больше не имеет никаких ссылок на класс Gamepad вовсе. Преимущества этого двойные: во-первых, теперь вы можете полностью исключить все классы Gamepad из кастомной сборки, экономя много места, если они не требуются. Во-вторых, это означает, что сами сцены теперь отвечают за события Gamepad, в отличие от глобального поведения ранее. Это означает, что сцену можно приостановить и прекратить обработку событий Gamepad, а также прекратить обновление объектов Gamepad, в то время как другая сцена может продолжать это делать. Это также предотвращает вызовы обратных вызовов, связанных с Gamepad, в спящих сценах.* Плагин Gamepad был переписан с нуля. Теперь он предлагает гораздо больше функций и намного более легкий доступ к Gamepad и их свойствам. Вы можете теперь получить доступ к первым четырем Gamepad, подключенным к браузеру, через свойства pad1 до pad4, что позволяет вам делать: this.input.gamepad.pad1 для прямого доступа к паду после подключения.

  • Класс Gamepad также был переписан с нуля. Он больше не создает кнопки или оси динамически, а делает это при инициализации.

  • Класс Gamepad теперь имеет множество новых свойств для легкого доступа к различным стандартным кнопкам и осям. Эти свойства включают left, right, up, down для направлений, A, Y, X и B для кнопок, L1, L2, R1 и R2 для кнопок плечей, а также leftStick и rightStick для осевых стиков. Вы все еще можете использовать Gamepad.getButtonValue() для получения значения кнопки и Gamepad.getButtonTotal() для получения общего числа кнопок на паде.

  • Gamepad.getAxisTotal и Gamepad.getAxisValue теперь возвращают общее число осей и значение оси соответственно.

  • Gamepad.setAxisThreshold теперь позволяет вам установить порог для всех осей Gamepad в одном вызове.* Объекты кнопок Gamepad теперь издают 2 события: одно от кнопки самой по себе и другое от Gamepad. Это означает, что вы можете отслеживать события кнопок тремя способами: 1) Прямым опросом значения кнопки в цикле обновления, 2) Отслеживанием событий на плагине Gamepad: this.input.gamepad.on('down'), или 3) Отслеживанием событий на самом Gamepad: gamepadReference.on('down'). ### Новые функции физики Arcade + Обновления* Теперь Arcade Physics использует фиксированный временной шаг для всех внутренних вычислений. В конфигурации появилось новое значение fps (по умолчанию 60 fps), которое можно изменять в процессе выполнения с помощью метода setFPS. Основной цикл обновления переписан так, чтобы он шагал исключительно на основе заданной частоты кадров, а не на основе времени выполнения или дельты шага игры. Этот фиксированный временной шаг позволяет реализовать детерминированное состояние игры. Это означает, что теперь вы можете установить частоту кадров на высокое значение, например 240 fps, независимо от скорости обновления браузера (он просто выполнит больше шагов физики на каждом шаге игры). Это полезно, если вы хотите повысить точность симуляции в определенных случаях.

  • Вы также можете вызывать функцию step напрямую, чтобы вручную продвигать симуляцию.* Введено новое свойство timeScale, которое масштабирует все вычисления временного шага в процессе выполнения, позволяя вам ускорять или замедлять симуляцию по своему усмотрению без изменения частоты кадров.

  • Теперь вы можете отключить использование RTree для динамических тел через свойство конфигурации useTree. В некоторых ситуациях, например, в плотно упакованных мирах, это может улучшить производительность. Статические тела всегда будут использовать RTree.

  • Функция collideSpriteVsGroup переписана. Если вы используете RTree, она теперь использует результаты непосредственно из поиска в дереве, а не итерирует всех детей в группе, что значительно уменьшает объем работы. Если вы отключили RTree, она выполняет брутфорсное O(N2) итерирование спрайта против группы. Мы протестировали несколько вариантов сортировки по осям, но затраты на выделение массива и/или сортировку при большом количестве тел (10 000+) значительно превышают простоту математических вычислений в логике разделения.

  • Body.useDamping — это новое булевое свойство, которое позволяет использовать эффект демпфирования для трения, а не стандартное линейное замедление. Это дает гораздо лучшие результаты, если вам нужно плавное замедление по обеим осям, например, как замедляется корабль в игре Asteroids, без характерного смещения осей, связанного с линейным трением.* GetOverlapX и GetOverlapY теперь используют вычисленные дельты, а не методы deltaX/deltaY.

  • collideSpriteVsGroup завершает выполнение на ранней стадии, если тело спрайта отключено.

  • updateMotion имеет новый аргумент delta, который обычно должен быть фиксированным временным шагом.

  • intersects перестроен для приоритизации проверки прямоугольников против прямоугольников.

  • Тело update и postUpdate были переписаны для обработки новой системы фиксированного временного шага. update теперь принимает новый аргумент delta, который используется внутренне для вычислений.

  • Свойство Body.dirty было удалено, так как больше не используется внутренне.

  • Body.deltaAbsX и deltaAbsY теперь возвращают кэшированное абсолютное значение delta из предыдущего обновления, и больше не вычисляют его во время фактического вызова.

  • World.enable было переписано для удаления всех проверок hasOwnProperty и упрощения внутреннего потока.

  • World.disable было переписано для удаления всех проверок hasOwnProperty и упрощения внутреннего потока.

  • World.add — это новый метод, который добавляет существующее тело в симуляцию, и enableBody теперь передает свои новые тела этому методу.

  • World.disableGameObjectBody было удалено, так как дублировало то, что делает метод disable.

  • Теперь есть новый внутренний поток, связанный с созданием и отключением тел. Вызов World.Включает объекты в enableBody, который создает новое тело Body, если это необходимо, и, наконец, передает его в add. World. disableделает то же самое, но удаляет тела из симуляции. Он передает тела вdisableBody, который, в свою очередь, передает их в remove`. Оба этих метода работают как для одного объекта, так и для массива объектов, групп или даже массивов групп.

  • World. computeAngularVelocity — это новый метод, который специфически вычисляет угловую скорость тела.

  • Подпись метода World. computeVelocity была изменена. Вместо того чтобы принимать множество аргументов, он теперь принимает только тело и значение delta. Внутри он теперь вычисляет оба компонента скорости x и y вместе в одном единственном вызове, в отличие от предыдущего разделения на два вызова и множественные присваивания.

  • World. computeVelocity больше не возвращает новые скорости, они теперь устанавливаются напрямую на теле внутри метода.

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

  • World. computeVelocity теперь проверяет свойство Body.используйте useDampingдля выполнения либо линейного замедления, либо затухания на теле.updateMotionтеперь вызывает новые методыcomputeAngularVelocityиcomputeVelocity`.

  • Тела, настроенные для отскока, со временем теряли скорость и останавливались. Это было исправлено в ходе рефакторинга шага по времени и обновлений скорости. Исправление #3593 (спасибо @helmi77)

  • Если тело сталкивается с статическим телом, теперь соответствующие свойства blocked будут установлены (ранее устанавливались только свойства touching). Это означает, что теперь можно использовать проверки типа Body.onFloor() при прохождении через статические тела (спасибо @fariazz)

Новые функции и обновления Data Manager* Теперь вы можете получить доступ к любому значению, заданному в DataManager, с помощью нового свойства values. Например, если вы задали новое значение таким образом: data.set('gold', 50), вы можете получить к нему доступ через: data.values.gold, где оно рассматривается как обычное свойство, позволяющее использовать его в условных оценках if (data.values.level === 2), или изменять его: data.values.gold += 50.

  • Каждый раз, когда значение обновляется, срабатывает событие changedata, независимо от того, было ли значение изменено через метод set или новый подход values.

  • Каждый раз, когда значение обновляется, срабатывает новое событие, названное в соответствии с этим значением. Например, если значение называлось PlayerLives, будет срабатывать событие changedata_PlayerLives. Это происходит независимо от того, было ли значение изменено через метод set или новый подход values.

  • Метод set теперь может принимать объект, содержащий пары ключ-значение, как первый аргумент. Это означает, что вы можете теперь задавать несколько значений одновременно, например: data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }).

  • Метод get теперь может принимать массив ключей, и будет возвращать массив соответствующих значений. Это полезно для разбора массивов в ES6.

  • Метод remove теперь может принимать массив ключей, и будет удалять все соответствующие значения, срабатывая событие removedata для каждого.

  • Порядок событий был обновлен.Когда значение впервые задается и не существует ещё в Data Manager, срабатывает событие setdata. Если значение задается и уже существует, вместо этого срабатывают события changedata и соответствующее событие changedata_key. Установка нового значения больше не вызывает оба события.

  • Функция resetFunction была удалена из аргументов события changedata. Ранее это использовалось для возможности остановить обновление значения, вызвав вместо этого функцию сброса. Однако это создавало новые анонимные функции каждый раз, когда значение обновлялось. Поскольку теперь вы можете получить доступ к сохраненным данным через свойство values, вы можете использовать это для более простых условных проверок и установок.

  • Свойство blockSet было удалено, так как больше не используется внутренне.

  • Внутренне Loader был немного изменён. Вместо того, чтобы каждый файл вызывал загрузку нового батча, теперь используется метод update, который вызывается каждую кадровую фрейм, выполняя ту же работу. Это избегает проблем с распараллеливанием загрузки, когда предварительно загруженные файлы могут вызвать загрузку в процессе уже начавшейся загрузки, что решает проблему #3705 (спасибо @the-simian).

  • Менеджер сцен был обновлён так, чтобы он вызывал Scene. Systems. step во время фаз init, preload и create вашей сцены.Это означает, что любые плагины или пользовательские скрипты, написанные для использования событий Scene Systems preupdate, update или postupdate, должны знать, что эти события теперь вызываются с init, а не только после завершения create.

  • В результате этих двух изменений появилось новое свойство системы, называемое sceneUpdate, которое является ссылкой, которая указывает на вашу функцию Scene.update. Во время init, preload и create эта ссылка всегда указывает на NOOP. После завершения create она переключается на вашу функцию Scene.update. Если у вашей сцены нет такой функции, ссылка остаётся на NOOP. На практике это означает, что ничего не изменилось по сравнению с предыдущими версиями. Функция Scene.update никогда не запускалась до завершения create, и это по-прежнему так. Однако, поскольку внутренние системы сцены теперь обновляются с самого начала init, это означает, что такие вещи, как список обновлений и системы физики, полностью функциональны во время вашего Preloader. Это позволяет вам создавать намного более сложные preloaders, чем раньше. Хотя, с великой властью приходит и великая ответственность, так как теперь на вас лежит обязанность быть осторожным с теми событиями, которые вы потребляете (особенно событиями ввода) во время вашего preloader.

  • Другим побочным эффектом этих изменений является то, что сцены больше не требуют наличия функции update вовсе.Ранее, если она отсутствовала, Менеджер сцен автоматически добавлял её. Теперь это больше не происходит.

Новые функции

  • RenderTexture.resize позволит вам изменить размер подлежащей Render Texture на новые заданные размеры. При этом Render Texture будет очищена (спасибо @saqsun).
  • Rectangle.RandomOutside — это новая функция, которая принимает два прямоугольника, outer и inner, и возвращает случайную точку, которая находится внутри внешнего прямоугольника, но всегда вне внутреннего прямоугольника.
  • Список обновлений теперь имеет новое только для чтения свойство length, что делает его последовательным с Display List (спасибо @samme).
  • Класс 2D Camera имеет два новых только для чтения свойства centerX и centerY, которые возвращают координаты центра области просмотра относительно холста (спасибо @samme).
  • Класс Camera имеет новое свойство visible. Невидимый Camera пропускает рендеринг и тесты ввода для всего, что он может видеть. Это позволяет вам создать, например, мини-камеру и затем включать и выключать её без необходимости каждый раз заново создавать её.
  • Класс Camera имеет новый метод setVisible, который переключает свойство visible.
  • CameraManager.fromJSON теперь устанавливает свойство visible, если оно определено в конфигурации.
  • ScenePlugin.run — это новый метод, который запускает заданную сцену и не изменяет состояние текущей сцены вообще. Если сцена спит, она будет разбужена.Если она приостановлена, она будет возобновлена. Если она вообще не запущена, она будет запущена.
  • TextureManager.getPixelAlpha — это новый метод, который возвращает значение альфа-канала пикселя из заданной текстуры и кадра. Он вернёт null, если координаты были за пределами текстуры, в противном случае значение будет между 0 и 255.
  • Game.isOver — это новое только для чтения булево свойство, которое указывает, находится ли указатель мыши в данный момент над холстом игры или нет. Это свойство устанавливается VisibilityHandler и надёжно работает только на десктопных системах.
  • Новое событие Game.mouseout срабатывает, если указатель мыши покидает холст игры. Вы можете прослушивать его из this.sys.game.events.on('mouseout') изнутри сцены.
  • Новое событие Game.mouseover срабатывает, если указатель мыши входит в холст игры, находясь ранее вне него. Вы можете прослушивать его из this.sys.game.events.on('mouseover') изнутри сцены.
  • Вы теперь можете использовать PhysicsEditor (https://www.codeandweb.com/physicseditor) для создания сложных тел Matter.js. Загружайте их как обычный JSON и передавайте их в Matter Sprite как свойство формы: this.matter.add.sprite(x, y, texture, frame, { shape: shapes.banana }) (где shapes.banana является одним из экспортированных физических форм PhysicsEditor в загруженном JSON-файле). См. пример 'physics/matterjs/advanced shape creation.js' для получения дополнительной информации. ### Обновления* Компонент ForwardDiffuseLightPipeline, используемый системой Lights, теперь устанавливает флаг, если сцена не содержит ни одного источника света. Все игровые объекты теперь проверяют этот флаг и не добавляют себя в батч, если в сцене нет источников света, так как они не будут отображаться в любом случае. Это также избегает проблемы с прозрачным изображением, если вы переключаетесь на новую сцену с включенным менеджером света, но без определенных источников света. Исправление #3707 (спасибо @samvieten).
  • Метод CameraManager.getCameraBelowPointer переименован в getCamerasBelowPointer и теперь возвращает массив всех камер под указанным указателем, а не только верхней. Массив сортируется таким образом, чтобы верхняя камера находилась в начале массива.
  • В методе TimeStep.step проверяются значения rawDelta и delta, чтобы убедиться, что они неотрицательны, что может произойти в Chrome при сбросе дельты и потере синхронизации с значением, переданным в Request Animation Frame. Исправление #3088 (спасибо @Antriel).
  • Компонент Cameras.Controls.Fixed удален. Он был отмечен как устаревший несколько версий назад. Пожалуйста, используйте FixedKeyControl вместо него.
  • Компонент Cameras.Controls.Smoothed удален. Он был отмечен как устаревший несколько версий назад. Пожалуйста, используйте SmoothedKeyControl вместо него.* Метод RenderTexture.drawImage в Canvas неправильно устанавливал значения кадра, что приводило к неправильному масштабированию в рендерере Canvas. Исправление #3710 (спасибо @saqsun).
  • Исправлен метод Math.Matrix4.makeRotationAxis() (спасибо @hexus).
  • Исправлено неправильное использование Math.abs() в методе Math.Quaternion.calculateW() (спасибо @qxzkjp).
  • Менеджеры эмиттеров частиц теперь могут быть добавлены в контейнеры (спасибо @TadejZupancic).
  • Исправлено проблемное определение сигнатуры метода remove() компонента Animation, когда Animation удаляется из AnimationManager. Это препятствовало правильному остановлению удаленных анимаций.
  • Если вы настроили Phaser на использование уже существующего элемента Canvas, он больше не добавляется обратно в DOM (спасибо @NQNStudios).
  • Метод TweenManager.getTweensOf исправлен для предотвращения возможного бесконечного цикла, если в него передано несколько целей (спасибо @cyantree).
  • Взаимодействующие объекты внутри контейнеров продолжали генерировать события ввода, даже если контейнер (или любой предок) был скрыт. Объекты теперь проверяют свое древо предков во время обработки ввода и правильно пропускают события ввода, если они невидимы. Исправление #3620 (спасибо @NemoStein).
  • Исправлено неправильное определение Device.os, которое отображало Linux как ОС на устройствах Android (спасибо @AleBles).

Примеры, документация и TypeScriptБлагодаря работе @hexus мы теперь документируем все пространство имен Math и добились значительного прогресса в документировании объектов игры.

Персонально я также документировал всю систему ввода, что включает в себя 328 классов, свойств и методов для описания, а также множество других областей.

Версия 3.9.0 - Yui - 24 мая 2018### Новые возможности

  • Команда npm run help отобразит дружественный список всех доступных скриптов (сначала выполните npm install)
  • Игра имеет новое свойство hasFocus, которое является только для чтения булевым значением, которое позволяет узнать, имеет ли окно, в которое встроена игра (включая iframe), фокус или нет.
  • Конфигурация игры имеет новое свойство autoFocus, которое по умолчанию равно true и автоматически вызывает window.focus() при запуске игры.
  • Нажатие на холст автоматически вызывает window.focus. Это означает, что в играх, использующих клавиатурные управления, если вы переключаетесь на другое окно или нажимаете вне игры, а затем снова нажимаете на неё, клавиши продолжат работать (в отличие от предыдущего поведения, когда они оставались неактивными).
  • Тело Arcade Physics имеет новое метод setAllowDrag, который переключает свойство allowDrag (спасибо @samme)
  • Тело Arcade Physics имеет новое метод setAllowGravity, который переключает свойство allowGravity (спасибо @samme)
  • Тело Arcade Physics имеет новое метод setAllowRotation, который переключает свойство allowRotation (спасибо @samme)
  • Конфигурация Arcade Physics Group имеет 3 новых свойства, которые можно использовать: allowDrag, allowGravity и allowRotation (спасибо @samme)
  • PluginManager.registerFileType имеет новое свойство addToScene, которое позволяет внедрить новый тип файла в LoaderPlugin данной сцены. Вы можете использовать это, чтобы добавить тип файла в сцену, в которой он был загружен.
  • PluginManager.Установка имеет новое свойство mapping. Это позволяет задать глобальному плагину ключ свойства, чтобы он автоматически внедрялся в любые сцены как экземпляр уровня сцены. Это позволяет иметь один глобальный плагин, работающий в PluginManager, который автоматически внедряется в каждую сцену.
  • Метод Camera.lerp был реализован и позволяет указать линейное значение интерполяции, используемое при следовании за целью, чтобы обеспечить плавное отслеживание камеры.
  • Метод Camera.setLerp является цепочечным методом для установки свойства Camera.lerp.
  • Новое свойство Camera.followOffset позволяет указать смещение от позиции цели, которую следует за камерой (спасибо @hermbit).
  • Метод Camera.setFollowOffset является цепочечным методом для установки свойства Camera.followOffset.
  • Метод Camera.startFollow имеет 4 новых аргумента: lerpX и lerpY, которые позволяют установить значение интерполяции, используемое при следовании за целью. По умолчанию это значение равно 1 (без интерполяции) и offsetX и offsetY, которые позволяют установить значения смещения следования. startFollow теперь сразу устанавливает значения scrollX и scrollY камеры равными координатам позиции цели, чтобы избежать значительного начального линейного интерполяционного смещения в течение первых нескольких preUpdates.
  • Math.Interpolation.SmoothStep — это новый метод, который вернет интерполированное значение сглаженного шага на основе заданного процента и левой и правой границ. * Математика. Интерполяция. SmootherStep — это новый метод, который вернет интерполированное значение более сглаженного шага на основе заданного процента и левой и правой границ. ### Обновления* Container.setInteractive теперь можно вызвать без аргументов, если вы уже вызвали Container.setSize (спасибо Rex).
  • Bob.reset теперь сбросит значения позиции, кадра, отражения, видимости и прозрачности у Bob.
  • VisibilityHandler теперь принимает экземпляр игры в качестве единственного аргумента, вместо эмиттера событий.
  • PluginManager.createEntry — это новый приватный метод для создания записи плагина и возврата её. Это избегает дублирования кода в нескольких других методах, которые теперь используют этот метод.
  • Тип файла плагина теперь имеет новый необязательный аргумент mapping, который позволяет глобальному плагину быть внедренным в сцену как ссылка.
  • TileSprite.preDestroy переименован в preDestroy, чтобы воспользоваться системой обратных вызовов preDestroy.
  • RenderTexture.preDestroy переименован в preDestroy, чтобы воспользоваться системой обратных вызовов preDestroy.
  • Group.destroy теперь учитывает свойство ignoreDestroy.
  • Graphics.preDestroy теперь очищает массив буфера команд.
  • Container.addHandler теперь удаляет слушатель завершения сцены у ребёнка и слушает только destroy.
  • Container.removeHandler теперь восстанавливает слушатель завершения сцены у ребёнка.
  • Container.preDestroy теперь обрабатывает вызовы pre-destroy, такие как очистка контейнера.
  • Blitter.preDestroy теперь очищает список детей и список рендеринга.
  • AudioContextMonkeyPatch обновлен для использования iife. Исправление #3437 (спасибо @NebSehemvi).### Исправленные ошибки
  • PluginManager. destroy не корректно ссылался на плагин, что приводило к выбросу Uncaught TypeError при попытке разрушить экземпляр игры. Исправление #3668 (спасибо @Telokis)
  • Если контейнер и его дочерний элемент были включены в качестве ввода, они теперь будут правильно сортироваться в InputPlugin (спасибо rex)
  • Исправлен TypeError при столкновении группы как единственного аргумента в Arcade Physics. Исправление #3665 (спасибо @samme)
  • Значение tint частицы было некорректно рассчитано, что приводило к инверсии цветовых каналов. Исправление #3643 (спасибо @rgk)
  • Все игровые объекты, находящиеся в контейнерах, дважды уничтожались. Исправление #3644 (спасибо @Yora)
  • Camera. cull теперь точно возвращает только игровые объекты в пределах видимости камеры, а не все. Исправление #3646 (спасибо @KingCosmic @Yora)
  • Событие dragend теперь будет транслироваться только в том случае, если пороговые значения расстояния перетаскивания или времени не были достигнуты. Исправление #3686 (спасибо @RollinSafary)
  • Непосредственное перезапускание твиена сразу после его создания, без предварительного запуска, приводило к тому, что он застревал в очереди добавления менеджера твиенов. Исправление (спасибо @Antriel @zacharysarette)
  • Установка существующего игрового объекта в качестве статического тела Arcade Physics иногда некорректно определяла размеры объекта, например, для TileSprites. Исправление #3690 (спасибо @fariazz)* Взаимодействующие объекты не полностью удалялись из Input Plugin при очистке, что приводило к росту внутреннего массива списка. Исправление #3645 (спасибо @tjb295 за исправление и @rexrainbow за открытие проблемы)
  • Camera shake не влиял на динамические слои карты плиток. Исправление #3669 (спасибо @kainage)### Примеры, документация и TypeScriptБлагодаря работе @hexus у нас теперь документировано почти все пространство имен Math. Это сотни функций, теперь охваченных полной документацией, и работа, которую мы продолжим в ближайшие недели.

Мои благодарности следующим за помощь в Phaser 3 Примерах, Документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:

@mikez @wtravO @thomastanck

Версия 3.8.0 - Клейн - 16 мая 2018

Новый менеджер плагинов

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

Теперь есть новое пространство имен Phaser.Plugins, в котором живут классы. Функции старого PluginManager переместились в новый PluginCache, а PluginManager, доступный по this.plugins из всех сцен по умолчанию, теперь позволяет устанавливать и использовать любой плагин.

Плагины разделены на два разных типа: Глобальный плагин и плагин сцены.

Глобальный плагин — это плагин, который живет внутри менеджера плагинов, а не внутри сцены. Вы можете получить доступ к нему, вызвав PluginManager.get и предоставив ключ. Любые сцены, которые запрашивают плагин таким образом, получают доступ к одному и тому же экземпляру плагина, что позволяет использовать один плагин на нескольких сценах.Плагин сцены - это плагин, предназначенный для выполнения внутри сцены. Эти плагины отличаются от глобальных тем, что их экземпляры не живут внутри менеджера плагинов, а внутри класса систем сцены. И каждая созданная сцена получает свой уникальный экземпляр плагина сцены. Примеры основных плагинов сцены включают плагин ввода, плагин анимации и плагины физики.

Плагины теперь могут быть установлены тремя разными способами: 1) Вы можете предзагрузить их, используя методы load.plugin и новый load.scenePlugin. Это позволит загружать внешние плагины в вашу игру или загружать плагины динамически во время выполнения. 2) Вы можете установить глобальные и сценические плагины в конфигурации вашей игры. Код плагина может быть собран вместе с кодом вашей игры в один пакет. Указав плагины в конфигурации игры, они сразу становятся доступными после загрузки игры. 3) Вы можете установить плагины во время выполнения напрямую из сцены. Плагины также могут создавать новые типы файлов и игровые объекты, которые устанавливаются в соответствующие фабрики. Это означает, что вы теперь можете написать плагин, который добавляет новый тип файла и игровой объект в одном пакете.Новый менеджер плагинов и связанные классы полностью охвачены JSDocs, и в папке plugins в Phaser 3 Labs есть множество новых примеров, так что пожалуйста, изучите и поиграйте с этими мощными новыми возможностями!### Новые возможности* Вы можете передать свои собственные элементы canvas и context в конфигурации игры, и Phaser будет использовать их для рендеринга вместо создания своих собственных. Это также позволяет передать WebGL 2 контекст. Исправление #3653 (спасибо @tgrajewski)

  • В конфигурации WebGLRenderer добавлен новый параметр maxTextures, который основан на gl.MAX_TEXTURE_IMAGE_UNITS, вы можете получить его через новый метод getMaxTextures().
  • В конфигурации WebGLRenderer добавлен новый параметр maxTextureSize, который основан на gl.MAX_TEXTURE_SIZE, вы можете получить его через новый метод getMaxTextureSize().
  • В WebGLRenderer добавлен новый параметр compression, который содержит поддержку сжатых текстур браузером / устройством через gl-расширения, которые заполняются во время init.
  • При вызове generateFrameNames для определения анимации из текстурного атласа вы теперь можете пропустить все параметры конфигурации, и он создаст анимацию, используя каждый найденный в атласе кадр. Пожалуйста, понимайте, что вы не контролируете последовательность этих кадров, если делаете это, и она полностью определяется данными JSON (спасибо @Aram19)
  • Коды клавиш для цифр 0 до 9 на цифровой клавиатуре добавлены. Вы теперь можете использовать их в событиях, например, this.input.keyboard.on('keydown_NUMPAD_ZERO') (спасибо @Gaushao)
  • Все игровые объекты имеют новый метод setRandomPosition, который случайным образом располагает их в определенной области, или если область не указана, в пределах размера игры.### Обновления
  • Game.step теперь отправляет событие prestep, которое некоторые глобальные системы используют для выполнения предварительных задач, например, звук и ввод. Вы можете использовать его для выполнения предварительных задач, что идеально подходит для плагинов.
  • Game.step теперь отправляет событие step. Это событие отправляется один раз на кадр. Вы можете использовать его для подключения плагинов или кода, который существует вне сцены.
  • Game.step теперь отправляет событие poststep. Это последний шанс для выполнения задач перед началом процесса рендеринга.
  • Оптимизирован метод TextureTintPipeline.drawBlitter, чтобы он пропускал бобы, у которых альфа равна нулю, и вызывал setTexture2D только в том случае, если индекс источника боба изменился. Ранее он вызывал его для каждого боба.
  • Game.context теперь устанавливается в WebGLRenderingContext во время инициализации WebGLRenderer.init, если ранее он был неопределен при запуске в WebGL. Если вы предоставили свой собственный контекст, он устанавливается в этот контекст.
  • Метод onStepCallback класса Game был удален. Теперь вы можете слушать новые события шага.
  • Phaser.EventEmitter был неправильно пространством имен, теперь он доступен только через Phaser.Events.EventEmitter (спасибо Tigran)

Исправления ошибок* Тип файла скрипта в загрузчике не создавался правильно из-за отсутствия одного аргумента (спасибо @TadejZupancic)

  • Тип файла плагина в загрузчике не создавался правильно из-за отсутствия одного аргумента.
  • WebAudioSoundManager.unlock теперь проверяет наличие document.body перед установкой слушателей. Исправляет старые версии Firefox, похоже. #3649 (спасибо @squilibob)
  • Utils.Array.BringToTop не мог переместить предпоследний элемент массива из-за ошибки индекса. Исправление #3658 (спасибо @agar3s)
  • Бесконечный рендерер был сломан из-за недопустимого доступа во время TextureSource.init.
  • Animation.yoyo был игнорирован при вычислении следующего кадра для перехода, что приводило к сбою эффекта yoyo. Теперь он корректно работает (спасибо Tomas)
  • Исправлена ошибка в Container.getBoundsTransformMatrix, которая вызывала отсутствующий метод, что приводило к ошибке getBounds для вложенного контейнера. Исправление #3624 (спасибо @poasher)
  • Вызов создателя, такого как GraphicsCreator, без передачи объекта конфигурации, приводил к выбросу ошибки. Все создатели объектов игры теперь ловят эту ошибку.### Примеры, документация и TypeScript

Большое спасибо следующим за помощь в примерах Phaser 3, документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:

@samme @mzguimaraes @NaNdreas @Matthew-Herman @melissaelopez @TheColorRed

Версия 3.7.1 - Sinon - 8 мая 2018### Новые возможности* В Phaser 3 Labs появился удобный поисковый блок благодаря @NemoStein — он позволяет фильтровать категории примеров.

  • Мы добавили компонент Mask, который доступен для почти всех объектов игры. Он включает методы setMask, clearMask, createBitmapMask и createGeometryMask.

  • CanvasTexture — это новое расширение объекта Texture, специально созданное для случаев, когда используется элемент Canvas в качестве исходного изображения текстуры, которую вы хотите рисовать программно с помощью Canvas API. Это было возможно в предыдущих версиях, так как объект Texture поддерживал использование Canvas в качестве исходного изображения, но мы упростили процесс и сделали его намного удобнее для обновления результирующего WebGLTexture на GPU. Чтобы создать CanvasTexture, просто вызовите метод TextureManager.createCanvas, как и раньше, только теперь вы получите объект CanvasTexture с вспомогательными свойствами и методами. Подробнее см. полные JSDocs.

  • RandomDataGenerator получил новый метод: shuffle, который позволяет перемешивать массив с использованием текущего RNG-семени (спасибо @wtravO).

  • Управление текстурами теперь поддерживает нормальные карты для Atlas JSON (в обоих форматах — хэш и массив), Atlas XML и Atlas Unity.

  • Все объекты игры имеют новый метод disableInteractive, который отключает привязанный к ним объект Interactive. Вы можете снова включить его, вызвав setInteractive без аргументов.* Все объекты игры имеют новый метод removeInteractive, который полностью уничтожает привязанный к ним объект Interactive. Используйте этот метод, если объект игры больше не требует никакого ввода, но вы не хотите уничтожать сам объект игры. ### Новые функции загрузчика и важные обновленияЗагрузчик был переработан для улучшения его производительности и расширяемости и получил следующие новые функции:

  • Восстановлен популярный функционал из Phaser 2: Loader Packs. Это JSON-файлы, содержащие множество файлов для загрузки. Теперь вы можете загружать пак в Loader, и он будет распарсить его и автоматически добавит содержимое в текущую очередь загрузки. Содержимое может быть любым файлом, который может обрабатывать Loader, включая другие паки! Для получения дополнительной информации обратитесь к документации и примерам.

  • Loader больше не блокируется во время загрузки. Новые файлы могут быть добавлены в очередь загрузки даже во время процесса загрузки. Именно так работает новая функция паков. В результате, если вы будете часто добавлять файлы, ваша полоса прогресса может прыгать, так как она основана на количестве файлов в Loader в данный момент времени. Если вы добавите много новых файлов, она может показаться уменьшившейся. Это зависит от вас, как вы будете обрабатывать это в вашем коде, или создадите тип графики загрузки, который не подчеркивает это (например, вращающийся круг вместо полосы прогресса).

  • Loader теперь обрабатывает поток данных немного по-другому. Ранее он загружал каждый файл, и только после того, как все они были загружены, он обрабатывал их по порядку. Это добавляло их в различные кэши, создавал текстуры и так далее.Теперь это происходит сразу после загрузки файла, так как браузер, вероятно, будет в основном бездействовать в это время, поэтому это позволяет нам распределить обработку файлов на протяжении всего времени загрузки, а не в одном пакете в конце.

    • Загрузка аудио-спрайта изменилась. Теперь вы указываете JSON-файл в первую очередь, и если вы хотите, вы можете пропустить URL-адреса аудиофайлов и позволить Loader определить их из метаданных JSON.
    • Loader имеет новый тип файла: atlasXML, который загружает XML-атлас текстур в формате Shoebox / Starling / Flash CC.
    • Тип файла multiatlas Loader изменился. Теперь вам не нужно указывать URL-адреса изображений, вместо этого Loader читает их из JSON-данных и автоматически добавляет их в Loader.
    • Теперь каждый тип файла, поддерживаемый Loader, может быть загружен как через аргументы метода, так и через объект конфигурации, или массив объектов конфигурации. Ранее это было возможно только для некоторых из них, но теперь они все используют одинаковый код. Обратитесь к новым примерам, демонстрирующим это.
    • Если вы использовали пакет файлов сцены, то формат объекта изменился. Ранее это было свойство files в конфигурации сцены, которое было массивом файлов для загрузки. Теперь это переименовано в pack и это объект, точно соответствующий новому формату файла пака. Пожалуйста, обратитесь к примеру загрузчика scene files payload.js для примера.Кратко, если у вас было: files: [] ранее, просто измените это на pack: { files: [] }, и это будет работать.
  • Загрузчик теперь поддерживает текстурные атласы с нормальными картами. Ранее он поддерживал только одиночные изображения, загруженные с нормальными картами, но теперь вы можете предоставить их для всех форматов атласов (json, xml и Unity).

  • Функция multiatlas загрузчика теперь автоматически загружает нормальные карты текстур, если они указаны в json.

  • Бинарные файлы имеют новый необязательный аргумент и свойство dataType, который приведёт бинарные данные к указанному формату после загрузки, перед вставкой их в кэш, например: load.binary('mod', 'music.mod', Uint8Array).

  • Метод LoaderPlugin.tilemapWeltmeister был переименован в более дружественный LoaderPlugin.tilemapImpact. Все остальное осталось без изменений, но пожалуйста, обновите его использование на новое имя метода.

Обновления загрузчика

  • Загрузчик и все связанные с ним типы файлов теперь полностью охвачены JSDocs.
  • LinkFile — это новый тип файла, используемый загрузчиком, который обрабатывает несколько файлов, которые нужно объединить. Например, загрузка JSON и изображения для текстурного атласа. Это теперь обрабатывается с помощью LinkFile.
  • У файла появился новый аргумент в конструкторе, который является экземпляром LoaderPlugin. Этот экземпляр хранится в свойстве loader.Также добавлено новое свойство cache, которое является ссылкой на кеш, в который будет сохранен тип файла.
  • У файла появился новый метод hasCacheConflict, который проверяет, существует ли ключ, соответствующий ключу, используемому этим файлом, в целевом кеше.
  • У файла появился новый метод addToCache, который добавляет файл в его целевой кеш и затем вызывает событие filecomplete, передавая ключ файла и ссылку на сам файл слушателю (спасибо @kalebwalton за связанный PR).
  • У загрузчика появилось новое свойство cacheManager, которое является ссылкой на глобальный кеш игры и используется типами файлов.
  • У загрузчика появилось новое свойство textureManager, которое является ссылкой на глобальный менеджер текстур и используется типами файлов.
  • Загрузчик теперь проверяет, будет ли загрузка файла конфликтовать с кешем, и предотвращает это, если это так.
  • Загрузчик теперь передает обработку данных файла самому файлу, который теперь самостоятельно добавляет себя в целевой кеш.
  • Загрузчик теперь вызывает метод destroy для всех файлов после завершения их обработки. Они теперь освобождают ссылки и дополнительные данные, что позволяет им быть собраны сборщиком мусора.
  • Типы файлов теперь отвечают за добавление себя в соответствующие кеши и любое дополнительное обработку, которая может потребоваться.Это удалило все код, который был в загрузчике для выполнения этой задачи, что означает, что типы файлов теперь правильно абстрагированы, и загрузчик больше не связан с ними. Это позволяет вам исключать типы файлов, если они вам не нужны, создавая более компактные пакеты в результате. Это также означает, что мы можем добавлять новые типы файлов легко без изменения загрузчика сам по себе, и плагины могут регистрировать новые типы файлов.
  • Тип файла XMLFile больше не выбрасывает ошибку, если не может распарсить XML, вместо этого он регистрирует предупреждение в консоли и не добавляет XML в кеш.
  • Загрузка BitmapFont добавляет изображение, используемое как текстура шрифта, в менеджер текстур и XML в XML-кеш, используя ключ, указанный для шрифта, что позволяет вам извлекать его более легко, если это необходимо.
  • По умолчанию максимальное количество параллельных загрузок файлов увеличено с 4 до 32. Вы всё ещё можете изменить это в конфигурации игры.
  • Теперь можно загружать карты нормалей с помощью объекта конфигурации: load.image({ key: 'shinyRobot', url: 'rob.png', normalMap: 'rob_n.png' }); - вы всё ещё можете использовать предыдущий метод массива.
  • Метод Loader.enableParallel был удалён. Если вам не нужно использовать параллельные загрузки файлов, установите максимальный лимит параллельных загрузок в 1. В связи с этим, свойство конфигурации игры loaderEnableParallel было удалено.* Теперь вы можете задать заголовок X-Requested-With в запросах XHR, указав его в конфигурации XHRSettings, как в игре, так и в сцене или конфигурации файла.
  • Файлы будут считаться с ошибками, если статус xhr >= 400 и <= 599, даже если они не выбрасывали событие onerror.

Обновления

  • Если вы используете Webpack с Phaser, вам потребуется обновить конфигурацию, чтобы она соответствовала нашей новой. Внесены два изменения: убрана необходимость использования raw-loader, и изменена синтаксическая структура вызовов DefinePlugin.
  • Мы изменили использование Webpack DefinePlugin, так что вместо установки глобального флага для компиляции рендереров Canvas и WebGL теперь используется проверка типа. Это означает, что вы теперь сможете легче использовать исходный код Phaser вне Webpack без необходимости определения глобальных переменных (спасибо @tgrajewski).
  • В Webpack мы больше не используем raw-loader для импорта исходного кода шейдеров. Вместо этого он компилируется в обычные JS-файлы в рамках нашего внутреннего рабочего процесса. Это должно позволить вам легче упаковывать Phaser с пакетами, отличными от Webpack.
  • Менеджер текстур теперь генерирует событие addtexture каждый раз, когда вы добавляете новую текстуру, включая загрузку изображений из загрузчика (так как он автоматически заполняет менеджер текстур).После получения события addtexture вы можете быть уверены, что изображение загружено, и текстура безопасна для применения к игровому объекту.
  • BitmapMask и GeometryMask оба имеют новые методы destroy, которые очищают их ссылки, освобождая их для сборки мусора.
  • CanvasPool теперь имеет новый аргумент selfParent, который позволяет самому холсту быть ключом родителя, используемым для последующего удаления.
  • Frame имеет новый метод setSize, который позволяет задать координаты x и y, ширину и высоту фрейма и автоматически обновляет все внутренние свойства. Этот метод теперь вызывается напрямую в конструкторе.
  • При уничтожении TextureSource, если у него есть текстура холста, она удаляется из CanvasPool.
  • Метод TextureManager.checkKey проверяет, используется ли ключ текстуры, и регистрирует ошибку в консоли, если это так, а затем возвращает логическое значение. Этот метод теперь широко используется внутри для предотвращения добавления текстур, которые уже существуют, в менеджер. Если вы хотите проверить, используется ли ключ без ошибки, используйте метод TextureManager.exists, как раньше.
  • Метод TextureManager.remove позволяет удалять текстуру из менеджера. Текстура уничтожается, и генерируется событие removetexture.
  • TextureSource теперь имеет новое свойство renderer, так как оно часто используется внутри и полезно, если вы расширяете класс.* При уничтожении TextureSource теперь автоматически создается glTexture из его холста, если используется один.
  • WebGLRenderer теперь удаляет текстуру GL из своего локального массива nativeTextures, когда вы вызываете метод deleteTexture.
  • BaseCache имеет новый метод exists, который возвращает логическое значение, указывающее на наличие записи для данного ключа в кэше.
  • ScenePlugin. getIndex возвращает индекс указанной сцены в списке сцен.
  • Системы сцены теперь отправляют событие ready, когда завершается полная инициализация и все плагины становятся доступными. Re: #3636 (спасибо @Yazir)
  • Все создатели объектов игры теперь имеют дополнительный логический аргумент addToScene. Если вы установите его в true, объект игры будет автоматически добавлен в сцену, в то время как false будет делать обратное, то есть: this.make.image(config, false). Вы все еще можете указать свойство add в объекте конфигурации, но если предоставлен аргумент, он перекроет это свойство.
  • Мы убрали метод TextureManager. addAtlasPyxel и связанный парсер. Он и так не работал, и никто, похоже, больше не использует Pyxel. Если будет достаточно спроса, мы можем рассмотреть возможность его возвращения.
  • При добавлении аудио-спрайта в менеджер звука теперь учитывается свойство loop, если оно задано в исходном JSON.
  • Класс Texture имеет новый метод getDataSourceImage, который возвращает сырые данные изображения источника.* WebAudioSoundManager теперь слушает события 'click' на теле документа, а также события касания, перед тем как возобновить AudioContext, чтобы управлять изменениями, внесенными в Chrome v66, которые не позволяют воспроизводить аудио до тех пор, пока не будет получено действие пользователя, даже на десктопе. ### Исправления ошибок* DataManagerPlugin будет выбрасывать ошибку при вызове Game.destroy, если у вас есть сцены в менеджере сцен, которые еще не были запущены. Исправление #3596 (спасибо @kuoruan)
  • Если вы создали игру без определенных сцен, а затем добавили одну через Game.scene.add и передали объект данных, данные будут игнорироваться при запуске сцены.
  • Добавление группы с массивом дочерних элементов в конструкторе было сломано с версии 3.5. Исправление #3612 (спасибо @fariazz @samme)
  • Исправлено выгрузку toJSON для ParticleEmitter, отсутствовало свойство angle, а также были некорректно преобразованы Emitter Ops (спасибо @samme)
  • Исправлено загрузочное нормальное отображение с использованием загрузки нескольких изображений (спасибо @iamchristopher)
  • Метод Array.AddAt будет работать некорректно, если он переключается на быстрый путь внутри контейнера из-за недопустимого свойства. Исправление #3617 (спасибо @poasher)
  • Метод Polygon.setTo будет работать некорректно, если ему передать массив массивов как список точек. Исправление #3619 (спасибо @PaulTodd)
  • Объекты Text с включенным переносом слов будут иметь лишний пробел в конце строки.Теперь пробелы добавляются только тогда, когда индекс слова больше предыдущего. Исправление #3626 (спасибо @rexrainbow)
  • Метод Container.getBounds теперь проверяет, можно ли вызвать getBounds для его дочерних элементов перед тем, как это сделать, так как некоторые из них не имеют этого метода (например, объекты Graphics), поэтому вызов больше не приводит к ошибке. Исправление #3623 (спасибо @poasher)
  • Метод Animation.setProgress устанавливал кадр на неправильном объекте. Исправление #3633 (спасибо @benhhopkins)
  • Метод SceneManager.moveAbove не перемещал сцену, если она уже была выше целевой сцены. Теперь сцена перемещается непосредственно выше целевой сцены, независимо от её положения в списке сцен.
  • Метод SceneManager.moveBelow не перемещал сцену, если она уже была ниже целевой сцены. Теперь сцена перемещается непосредственно ниже целевой сцены, независимо от её положения в списке сцен.
  • Метод Emitter.setEmitZone отвергал пользовательские объекты, переданные в качестве аргумента источника, из-за проверки неправильных методов (спасибо @samme)
  • Метод ScenePlugin.setActive только переключал текущую сцену, а не любую заданную сцену.
  • Метод ScenePlugin.setVisible только переключал текущую сцену, а не любую заданную сцену.
  • Создатель объектов Graphics автоматически добавлял Graphics в список отображения по ошибке. По умолчанию Graphics должны оставаться скрытыми. Исправление #3637 (спасибо @mikuso)* Объекты BitmapText, как статические, так и динамические, теперь могут принимать любой тип данных, включая числа, для аргумента text в конструкторе. Ранее они работали только через setText (спасибо @Jelaw21)* Пайплайн передачи рассеянного света был жестко закодирован для предположения, что карту нормалей будет хранить в исходном индексе ноль. Теперь он правильно получает карту нормалей из индекса источника кадра, что означает, что все игровые объекты, которые использовали кадры из текстур многокарт, теперь будут работать правильно с источниками света.
  • Функция Tiled Base64Decode работала с неправильной длиной массива, что приводило к появлению дополнительных неопределенных значений в конце (спасибо @tamagokun)### Примеры, документация и TypeScriptБлагодарю следующих за помощь в создании примеров, документации и определений TypeScript для Phaser 3, либо отчетами об ошибках, их исправлением или помощью в написании документации:

@wtravO @Fabadiculous @zilbuz @samme @iamchristopher @erd0s @PaNaVTEC @ksmai @snowbillr

Версия 3.7.0 - Sinon - 4 мая 2018

Предварительная версия 3.7.0. Подробности см. в версии 3.7.1.

Версия 3.6.0 - Asuna - 19 апреля 2018

Новые возможности

  • Контейнеры теперь полностью доступны! Мы убрали предупреждение о бете и исправили способ их работы с камерами, вводом и коэффициентами прокрутки. Они также полностью документированы, поэтому, пожалуйста, обратитесь к их документации и примерам для использования.
  • Group.getLast вернет последний элемент в группе, соответствующий критериям поиска.
  • Group.getFirstNth вернет n-й элемент в группе, просматривая с верхнего к нижнему, соответствующий критериям поиска.
  • Group.getLastNth вернет n-й элемент в группе, просматривая с нижнего к верхнему, соответствующий критериям поиска.
  • Group.remove имеет новый необязательный аргумент destroyChild, который вызовет destroy на дочернем элементе после его удаления.
  • Group.clear имеет новый необязательный аргумент destroyChild, который вызовет destroy на всех дочерних элементах в группе после их удаления.### Обновления
  • В объектах Impact Physics Game Objects изменено setLite на setLiteCollision.
  • В объектах Impact Physics Game Objects изменено setPassive на setPassiveCollision.
  • В объектах Impact Physics Game Objects изменено setFixed на setFixedCollision.
  • В объектах Impact Physics Game Objects изменено setActive на setActiveCollision. Ранее метод setActive коллизии перезаписывал метод setActive объектов, поэтому было переименовано.
  • Изменения, внесенные в класс RTree в Phaser 3.4.0 для избежания нарушений политики Content Security Policy (CSP), привели к значительному снижению производительности при значительном количестве тел. Мы перекодировали, как класс обрабатывает свои форматы доступа, и вернулись к уровню производительности 3.3, сохраняя при этом соблюдение политики CSP. Fix #3594 (спасибо @16patsle)
  • Пространство имен для Ретро Шрифта изменено на Phaser.GameObjects.RetroFont. Ранее вы могли получить доступ к парсеру и константам через BitmapText, например: Phaser.GameObjects.BitmapText.ParseRetroFont.TEXT_SET6. Теперь это свое собственное пространство имен, поэтому та же строка будет выглядеть так: Phaser.GameObjects.RetroFont.TEXT_SET6. Парсер доступен через Phaser.GameObjects.RetroFont.Parse. Это делает все более чистым и также развязывает RetroFont от BitmapText, позволяя вам чисто исключить его из сборки, если вы этого хотите. Все примеры были обновлены для отражения этого.
  • При использовании опции removeFromScene в Group.remove или Group.clear она удалит дочерний/ние из сцены, к которой они принадлежат, а не из сцены, к которой принадлежит Group.

Исправления ошибок* Исправлена ошибка, которая не позволяла передавать данные в другую сцену при использовании перехода для её запуска. Fix #3586 (спасибо @willywu)

  • Метод Group.getHandler возвращал любого члена группы, независимо от состояния, что приводило к тому, что пулы оставались фиксированными на одном члене. Fix #3592 (спасибо @samme)

Примеры, документация и TypeScript

Благодарю следующих за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как путём отчета об ошибках, их исправления, так и помощью в написании документации:

@Fabadiculous @Antriel

Версия 3.5.1 - Kirito - 17 апреля 2018

Обновления

  • Изменения, внесённые в 3.5.0, в обработку жизненного цикла систем сцен, были скорректированы. При создании сцены теперь будет сгенерировано событие boot, как и раньше, и системы, которые это требуют, будут слушать это событие и настраивать свои внутренние свойства в соответствии с этим. Они также будут делать то же самое под событием start, что позволит им правильно перезапускаться после остановки. В 3.5, если сцена ранее не была запущена или начата, вы не могли бы полностью получить доступ ко всем её внутренним системам, но в 3.5.1 это возможно.

Исправления ошибок* Метод LoaderPlugin.destroy пытался удалить неправильный слушатель событий.

  • TileSprites пытался вызвать deleteTexture на обоих рендерах, но это доступно только в WebGL (спасибо @jmcriat)
  • Использование геометрической маски перестало работать в WebGL. Fix #3582 (спасибо @rafelsanso)
  • Эмиттер частиц неправильно корректировал количество вершин, что приводило к проблемам рендеринга в WebGL. Fix #3583 (спасибо @murteira)### Примеры, документация и TypeScript

Благодарю следующих за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как путём отчета об ошибках, их исправления, так и помощью в написании документации:

@NemoStein @gabegordon @gazpachu @samme @cristlee @melissaelopez @dazigemm @tgrajewski

Версия 3.5.0 - Kirito - 16 апреля 2018### Изменения в камерах

  • Класс Camera и все эффекты камеры теперь полностью охвачены 100% полными JS Docs.
  • Все эффекты камеры были переписаны с нуля. Теперь они следуют унифицированной структуре эффектов, и каждый эффект упакован в свой класс, находящийся в папке 'effects'. В настоящее время доступны эффекты Плавного перехода (Fade), Вспышки (Flash) и Вибрации (Shake).
  • Новые классы эффектов доступны через свойства Camera: fadeEffect, flashEffect и shakeEffect. Вы все еще можете использовать дружественные методы уровня Camera: shake, fade и flash.
  • Новая структура позволяет вам заменять стандартные эффекты своими собственными, просто перезаписывая соответствующие свойства.
  • Эффекты теперь корректно работают при любой комбинации. Например, вы можете плавно выключить затем включить, или наоборот, и при этом использовать эффекты вспышки или вибрации. Рендереры теперь корректно накладывают эффекты в нужном порядке для обеспечения этого.
  • Все свойства камеры, связанные с эффектами (например, _fadeAlpha), были удалены. Если вам нужно получить доступ к этим значениям, вы можете сделать это гораздо более чисто через соответствующие классы эффектов камеры. Они всегда были приватными, но мы знали, что некоторые из вас модифицировали их, поэтому вам потребуется обновить код.
  • Удалено свойство Camera.clearBeforeRender, так как оно никогда не использовалось внутренне.Эта настройка может быть включена на уровне всей игры.
  • Camera теперь расширяет Event Emitter, что позволяет ему отправлять события.
  • Свойство Camera.cullHitTest было удалено. Оно никогда не использовалось внутренне и дублировало код в Camera.cull.
  • Цель свойства callback методов эффектов камеры изменилась. Оно больше не является callback-ом onComplete, а теперь является callback-ом onUpdate. Оно вызывается каждый кадр в течение всего эффекта. См. документацию для деталей аргументов.
  • Эффекты камеры теперь отправляют события. Они отправляют события 'start' и 'complete', которые можно использовать для обработки любых действий, которые вы ранее выполняли в callback. См. документацию и примеры для названий событий и аргументов.
  • Эффект вибрации камеры теперь позволяет указывать разные интенсивности для осей x и y.
  • Вы можете отслеживать прогресс всех событий через свойство progress на экземпляре эффекта, что позволяет вам синхронизировать длительность эффекта с другими событиями в игре.

Новая функция: переходы между сценамиВ плагине ScenePlugin доступен новый метод this.scene.transition, который позволяет осуществлять переход от одной сцены к другой за указанный период времени. Метод принимает конфигурационный объект, который позволяет контролировать различные аспекты перехода, от перемещения сцен по списку отображения до указания функции обратного вызова onUpdate.

Вызовная сцена может быть отправлена в спячку, остановлена или полностью удалена из менеджера сцен по завершении перехода, и вы даже можете заблокировать события ввода в обеих сценах во время перехода, если это необходимо. Существуют различные события, отправляемые как из вызывающей, так и из целевой сцены, которые вместе с функцией обратного вызова onUpdate предоставляют вам гибкость для создания действительно впечатляющих переходов как в, так и из сцен.

Для получения более подробной информации, пожалуйста, обратитесь к полным JSDocs для плагина ScenePlugin, а также к новым примерам в Phaser 3 Labs.

Другие новые функции

  • GameObject.ignoreDestroy позволяет контролировать, уничтожается ли объект игры или нет. Установка флага сообщает объекту игнорировать запросы на уничтожение от групп, контейнеров и даже самой сцены. Подробнее см. документацию.
  • В плагине ввода сцены Scene Input Plugin появился новый параметр enabled, который позволяет включать или отключать обработку ввода на уровне каждой сцены.### Исправленные ошибки
  • MatterEvents. off() вызывал TypeError при уничтожении мира Matter. Исправлено #3562 (спасибо @pixelscripter)
  • DynamicBitmapText отсутствовал свойство letterSpacing, что приводило к рендерингу только первого символа в WebGL (спасибо @Antriel)
  • Компонент Animation не правильно проверял состояние анимации в обновлении, что приводило к неудаче при приостановке / возобновлении. Исправлено #3556 (спасибо @Antriel @siolfyr)
  • Менеджер сцен никогда не достигал состояния isBooted, если не было добавлено ни одной сцены в конфигурацию игры. Исправлено #3553 (спасибо @rgk)
  • Исправлена проблема в HTMLAudioSound, где mute могла попасть в рекурсивный цикл.
  • Каждый RenderTexture рисовал один и тот же контент из-за неправильного использования CanvasPool (что также влияло на TileSprites). Исправлено #3555 (спасибо @kuoruan)
  • Group. add и Group. addMultiple теперь уважают свойство Group. maxSize, предотвращая переполнение группы (спасибо @samme)
  • При использовании HTML5 Audio, менеджер звука теперь пытается разблокировать аудио после загрузки каждой сцены, а не только после первой. Исправлено #3309 (спасибо @pavle-goloskokovic)
  • Group. createMultiple вставлял пустые записи, если группа достигала максимального размера во время операции, что приводило к ошибкам позже. Теперь он прекращает создание объектов, если группа достигает максимального размера (спасибо @samme)
  • Group. remove не проверял, является ли переданный объект игры членом группы, и всегда вызывал removeCallback и (если указано) destroy.Теперь он ничего не делает, если объект игры не является членом группы (спасибо @samme)
  • Если размер группы превышал maxSize (что может произойти, если вы уменьшите maxSize ниже текущего размера), isFull возвращал false, и группа могла продолжать расти. Теперь isFull возвращает true в этом случае (спасибо @samme)
  • Camera.fadeIn после Camera.fadeOut не работал, но теперь исправлен благодаря переписанному эффекту камеры. Исправлено #3527 (спасибо @Jerenaux)
  • Эмиттеры частиц с большим количеством частиц вызывали ошибку GL_INVALID_OPERATION: Vertex buffer is not big enough for the draw call в WebGL.
  • Исправлена проблема с Game.destroy, которая не работала правильно под WebGL с версии 3.4. Исправлено #3569 (спасибо @Huararanga)

Обновления* Удалены следующие свойства из BaseSound, так как они больше не требуются. Каждый класс, расширяющий BaseSound, реализует их напрямую в качестве геттеров: mute, loop, seek и volume.

  • Тест Device. OS для проверки, работает ли Phaser под node.js, был усилен для поддержки node-подобных сред, таких как Vue (спасибо @Chumper).
  • Каждый плагин был обновлен для правильного следования одному и тому же потоку через жизненный цикл сцены. Вместо того чтобы слушать событие сцены 'boot', которое отправляется только один раз (когда сцена создается впервые), они теперь будут слушать событие сцены 'start', которое происходит каждый раз, когда сцена начинается. Все плагины теперь последовательно следуют одному и тому же шаблону завершения и уничтожения, что означает, что они убирают за собой мусор при завершении, а не только при уничтожении. В целом, это изменение означает, что должно быть меньше проблем при возвращении к ранее закрытым сценам, так как плагины правильно перезапускают себя.
  • При завершении сцены все объекты игры, принадлежащие сцене, теперь автоматически уничтожаются. Они ранее удалялись из списков отображения и обновления, но сами объекты не уничтожались. Вы можете контролировать это на уровне каждого объекта с помощью свойства ignoreDestroy.* Мастерская пружина мыши по умолчанию отключает отладочное отображение своего ограничения (вы можете переопределить это, передав свою собственную конфигурацию)
  • Класс RandomDataGenerator теперь доступен под Phaser.Math, если вы хотите создать его самостоятельно. Исправление #3576 (спасибо @wtravO)
  • Улучшена последовательность Game.destroy, так что теперь она уничтожает игру только в начале следующего кадра, а не во время обработки.### Примеры, документация и TypeScript

Мои благодарности следующим за помощь в примерах Phaser 3, документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:

@samme @Antriel

Версия 3.4.0 - Miyako - 12 апреля 2018### Новые возможности

В этой версии появился бета-выпуск нового объекта игры Container. Мы пометили его как бета-версию из-за известных проблем, возникающих при использовании контейнеров в сценах с несколькими камерами или нерегулярными областями видимости камер. Однако, в остальных случаях, которые мы проверили, они работают нормально, поэтому мы решили выпустить их в этот билд, чтобы разработчики могли привыкнуть к ним. Использование контейнера выдаст одно предупреждение в консоли в качестве напоминания. Мы уберем это предупреждение, когда контейнеры выйдут из бета-версии в будущем релизе. В то же время они полностью документированы, и вы можете найти множество примеров в репозитории Phaser 3 Examples.

  • В Matter был добавлен новый параметр correction, используемый в вызове Engine.update и позволяющий корректировать время, передаваемое симуляции. Значение по умолчанию равно 1 для сохранения совместимости с предыдущими выпусками.
  • Matter Physics теперь имеет новый параметр конфигурации getDelta, который позволяет указать собственную функцию для вычисления значения delta, передаваемого в Matter Engine при обновлении.
  • Matter Physics имеет два новых метода: set60Hz и set30Hz, которые устанавливают частоту обновления движка на 60 Гц и 30 Гц соответственно. 60 Гц является значением по умолчанию. * Matter Physics имеет новый параметр конфигурации и времени выполнения autoUpdate, значение по умолчанию которого равно true. При включении этот параметр позволяет движку Matter обновляться в синхронизации с шагом игры (установленным с помощью requestAnimationFrame). Значение delta, передаваемое в Matter, теперь контролируется функцией getDelta.
    • Matter Physics имеет новый метод step, который позволяет вручную продвигать физическую симуляцию на один шаг, используя переданные значения delta и correction. При использовании вместе с autoUpdate=false теперь можно явно контролировать частоту обновления физической симуляции и отвязать её от шага игры.
    • Matter Physics имеет два новых отладочных параметра: debugShowJoint и debugJointColor. Если они определены, они отображают сочленения в телах Matter во время отладочной фазы postUpdate (только если отладка включена) (спасибо @OmarShehata).
    • Group. destroy теперь имеет новый необязательный аргумент destroyChildren, который автоматически вызывает destroy для всех дочерних элементов Group, если установлен в true (по умолчанию false, поэтому публичный API не изменяется). Исправление #3246 (спасибо @DouglasLapsley).
    • WebAudioSound. setMute является цепочечным способом отключения звука для одного экземпляра Sound.
    • WebAudioSound. setVolume является цепочечным способом установки громкости для одного экземпляра Sound.
    • WebAudioSound. setSeek является цепочечным способом установки позиции воспроизведения для одного экземпляра Sound.
    • WebAudioSound.setLoop является цепочечным способом установки состояния повтора для одного экземпляра Sound.
    • HTML5AudioSound. setMute является цепочечным способом отключения звука для одного экземпляра Sound.
    • HTML5AudioSound. setVolume является цепочечным способом установки громкости для одного экземпляра Sound.
    • HTML5AudioSound. setSeek является цепочечным способом установки позиции воспроизведения для одного экземпляра Sound.
    • HTML5AudioSound. setLoop является цепочечным способом установки состояния повтора для одного экземпляра Sound. * BitmapText имеет новое свойство letterSpacing, которое принимает положительное или отрицательное число для добавления / уменьшения интервала между символами (спасибо @wtravO)
  • Теперь вы можете передать Sprite Sheet или Canvas как ключ текстуры в Tilemap. addTileset, и это будет работать в WebGL, в отличие от предыдущего поведения, при котором отображался дефектный Tilemap. Исправление #3407 (спасибо @Zykino)
  • Graphics. slice позволяет легко рисовать форму Pac-Man или сектор круга в объекте Graphics.
  • List. addCallback — это новый необязательный обратный вызов, который вызывается каждый раз, когда добавляется новый дочерний элемент в List. Вы можете использовать это, чтобы вызвать обратный вызов при добавлении дочерних элементов в Display List.
  • List. removeCallback — это новый необязательный обратный вызов, который вызывается каждый раз, когда удаляется новый дочерний элемент из List.Вы можете использовать это, чтобы вызвать обратный вызов при удалении дочерних элементов из Display List.
  • ScenePlugin. restart позволяет перезапустить текущую сцену. Это то же самое, что и вызов ScenePlugin. start без аргументов, но более ясное.
  • Utils. Array. Add позволяет безопасно добавлять один или несколько элементов в массив с необязательными ограничениями и обратными вызовами.
  • Utils. Array. AddAt позволяет безопасно добавлять один или несколько элементов в массив на указанную позицию с необязательными ограничениями и обратными вызовами.
  • Utils. Array. BringToTop позволяет переместить элемент массива на вершину массива.
  • Utils. Array. CountAllMatching сканирует массив и подсчитывает все элементы с свойствами, соответствующими заданному значению.
  • Utils. Array. Each передаёт каждый элемент массива в заданный обратный вызов с необязательными аргументами.
  • Utils. Array. EachInRange передаёт каждый элемент массива в заданном диапазоне в обратный вызов с необязательными аргументами.
  • Utils. Array. GetAll возвращает все элементы из массива с необязательными сравнениями свойств и значений.
  • Utils. Array. GetFirst возвращает первый элемент в массиве с необязательными сравнениями свойств и значений.
  • Utils. Array. GetRandomElement переименован в GetRandom и возвращает случайный элемент из массива.
  • Utils. Array. MoveDown перемещает заданный элемент массива на одну позицию вниз в массиве.
  • Utils. Array.MoveTo перемещает заданный элемент массива на указанную позицию в массиве.
  • Utils. Array. MoveUp перемещает заданный элемент массива на одну позицию вверх в массиве.
  • Utils. Array. Remove удаляет заданный элемент или массив элементов из массива с необязательным обратным вызовом.
  • Utils. Array. Remove удаляет элемент из массива
  • Utils. Array. RemoveAt удаляет элемент с указанной позиции в массиве, с опциональным обратным вызовом.
  • Utils. Array. RemoveBetween удаляет элементы в указанном диапазоне в массиве, с опциональным обратным вызовом.
  • Utils. Array. Replace заменяет существующий элемент в массиве новым.
  • Utils. Array. SendToBack позволяет переместить элемент массива в конец.
  • Utils. Array. SetAll устанавливает свойство на всех элементах массива на указанное значение, с опциональными диапазонными ограничениями.
  • Utils. Array. Swap меняет местами два элемента в массиве.
  • TransformMatrix. destroy — новый метод, который очищает массив и объект, используемые матрицей внутренне.
  • BaseSound, а также WebAudioSound и HTMLAudioSound, теперь издают событие destroy при уничтожении (спасибо @rexrainbow)
  • В конфигурации сцены добавлено новое свойство: mapAdd, которое используется для расширения стандартной карты внедрения сцены, а не её перезаписи (спасибо @sebashwa)
  • Метод GetBounds getTopLeft, getTopRight, getBottomLeft и getBottomRight имеют новый опциональный аргумент includeParent, который учитывает все преобразования предков в возвращаемой точке.### Исправления ошибок
  • В рендер-текстуре WebGL оттенок текстуры всегда устанавливался на 0xffffff, поэтому значения альфа-канала игнорировались. Теперь оттенок вычисляется с учетом значения альфа-канала. Исправление #3385 (спасибо @ger1995)
  • Рендер-текстура теперь использует компонент ComputedSize вместо Size (который требует кадра), что позволяет вызовам getBounds работать корректно. Исправление #3451 (спасибо @kuoruan)
  • Метод start в PathFollower был переименован в startFollow, но PathFollower. setPath по-прежнему использовал PathFollower. start (спасибо @samid737)
  • Методы BaseSoundManager. rate и BaseSoundManager. detune некорректно вызывали setRate на своих звуковых объектах, вместо calculateRate.
  • Метод getValue для осей джойстика теперь корректно применяет порог и обнуляет возвращаемое значение.
  • Модуль HueToComponent некорректно экспортировался. Исправление #3482 (спасибо @jdotrjs)
  • Модуль Matter. World использовал setZ вместо setDepth для слоя отладочных графических данных, что приводило к тому, что слой отображался позади объектов в некоторых списках отображения. Исправление #3498 (спасибо @Huararanga)
  • Метод Game. destroy теперь проверяет наличие рендера перед вызовом destroy. Исправление #3498 (спасибо @Huararanga)
  • Методы Keyboard. JustDown и Keyboard. JustUp сбрасывались слишком рано, что приводило к их неисправности при вызове в циклах update. Исправление #3490 (спасибо @belen-albeza)
  • Метод RenderTexture. destroy больше не выбрасывает ошибку при вызове. Исправление #3475 (спасибо @kuoruan)* Батч WebGL TileSprite теперь модулирует tilePosition, чтобы избежать передачи больших значений в UV-данные, что устраняет коррупцию при прокрутке TileSprites на длительное время. Исправление #3402 (спасибо @vinerz @FrancescoNegri)
  • Метод LineCurve.getResolution отсутствовал аргумент divisions и всегда возвращал 1, что приводило к его неисправности при использовании как части Path. Теперь он по умолчанию возвращает 1, если не указано иное (спасибо _ok)
  • Включенный для перетаскивания объект игры больше не генерировал события over и out после перетаскивания, теперь он это делает (спасибо @jmcriat)
  • Методы Line.getPointA и Line.getPointB некорректно устанавливали значения в Vector2 (спасибо @Tomas2h)
  • DynamicTilemapLayer теперь использует компонент ComputedSize, что предотвращает его разрушение при вызове setDisplaySize (спасибо Babsobar)
  • StaticTilemapLayer теперь использует компонент ComputedSize, что предотвращает его разрушение при вызове setDisplaySize (спасибо Babsobar)
  • Метод CanvasPool.first всегда возвращал null, теперь он возвращает первый доступный Canvas. Исправление #3520 (спасибо @mchiasson)
  • При запуске новой Сцены с необязательным аргументом data он не передавался, если Сцена ещё не была доступна (то есть, игра ещё не завершила загрузку). Теперь данные передаются в методы init и create Сцены и сохраняются в свойстве data настроек Сцены. Исправление #3363 (спасибо @pixelhijack)
  • Tween.restart правильно обрабатывает удалённые твинги и восстанавливает их в активной очереди для TweenManager (спасибо @wtravO)
    • Tween.resume теперь вызывает Tween.play для твинга, который был приостановлен из-за его конфигурационного объекта, а не из-за вызова метода pause. Исправление #3452 (спасибо @jazen)
    • LoaderPlugin.isReady ссылался на константу, которая больше не существует. Исправление #3503 (спасибо @Twilrom)
    • Tween Timeline.destroy пытался вызвать destroy для твингов вместо stop. Исправление (спасибо @Antriel)
    • Вызов setOffset для статического тела Arcade Physics приводил к ошибке из-за отсутствия метода. Метод добавлен и теперь работает как ожидается. Исправление #3465 (спасибо @josephjaniga и @DouglasLapsley)
    • Вызов Impact.World.remove(body) во время Body.updateCallback приводил к ошибке в цикле при попытке доступа к отсутствующему телу. Добавлены два дополнительных проверочных условия для предотвращения этого (спасибо @iamDecode)
    • Если setInteractive вызывается для объекта игры, который не может установить область столкновения, он больше не пытается назначить dropZone неопределённому свойству input.
    • Компонент Matter SetBody больше не пытается вызвать setOrigin, если объект игры не имеет компонента origin (что не всегда так, например, для Graphics и Container)
    • Matter Image и Matter Sprite не определяли метод destroy, что приводило к ошибке при попытке уничтожить родительский объект игры.Исправление #3516 (спасибо @RollinSafary)### Обновления
  • Библиотека RTree (rbush), используемая в Phaser 3, страдала от нарушения политик CSP за счет динамического создания функций в режиме выполнения, аналогичном eval. Теперь эти функции определены через генераторы. Исправление #3441 (спасибо @jamierocks @Colbydude @jdotrjs)
  • В базовом классе BaseSound были удалены свойства rate и detune, так как они всегда задаются в переопределяющем классе.
  • Методы setRate и setDetune класса BaseSound, введенные в версии Yöntemler setRate ve setDetune BaseSound sınıfı, 3. 3. 0 versiyonunda tanıtıldı ve bunlar, değerleri farklı yollarla işlerler için, WebAudioSound ve HTML5AudioSound sınıflarına taşındı.
  • Dosya InteractiveObject.js CreateInteractiveObject.js olarak yeniden adlandırıldı, bu, dosyanın işlevselliğini daha doğru yansıtmak ve belgelemeye yönelik yaygın hataları önlemek için.
  • Kamera Kontrolleri modülü için Fixed ve Smoothed eksporları, FixedKeyControl ve SmoothedKeyControl olarak yeniden adlandırıldı, bu, sınıf isimlerine uygun hale getirmek için. Исправление #3463 (спасибо @seivan)
  • Компонент ComputedSize теперь имеет методы setSize и setDisplaySize. Этот компонент используется для объектов игры, размер которых не основан на текстуре.
  • GamepadManager теперь наследует EventEmitter напрямую, как и KeyboardManager.
  • Порог для осей Gamepad увеличен с 0.05 до 0.1.
  • Метод Utils.Array.FindClosestInSorted получил новый необязательный аргумент key, который позволяет просматривать верхнеуровневое свойство любого объекта в данном отсортированном массиве и получать ближайшее совпадение.
  • Метод Vector2.setTo является псевдонимом для Vector2.setFromObject.set, позволяя использовать его взаимозаменяемо с Geom.Point.
  • Метод List.add теперь может принимать массив или одиночный элемент. Если передан массив, он передается методу List.addMultiple.
  • Метод List.add получил новый необязательный аргумент skipCallback.
  • Метод List.addAt получил новый необязательный аргумент skipCallback.
  • Метод List.addMultiple получил новый необязательный аргумент skipCallback.
  • Метод List.remove получил новый необязательный аргумент skipCallback.
  • Метод List.removeAt получил новый необязательный аргумент skipCallback.
  • Метод List.removeBetween получил новый необязательный аргумент skipCallback.
  • Метод List.removeAll получил новый необязательный аргумент skipCallback.
  • При использовании свойства extend объекта конфигурации сцены теперь блокируется перезапись свойства sys сцены.
  • При использовании свойства extend объекта конфигурации сцены, если вы определяете свойство data, содержащее объект, оно заполняет менеджер данных сцены этими значениями.
  • Метод SceneManager._processing переименован в isProcessing, который теперь является булевым значением, а не целым числом. Он также стал публичным и только для чтения.
  • Свойство SceneManager.isBooted — это новое только для чтения булевое свойство, которое позволяет узнать, выполнила ли менеджер сцен начальную последовательность загрузки.
  • TransformMatrix имеет следующие новые геттеры и сеттеры: a, b, c, d, tx и ty. Также имеются следующие новые геттеры: scaleX, scaleY и rotation.
  • Метод List.getByKey был удален. Вместо него используйте List.getFirst, который предлагает ту же функциональность.
  • Метод List.sortIndexHandler был удален, так как больше не требуется.
  • Метод List.sort больше не принимает массив в качестве аргумента, вместо этого он сортирует содержимое списка по определенному свойству.
  • Метод List.addMultiple был удален. Вместо него используйте List.add, который предлагает ту же функциональность.
  • Теперь List внутренне использует все новые функции Utils.Array.
  • Rectangle.Union теперь кэширует все переменные внутри, поэтому вы можете использовать один из входных прямоугольников как выходной прямоугольник без повреждения последнего.
  • При выключении Matter World теперь вызывается MatterEvents.off, очищающий все события, а также removeAllListeners для любых локальных событий.
  • Удален InputPlugin.sortInteractiveObjects, так как метод не используется нигде внутри.

Обновления системы анимацииМы重构了Animation API,使其与Phaser 3的其余部分更加一致,并修复了一些问题。以下所有更改均适用于Animation组件:


Анимации обновления системМы переработали API анимации, чтобы сделать её более согласованной с остальной частью Phaser 3 и исправить некоторые проблемы. Все следующие изменения применяются к компоненту анимации:

  • Продолжительности анимации, задержки и повторения задержек теперь указываются в миллисекундах, а не в секундах, как раньше. Это делает их согласованными с твинами, звуками и другими частями v3. Вы все ещё можете использовать свойство frameRate, чтобы установить скорость анимации в кадрах в секунду.
  • Все обратные вызовы анимации были удалены, включая onStart, onRepeat, onUpdate и onComplete, а также соответствующие массивы параметров, такие как onStartParams и свойство callbackScope. Причина этого в том, что они все устанавливались на глобальном уровне, что означало, что если у вас было 100 спрайтов, использующих одну и ту же анимацию, было невозможно установить обратные вызовы для запуска только для одного из этих спрайтов. Вместо этого анимации теперь отправляют события на объекты игры, в которых они выполняются. Это означает, что вы теперь можете использовать sprite.on('animationstart'), и это будет вызвано в тот же момент, что и старый обратный вызов onStart. Новые события: animationstart, animationrepeat, animationupdate и animationcomplete. Все они отправляются из объекта игры, который имеет запущенную анимацию, а не из самой анимации.Это позволяет вам иметь гораздо больший контроль над тем, что происходит в обратных вызовах, и мы считаем, что это делает их более полезными.
  • Обратный вызов onUpdate для AnimationFrame был удален. Теперь вы можете использовать событие animationupdate, отправляемое из самого объекта игры, и проверять второй аргумент, который представляет собой кадр анимации.
  • Метод Animation.stopAfterDelay останавливает анимацию спрайта после указанного времени в миллисекундах.
  • Метод Animation.stopOnRepeat останавливает анимацию спрайта при повторении.
  • Метод Animation.stopOnFrame останавливает анимацию спрайта при достижении указанного кадра.
  • Метод Animation.stop больше не имеет аргумента dispatchCallbacks, так как он отправляет событие, которое вы можете игнорировать.
  • Метод delay был удален.
  • Метод setDelay позволяет определить задержку перед началом воспроизведения.
  • Метод getDelay возвращает значение задержки воспроизведения анимации.
  • Метод delayedPlay теперь возвращает родительский объект игры, а не компонент.
  • Метод load теперь возвращает родительский объект игры, а не компонент.
  • Метод pause теперь возвращает родительский объект игры, а не компонент.
  • Метод resume теперь возвращает родительский объект игры, а не компонент.
  • Метод isPaused возвращает логическое значение, указывающее на состояние паузы анимации.
  • Метод paused был удален.
  • Метод play теперь возвращает родительский объект Game Object вместо компонента.* Метод progress был удален.
  • Метод getProgress возвращает значение прогресса анимации.
  • Метод setProgress позволяет прокрутить анимацию до определенного значения прогресса.
  • Метод repeat был удален.
  • Метод getRepeat возвращает значение повторения анимации.
  • Метод setRepeat устанавливает количество повторений текущей анимации.
  • Метод repeatDelay был удален.
  • Метод getRepeatDelay возвращает значение задержки повторения анимации.
  • Метод setRepeatDelay устанавливает время задержки между повторениями.
  • Метод restart теперь возвращает родительский объект Game Object вместо компонента.
  • Метод stop теперь возвращает родительский объект Game Object вместо компонента.
  • Метод timeScale был удален.
  • Метод getTimeScale возвращает значение масштаба времени анимации.
  • Метод setTimeScale устанавливает значение масштаба времени.
  • Метод totalFrames был удален.
  • Метод getTotalFrames возвращает общее количество кадров в анимации.
  • Метод totalProgress был удален, так как он ничего не делал и был написан с ошибкой.
  • Метод yoyo был удален.
  • Метод getYoyo возвращает, будет ли анимация выполнять обратное воспроизведение.
  • Метод setYoyo устанавливает, будет ли анимация выполнять обратное воспроизведение.
  • Метод updateFrame теперь вызывает метод setSizeToFrame для объекта Game Object, что позволяет настроить свойства width и height объекта Game Object на размер кадра. Исправление #3473 (спасибо @wtravO @jp-gc).* Метод updateFrame теперь поддерживает кадры анимации с пользовательскими точками опоры и внедряет их в исходный объект Game Object.
  • Метод destroy теперь удаляет события, ссылки на менеджер анимации и родительский объект Game Object, очищает текущую анимацию и кадр, а также очищает внутренние массивы.
  • Изменение свойства yoyo в компоненте анимации не имело эффекта, так как он всегда проверял глобальное свойство, теперь он правильно проверяет локальное свойство, что позволяет вам указывать свойство yoyo для каждого объекта Game Object.
  • Метод Animation.destroy теперь правильно очищает глобальный объект анимации.
  • Метод Animation.getFrameByProgress возвращает кадр анимации, ближайший к указанному значению прогресса. Например, в анимации из 5 кадров вызов этого метода с значением 0.5 вернет средний кадр.Мои благодарности следующим людям за помощь в создании примеров, документации и определений типов для Phaser 3, как за отчет об ошибках, так и за помощь в написании документации:

@gabegordon @melissaelopez @samid737 @nbs @tgrajewski @pagesrichie @hexus @mbrickn @erd0s @icbat @Matthew-Herman @ampled @mkimmet @PaNaVTEC

Версия 3.3.0 - Tetsuo - 22 марта 2018

Особая благодарность @orblazer за выдающуюся помощь в завершении JSDoc типов данных, обратных вызовов и определений типов по всему API.### Новые возможности

  • Стиль TextStyle имеет два новых свойства: baselineX и baselineY, которые позволяют настраивать 'магическое' значение, используемое при вычислении метрик текста.
  • В конфигурации игры GameConfig свойство preserveDrawingBuffer теперь передаётся в WebGL Renderer (по умолчанию false).
  • В конфигурации игры GameConfig свойство failIfMajorPerformanceCaveat теперь передаётся в WebGL Renderer (по умолчанию false).
  • В конфигурации игры GameConfig свойство powerPreference теперь передаётся в WebGL Renderer (по умолчанию default).
  • В конфигурации игры GameConfig свойство antialias теперь передаётся в WebGL Renderer как свойство контекста antialias (по умолчанию true).
  • В конфигурации игры GameConfig свойство pixelArt теперь используется только WebGL Renderer при создании новых текстур.
  • В конфигурации игры GameConfig свойство premultipliedAlpha теперь передаётся в WebGL Renderer как свойство контекста premultipliedAlpha (по умолчанию true).
  • Теперь вы можете указать все опции конфигурации рендерера внутри объекта render в конфигурации. Если объект render не найден, конфигурация будет напрямую просматривать свойства конфигурации.
  • Метод Group.create имеет новый необязательный аргумент: active, который устанавливает активное состояние создаваемого дочернего элемента (спасибо @samme).
  • Метод Group.createMultiple теперь позволяет включать свойство active в объект конфигурации (спасибо @samme).
  • Класс TileSprite имеет новый метод: setTilePosition, который позволяет устанавливать позицию плитки в цепочке вызовов (спасибо @samme).* Добавлен новый Action - WrapInRectangle. Этот Action обернет координаты каждого элемента в области прямоугольника (спасибо @samme).
  • Arcade Physics имеет новые методы wrap, wrapArray и wrapObject, которые позволяют обернуть тела физики вокруг границ мира (спасибо @samme).
  • В Timeline Tweens появился новый метод: makeActive, который делегирует управление менеджеру Tween (спасибо @allanbreyes).
  • Actions. GetLast вернёт последний элемент в массиве элементов, соответствующий условиям.
  • Actions. PropertyValueInc — это новый Action, который увеличивает любое свойство массива объектов на указанное значение, используя опциональное значение шага, индекс и направление итерации. Большинство Actions были обновлены для использования этого внутренне.
  • Actions. PropertyValueSet — это новый Action, который устанавливает любое свойство массива объектов на указанное значение, используя опциональное значение шага, индекс и направление итерации. Большинство Actions были обновлены для использования этого внутренне.
  • Камера. shake теперь имеет необязательный аргумент callback, который вызывается при завершении эффекта (спасибо @pixelscripter).
  • Камера. fade теперь имеет необязательный аргумент callback, который вызывается при завершении эффекта (спасибо @pixelscripter).
  • Камера. flash теперь имеет необязательный аргумент callback, который вызывается при завершении эффекта (спасибо @pixelscripter).fadeIn — это новый метод, который будет плавно вводить камеру из заданного цвета (черный по умолчанию) и затем, при необходимости, вызывать обратный вызов. Это то же самое, что использование Camera.flash, но с более понятным названием метода. Исправление #3412 (спасибо @Jerenaux)
    • Camera.fadeOut — это новый метод, который будет плавно выводить камеру в заданный цвет (черный по умолчанию) и затем, при необходимости, вызывать обратный вызов. Это то же самое, что использование Camera.fade, но с более понятным названием метода. Исправление #3412 (спасибо @Jerenaux)
    • Группы теперь будут слушать событие destroy от любого объекта игры, добавленного к ним, и если событие получено, автоматически удалить этот объект игры из группы. Исправление #3418 (спасибо @hadikcz)
    • MatterGameObject — это новый метод, доступный через фабрику Matter в this.matter.add.gameObject, который внедряет тело Matter JS в любой объект игры, такой как объект Text или TileSprite.
    • Matter.SetBody и Matter.SetExistingBody теперь устанавливают начало координат объекта игры на начало координат спрайта Matter JS. Значения xOffset и yOffset, которые автоматически центрируют объект игры относительно начала координат тела, независимо от формы.
    • SoundManager.setRate — это цепной метод, который позволяет вам устанавливать глобальную скорость воспроизведения всех звуков в SoundManager.setDetune — это цепной метод, который позволяет вам устанавливать глобальное изменение тона всех звуков в SoundManager.
    • SoundManager.setMute — это цепной метод, который позволяет вам устанавливать глобальное состояние глушения звука в SoundManager.
    • SoundManager.setVolume — это цепной метод, который позволяет вам устанавливать глобальный уровень громкости в SoundManager.
    • BaseSound.setRate — это цепной метод, который позволяет вам устанавливать скорость воспроизведения BaseSound.
    • BaseSound.setDetune — это цепной метод, который позволяет вам устанавливать значение изменения тона BaseSound.

Исправления ошибок

  • Исправлена отладочная отрисовка масштабированного кругового тела в Arcade Physics (спасибо @pixelpicosean)
  • Исправлена ошибка в DataManager.merge, где он копировал ссылку на объект вместо его значения (спасибо @rexrainbow)
  • SceneManager больше не копирует shutdown и destroy обратные вызовы в createSceneFromObject, так как эти обратные вызовы не вызываются автоматически и должны быть вызваны через события сцены (спасибо @samme)
  • Стандартный порог кнопок джойстика изменен с 0 на 1. Ранее значение 0 делало все кнопки джойстика выглядеть как нажатыми (спасибо @jmcriat)
  • InputManager.hitTest теперь учитывает разрешение игры, что предотвращает смещение тестов, если разрешение не равно 1 (спасибо @sftsk)
  • CameraManager.getCamera теперь возвращает камеру по её имени (спасибо @bigbozo)
  • Исправлено выключение плиток для масштабированных камер.Когда камера масштабировалась, плитки удалялись слишком агрессивно, так как размеры не учитывали уровень масштабирования (спасибо @bigbozo)
  • При вызове ScenePlugin.start любые дополнительные данные, переданные методу, терялись, если сцена не находилась в активном состоянии (спасибо @stuff)
  • При вызове Timeline.resetTweens, пока твины находятся в состоянии ожидания удаления или завершения, выбрасывалась ошибка TypeError о неопределенном makeActive (спасибо @allanbreyes)
  • WebGL контекст теперь устанавливает antialias в undefined, если он не был установлен в конфигурации игры. Исправление #3386 (спасибо @samme)
  • TweenManager теперь проверяет состояние твина перед его воспроизведением. Если твин не находится в состоянии ожидания, он пропускается. Это позволяет немедленно останавливать твин после его создания, не позволяя ему воспроизвестись хотя бы один раз. Исправление #3405 (спасибо @Twilrom)
  • Метод InputPlugin.processOverOutEvents не всегда правильно вычислял общее количество объектов, с которыми происходило взаимодействие, что приводило к отключению событий ввода в сценах, расположенных ниже в списке сцен, если что-то было перетаскиваемо в верхней сцене. Исправление #3399 (спасибо @Jerenaux)
  • Метод InputPlugin.processDragEvents не всегда возвращал целое число.
  • LoaderPlugin.progress и соответствующее событие теперь учитывают как размер списка, так и размер текущих загрузок при вычислении процента завершения.Исправление #3384 (спасибо @vinerz @rblopes @samme)
  • Phaser. Utils. Array. Matrix. RotateLeft фактически поворачивал вправо (спасибо @Tomas2h)
  • Phaser. Utils. Array. Matrix. RotateRight фактически поворачивал влево (спасибо @Tomas2h)
  • При удалении сцены из SceneManager ключ в хеше сцены устанавливался в undefined, что препятствовало регистрации новой сцены с тем же ключом. Теперь она правильно удаляется из хеша (спасибо @macbury)
  • Графика. Прозрачность (alpha) игнорировалась в WebGL-рендерере и теперь правильно применяется к заливке и контурам. Исправление #3426 (спасибо @Ziao)
  • Шрифт теперь синхронизируется с контекстом в Text перед выполнением обёртывания слова, что гарантирует, что результат обёртывания между обновлением текста и получением обёрнутого текста будет одинаковым. Исправление #3389 (спасибо @rexrainbow)
  • Добавлен компонент ComputedSize к Game Object Text, что позволяет методам Text. getBounds и связанным методам снова работать, вместо возврата NaN.
  • Group. remove теперь вызывает removeCallback и передаёт в него удаляемый дочерний объект (спасибо @orblazer)

Обновления

  • Текст переменной testString изменился с |MÉqgy на |MÉqgy.

  • Значения ширины и высоты WebGLRenderer теперь округляются вниз при умножении на разрешение.

  • WebGL Context теперь по умолчанию устанавливает premultipliedAlpha в true, что предотвращает отображение WebGL контекста как белого цвета под некоторыми версиями macOS Safari.

  • Константы Phaser. Display. Align теперь доступны в пространстве имен.Исправление #3387 (спасибо @samme)

  • Константы Phaser.Loader теперь доступны в пространстве имен. Исправление #3387 (спасибо @samme)

  • Константы Phaser.Physics.Arcade теперь доступны в пространстве имен. Исправление #3387 (спасибо @samme)

  • Константы Phaser.Scene теперь доступны в пространстве имен. Исправление #3387 (спасибо @samme)

  • Константы Phaser.Tweens теперь доступны в пространстве имен. Исправление #3387 (спасибо @samme)

  • Утилиты Array Matrix теперь доступны и могут быть использованы через Phaser.Utils.Array.Matrix.

  • Метод Actions.Angle теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.IncAlpha теперь имеет Yöntem Actions.IncAlpha теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.IncX теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.IncY теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.IncXY теперь имеет 4 новых аргумента: stepX, stepY, index и direction.

  • Метод Actions.Rotate теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.ScaleX теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.ScaleXY теперь имеет 4 новых аргумента: stepX, stepY, index и direction.

  • Метод Actions.ScaleY теперь имеет 3 новых аргумента: step, index и direction.

  • Метод Actions.SetAlpha теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetBlendMode теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetDepth теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetOrigin теперь имеет 4 новых аргумента: stepX, stepY, index и direction.

  • Метод Actions.SetRotation теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetScale теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetScaleX теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetScaleY теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetVisible теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetX теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetXY теперь имеет 2 новых аргумента: index и direction.

  • Метод Actions.SetY теперь имеет 2 новых аргумента: index и direction.

  • Метод Line.getPointA теперь возвращает Vector2 вместо неотмеченного объекта. Теперь у него также есть необязательный аргумент, который позволяет передать vec2 для заполнения, вместо создания нового.

  • Метод Line.getPointB теперь возвращает Vector2 вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать vec2 для заполнения, вместо создания нового.

  • Метод Rectangle.getLineA теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Метод Rectangle.getLineB теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Метод Rectangle.getLineC теперь возвращает Line вместо неотрyped объекта.Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Rectangle. getLineD теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Triangle. getLineA теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Triangle. getLineB теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Triangle. getLineC теперь возвращает Line вместо неотрyped объекта. Также теперь у него есть необязательный аргумент, который позволяет передать Line для заполнения, вместо создания нового.

  • Событие destroy GameObject теперь срабатывает в начале процесса уничтожения, до удаления таких компонентов, как тело или менеджеры ввода, поэтому вы можете использовать обработчик события для извлечения любой информации, которую вам требуется из GameObject, прежде чем он будет действительно удален. Ранее событие отправлялось в конце процесса.

  • Phaser 3 теперь построен с использованием Webpack v4.1.1, и все связанные пакеты были обновлены (спасибо @orblazer)

  • В WebGL текущий Scissor теперь обновляется при вызове метода resize рендерера (спасибо @jmcriat)* PathFollower. start переименован в startFollow, чтобы избежать конфликта с компонентом анимации.

  • PathFollower. pause переименован в pauseFollow, чтобы избежать конфликта с компонентом анимации.

  • PathFollower. resume было переименовано в resumeFollow, чтобы избежать конфликта с компонентом Animation.

  • PathFollower. stop было переименовано в stopFollow, чтобы избежать конфликта с компонентом Animation.

  • BaseSound. setRate было переименовано в calculateRate, чтобы избежать путаницы при установке скорости звука. ## Версия Yöntem 3. 2. 1 - 12 марта 2018### Исправления ошибок

  • Исправлена проблема с окраской текстуры рендера. Fix #3336 (спасибо @rexrainbow)

  • Исправлена функция Utils.String.Format (спасибо @samme)

  • Мастер-дебаг-слой не очищался при работе в режиме canvas. Fix #3345 (спасибо @samid737)

  • Метод TimerEvent.remove немедленно отправлял событие таймера на основе противоположности аргумента метода, что делало его поведение противоположным ожидаемому. Теперь он отправляет событие только по запросу (спасибо @migiyubi)

  • TileSprite Canvas Renderer не поддерживал вращение, масштабирование или отражение. Fix #3231 (спасибо @TCatshoek)

  • Исправлена ошибка Group, которая не удаляла дочерние элементы из сцены при очистке с использованием аргумента removeFromScene (спасибо @iamchristopher)

  • Исправлена ошибка в конвейере света при отсутствии определенного менеджера света (спасибо @samme)

  • ForwardDiffuseLightPipeline теперь использует sys.lights вместо переменной сцены, чтобы избежать ошибок из-за удаления инъекции.

  • Phaser.Display.Color.Interpolate возвращал NaN значения, так как загружал неправильную линейную функцию. Fix #3372 (спасибо @samid737)

  • RenderTexture.draw рисовал только базовую рамку текстуры. Fix #3374 (спасибо @samid737)

  • Масштабирование TileSprite отличалось между WebGL и Canvas. Fix #3338 (спасибо @TCatshoek)

  • Text.setFixedSize неправильно устанавливало свойство text вместо свойства parent. Fix #3375 (спасибо @rexrainbow)

  • RenderTexture.clear на canvas использовал последнее состояние трансформации, вместо очистки всего текстуры.### Обновления

  • Метод SceneManager.render теперь будет рендерить сцену, если она находится в состоянии LOADING или выше. Ранее он рендерил только сцены в состоянии RUNNING, что исключало сцены, загружающие активы.

  • Сцену теперь можно перезапустить, вызвав scene.start() без передачи аргументов (спасибо @migiyubi)

  • Класс GameObject теперь доступен через Phaser.GameObjects.GameObject (спасибо @rexrainbow)

  • Камера, следящая за игровым объектом, теперь учитывает коэффициент масштабирования камеры при прокрутке. Исправление #3353 (спасибо @brandonvdongen)

  • Вызов setText для объекта BitmapText теперь пересчитывает значения исходной точки отображения. Исправление #3350 (спасибо @migiyubi)

  • Теперь можно передать объект в Loader.atlas, как и для изображений. Исправление #3268 (спасибо @TCatshoek)

  • Callback onContextRestored больше не будет определен, если WebGL-рендерер не используется в следующих объектах: BitmapMask, Static Tilemap, TileSprite и Text. Это должно позволить этим объектам работать в режиме HEADLESS. Исправление #3368 (спасибо @16patsle)

  • Метод SetFrame теперь имеет два необязательных аргумента: updateSize и updateOrigin (оба по умолчанию true), которые обновляют размер и исходную точку отображения игрового объекта соответственно. Исправление #3339 (спасибо @Jerenaux)

Версия 3.2.0 - Kaori - 5 марта 2018### Новые функции

  • Новый объект игры Render Texture теперь доступен. Вы можете очищать, заполнять и рисовать кадры текстуры. Render Texture сама может быть отображена в игре с собственным трансформом, или вы можете использовать её как Bitmap Mask для другого объекта игры.
  • Метод Game.resize позволяет изменять размер конфигурации игры, рендерера и системы ввода одним вызовом.
  • При вызове Game.resize вызываются методы resize всех систем сцен. Это, в свою очередь, вызывает событие resize, на которое ваша сцена может откликнуться. Событие будет отправлено новую ширину и высоту холста как только два параметра.
  • Метод InputManager.resize позволяет обновлять bounds def и input scale одним вызовом.
  • В конфигурацию игры добавлено свойство Config.roundPixels для предотвращения подпиксельной интерполяции при рендеринге объектов игры в WebGL и Canvas.
  • Метод Load.plugin теперь принимает класс как аргумент, а также URL-строку (спасибо @nkholski).
  • Метод Tween.complete позволяет помечать твин как завершённый, независимо от того, на каком этапе он находится. Если определён обработчик завершения, он будет вызван. Вы можете задать задержку перед этим (спасибо @Jerenaux за идею).
  • Реализован режим рендеринга Headless. Вы можете установить HEADLESS как renderType в конфигурации игры, и она будет выполнять специальный шаг игры, пропускающий рендеринг.Она всё ещё создаёт элемент Canvas, так как многие внутренние системы (например, ввод) на него опираются, но она не рисует ничего на нём. Исправление #3256 (спасибо @rgk)
  • GameObject. setInteractive имеет новый булев аргумент dropZone, который позволяет задать объект как зону для перетаскивания прямо из метода.
  • Теперь спрайты могут быть зонами для перетаскивания и иметь другие объекты игры, перетаскиваемые на них как цели.
  • У SceneManager добавлен новый метод: remove, который позволяет удалять и уничтожать сцены.
  • SceneManager. moveAbove перемещает сцену непосредственно над другой сценой в списке сцен. Это также доступно в ScenePlugin.
  • SceneManager. moveBelow перемещает сцену непосредственно под другой сценой в списке сцен. Это также доступно в ScenePlugin.
  • Добавлена квадратичная интерполяция Безье к функциям Math. Interpolation (спасибо @RiCoTeRoX)
  • Добавлен новый класс кривой Безье квадратичной, расширяющий доступные типы кривых (спасибо @RiCoTeRoX)
  • Path. quadraticBezierTo позволяет добавить кривую Безье квадратного порядка в ваш путь.
  • Загрузчик. multiatlas теперь поддерживает новый JSON-формат атласа от Texture Packer, который экспортирует объединённый атлас для всех изображений. Это доступно, если вы используете новый экспорт Phaser 3 из Texture Packer (спасибо @CodeAndWeb)
  • Модифицирован WebGlPipeline для упрощения расширения и создания пользовательских этапов рендеринга.### Исправления ошибок
  • Тела Arcade Physics Bodies не применяли результаты allowRotation к родительскому Game Object.
  • InputManager. updateBounds не корректно получал границы canvas, если у него были горизонтальное или вертикальное смещение на странице, что приводило к неверному масштабированию (и последующему неверному срабатыванию значений ввода).
  • TileSprite. setFrame теперь работает и позволяет изменять кадр на любой другой в текстуре. Fix #3232 (спасибо @Jerenaux)
  • Заменили цикл очереди в SceneManager на использование _queue.length вместо кэшированной длины (спасибо @srobertson421)
  • При вызове ScenePlugin.launch аргумент data теперь передается в очередные сцены (спасибо @gaudeon)
  • Rectangle. top не сбрасывал позицию y, если значение, которое было задано, никогда не превышало нижней границы Rectangle. Fix #3290 (спасибо @chancezeus)
  • Реализация topOnly в Input Manager сломала способ работы зон сброса, так как они теперь фильтровались из списка отображения до обработки. Зоны сброса теперь обрабатываются отдельно в Input Plugin, что позволяет иметь topOnly установленным и всё ещё сбрасывать элемент в зону сброса. Это косвенно исправило #3291 (спасибо @rexrainbow)
  • InputPlugin. clear теперь корректно удаляет Game Object из всех внутренних массивов, а не только из _list.
  • InputPlugin. processOverOut больше не считает элемент как "вне", если он находится в внутреннем массиве _drag.* При масштабировании Game Object его Arcade Physics тело всё ещё вычисляло его позицию на основе его исходного размера, а не масштабированного (спасибо @pixelpicosean).
  • Случайность классов RandomDataGenerator была улучшена благодаря правильному кэшированию свойства класса. Fix #3289 (спасибо @migiyubi)
  • Свойство sign класса RandomDataGenerator имело коллизию методов. Fix #3323 (спасибо @vinerz и @samme)
  • В Arcade Physics World, если вы сталкивали группу с самой собой, это вызывало отсутствующий метод (collideGroupVsSelf), теперь он корректно вызывает collideGroupVsGroup. Fix #3322 (спасибо @patrickgalbraith)
  • HTML5 Sound Manager теперь разблокирует Sound API при событии касания, только если есть аудиофайлы в кэше. Fix #3311 (спасибо @chancezeus)
  • Значение Text.lineSpacing не учитывалось при рендеринге Text. Fix #3215 (спасибо @sftsk)
  • InputPlugin. обновление теперь учитывает общее количество событий drag и pointerup при решении перейти к сцене ниже. Исправление #3333 (спасибо @chancezeus)

Обновления

  • AnimationComponent.play теперь вызывает setSizeToFrame() и updateDisplayOrigin() на родительском объекте игры, чтобы захватить ситуации, когда вы начинаете воспроизводить анимацию на объекте игры, который использует другой размер по сравнению с предыдущим установленным кадром.
  • Text.setText теперь проверяет, является ли предоставленное значение ложным, но не нулем, и устанавливает его в пустую строку, если это так.
  • BitmapText.setText теперь проверяет, является ли предоставленное значение ложным, но не нулем, и устанавливает его в пустую строку, если это так.
  • BitmapText. setText теперь преобразует предоставленное значение в строку перед установкой.
  • BitmapText. setText теперь изменяет текст только в том случае, если новый текст отличается от старого.
  • Если вы устанавливаете transparent в конфигурации игры, но не предоставляете backgroundColor, то он будет отображаться как черный. Теперь он будет правильно прозрачным. Если вы предоставляете цвет, он должен включать компонент альфа.
  • Теперь вы можете передавать обычные группы в Arcade Physics collide / overlap, а также Physics Groups. Исправление #3277 (спасибо @nkholski)
  • Texture. get был оптимизирован для быстрого завершения и последующего возбуждения ошибки с новой проверкой ложности. Это позволяет вам пропустить указание кадров анимации в конфигурации анимации без генерации предупреждения в консоли.
  • Метод setFrame компонента Texture был обновлен так, чтобы теперь автоматически сбрасывать width и height объекта игры, чтобы они соответствовали новому кадру. В связи с этим он также корректирует значения точки отображения, так как они основаны на размере. Если у кадра есть пользовательский пивот, он устанавливает точку отображения, чтобы она соответствовала пользовательскому пивоту.
  • ScenePlugin. swapPosition теперь позволяет использовать его для обмена позициями любых двух сцен.До изменения это позволяло только поменять позицию вызывающей сцены и другой, но новый необязательный аргумент keyB расширяет это.
  • Управление сценами больше не рендерит сцену, если она видима ИЛИ запущена ИЛИ приостановлена. Теперь это пропускает сцены, находящиеся в состоянии init.
  • Управление клавиатурой больше не возбуждает события keydown, если вы продолжаете удерживать клавишу. Исправление #3239 (спасибо @squaresun)
  • Управление сценами теперь использует новую очередь для всех ожидающих сцен, создавая их и запуская строго последовательно. Это должно предотвратить ошибки, когда сцены не могли ссылаться на другие сцены ниже в списке запуска в своих функциях создания. Исправление #3314 (спасибо @max1701 @rblopes)
  • Game.preBoot и Game.postBoot обратные вызовы теперь передают экземпляр игры в обратный вызов (спасибо @rblopes)
  • Графика.дуга в режиме WebGL теперь работает более похоже на дугу в режиме Canvas (спасибо @Twilrom)
  • GameObjects теперь при уничтожении выпускают событие 'destroy', которое можно использовать для выполнения любого дополнительного обработки, необходимого. Исправление #3251 (спасибо @rexrainbow)
  • Если звук HTML5AudioSound не может воспроизводиться, теперь он выпускает предупреждение в консоль (спасибо @samme)
  • Phaser теперь снова запускает тестирование сборки Travis CI (спасибо @vpmedia)
  • Обновления документации: спасибо @melissaelopez @samme @jblang94

Версия 3.1.2 - 23 февраля 2018### Обновления

  • Исправлены сотни проблем JSDoc по всему API.
  • Метод Tween.updateTweenData теперь проверяет, существует ли объект-цель перед обновлением его свойств.
  • При попытке использования локальной URI данных в загрузчике теперь выводится предупреждение в консоль вместо лога (спасибо @samme)

Исправления ошибок

  • Кодовый символ FORWARD_SLASH содержал опечатку и был изменен на FORWARD_SLASH. Исправление #3271 (спасибо @josedarioxyz)
  • Исправлена проблема с созданием буфера вершин на статическом слое Tilemap, что приводило к появлению слоев Tilemap в черном цвете. Исправление #3266 (спасибо @akleemans)
  • Реализована поддержка масштабирования статического слоя Tilemap и альфа-канала плиток.
  • Исправлена проблема с пустым текстурным объектом на этапе генерации партикл-эмиттера. Это проявлялось, если у вас были частицы с режимами смешивания, расположенные поверх других изображений.
  • Добавлен недостающий параметр данных в ScenePlugin. Исправление #3810 (спасибо @AleBles)

Версия 3.1.1 - 20 февраля 2018

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

  • Веб-аудио контекст теперь приостанавливается вместо закрытия, чтобы предотвратить ошибки 'Failed to construct AudioContext: maximum number of hardware contexts reached' от Chrome в режиме горячей перезагрузки. Мы все еще настоятельно рекомендуем использовать один и тот же контекст в рабочей среде. Подробнее см. этот пример. Исправление #3238 (спасибо @z0y1 @Ziao)
  • Вебпаковый плагин теперь срабатывает на onBuildExit, что означает, что он обновит примеры, если вы используете webpack watch (спасибо @rblopes)
  • Добавлен флаг root: true в конфигурацию eslint для предотвращения сканирования выше по файловой системе.### Исправления ошибок
  • Метод Math.Fuzzy.Floor имел неверную сигнатуру.
  • В Arcade Physics World отсутствовали импорты GetOverlapX или GetOverlapY, что привело к сбою separateCircle.
  • В TileSprite отсутствовала ссылка на gl, что приводило к ошибке при потере и восстановлении контекста.
  • В записи Mesh Game Object Factory были переданы неверные аргументы в конструктор Mesh.
  • Удалено неиспользуемое свойство _queue из класса ScenePlugin (спасибо @rblopes).
  • Переменная static больше не используется в Arcade Physics, что исправляет ошибку 'static является зарезервированным словом' в строгом режиме (спасибо @samme).
  • Исправлены методы Set.union, Set.intersect и Set.difference (спасибо @yupaul).
  • Цвета углов были применены в неправильном порядке. Исправляет #3252 (спасибо @Rybar).
  • Объекты BitmapText игнорировали вызов setOrigin. Исправляет #3249 (спасибо @amkazan).
  • Исправлено подергивание камеры на 1px и проблема с просачиванием в рендерере. Исправляет #3245 (спасибо @bradharms).
  • Исправлена ошибка WebGL: INVALID_ENUM: blendEquation: invalid mode. возникающая на iOS. Исправляет #3244 (спасибо @Ziao).
  • Функция drawBlitter могла упасть, если roundPixels была истинной. Исправляет #3243 (спасибо @Jerenaux и @vulcanoidlogic).

Версия 3.1.0 - Onishi - 16 февраля 2018

Обновления* Обновлен код обработки ресурсов Vertex, что еще больше оптимизирует WebGL-агрегацию. Вы должны заметить уменьшение количества операций gl на кадр для всех агрегаций.

  • Объект игры Blitter был обновлен для использования структуры List вместо DisplayList.

  • Метод disableBody в мире Arcade Physics был переименован в disableGameObjectBody для более точного отражения его функции.

  • Были удалены многие неиспользуемые свойства из объекта статического тела Arcade Physics.

  • Статическое тело Arcade Physics теперь может обновлять свое состояние из родительского объекта через метод refreshBody.### Исправленные ошибки

  • Было обнаружено несколько случайных использований let, что приводило к ошибкам при загрузке изображений в Safari # (спасибо Yat Hin Wong)

  • Восстановлен статический метод Graphics.TargetCamera, что исправило проблему с Graphics.generateTexture.

  • Действие SetHitArea теперь вызывает setInteractive, что исправляет Group.createMultiple при установке области столкновения.

  • Удалены случайные вызовы Tween emit. Исправление #3222 (спасибо @ZaDarkSide)

  • Исправлено неправильное использование метода TweenManager.makeActive. Исправление #3219 (спасибо @ZaDarkSide)

  • Компонент Depth отсутствовал в объекте игры Zone. Исправление #3213 (спасибо @Twilrom)

  • Исправлена проблема с перезаписью предыдущих данных вершин объектом Blitter.

  • Исправлено неправильное применение цвета к объекту Tile, теперь плитки корректно уважают значения прозрачности.

  • Объект BitmapMask иногда неправильно привязывал свои ресурсы.

  • Исправлено неправильное использование целевого объекта в MergeXHRSettings (спасибо @samme)

Новые возможности

  • Добавлен новый метод
  • Arcade Physics Colliders теперь имеют новое свойство name и соответствующий метод setName.
  • Тела Matter.js теперь имеют встроенный метод destroy, который удаляет их из мира.
  • Тела Impact теперь автоматически удаляются из мира при уничтожении.
  • Добавлено статическое свойство Vector2.ZERO.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/redw1234567-phaser3_wx.git
git@api.gitlife.ru:oschina-mirror/redw1234567-phaser3_wx.git
oschina-mirror
redw1234567-phaser3_wx
redw1234567-phaser3_wx
master