beginPath
на целевом контексте перед обработкой стека команд. Это приводит к очистке любых подпутей, которые могли сохраниться в стеке из предыдущих объектов Graphics или кадров. Это делает его более соответствующим ожиданиям WebGL при вызове Graphics.clear
.TileSprite.setTileScale
ошибочно устанавливал позицию плитки вместо масштаба. Прямое использование свойств работало корректно, но метод был некорректен (спасибо @alexeymolchan)Text.setStyle
приводил к исчезновению текста, если не было указано свойство resolution
в конфигурационном объекте стиля. Теперь вызов setStyle
изменяет только указанные свойства, оставляя предыдущие без изменений. Исправление #4011 (спасибо @okcompewter)render.visible
объекта было установлено на false
, то все последующие отладочные объекты не рисовались. Теперь рендер пропускает только объекты с скрытыми отладочными графическими элементами (спасибо @jf908)Благодарю следующих участников за помощь в создании примеров, документации и определений TypeScript для Phaser 3, либо отчетами об ошибках, их исправлением или авторством документации:## Версия 3.12.0 - Silica - 4 сентября 2018
В версии 3.11 я полностью переработал TextureTintPipeline, WebGL-пакет, используемый для рендера всех объектов на основе текстур, таких как спрайты. В этой версии я сделал то же самое для FlatTintPipeline. Этот пакет использовался исключительно объектом Graphics для рисования заполненных и заливаемых примитивов в WebGL. Также он использовался классами, такими как камера, для рисования их цветных фонов и эффектов пульсации и затухания.Когда я внимательно изучил шейдеры, используемые в текстурном и графическом пакетах, я обнаружил, что они практически одинаковы. Однако, если вы использовали объекты Graphics и Sprites в своей игре, это приводило к полной очистке пакета при переключении между ними, вызывая перезагрузку шейдеров, что увеличивало количество вызовов рендера и операций OpenGL на кадр. Чем больше я изучал графический пайплайн, тем больше видел тех же самых вещей, что и в текстурном пайплайне: дублированные переменные, встроенные матричные операции и так далее. Поэтому я прошел через процесс рефакторинга, сводя всё к нескольким основным методам и переиспользуя методы, которые уже были в текстурном пайплайне. В результате я смог полностью удалить пайплайн FlatTintPipeline. Это экономит 42,3 КБ (не сжатые) и удаляет 1000 строк кода из сборки. Конечно, многие методы были добавлены в текстурный пайплайн, но это увеличение составило всего от 730 до 1087 строк кода, что является лишь небольшой частью исходного объёма! И преимущества не заканчиваются на этом. Если у вас были какие-либо пользовательские конвейеры, которые расширяли FlatTintPipeline, пожалуйста, обновите их, чтобы они расширяли TextureTintPipeline вместо этого. Вам, вероятно, придется переопределить несколько методов, но большинство из них останется без изменений. Проверьте подпись методов, однако.Теперь тот же конвейер может рисовать как графические объекты, так и спрайты, используя один и тот же шейдер и без необходимости переключения текстур. Это означает, что вы можете смело использовать объекты Graphics вместе со спрайтами, и это не будет стоить вам дополнительных затрат по производительности. Есть и другие преимущества, которые описаны в списке ниже.
batchTri
добавляет треугольник в батч вершин, либо текстурированный, либо заполненный.drawFillRect
— новый метод, который добавляет неизмененный прямоугольник в батч. Эти методы используются для заполнения цветом фона, например, камерами.batchFillRect
перемещен в TextureTintPipeline и имеет более компактную подпись метода.batchFillTriangle
перемещен в TextureTintPipeline и имеет более компактную подпись метода.batchFillPath
перемещен в TextureTintPipeline и имеет более компактную подпись метода.batchLine
перемещен в TextureTintPipeline.Процесс управления режимом вырезки в WebGLRenderer был полностью переписан. Ранее, режим вырезки gl постоянно включался и выключался для каждого камеры в вашей игре, что приводило к бесполезным операциям gl.
updateSystem
, который автоматически вызывается при изменении значений области видимости камеры. Это, в свою очередь, сообщает менеджеру сцен, если есть камеры с пользовательскими областями видимости в любой сцене вашей игры. Если таких камер нет, режим вырезки никогда не включается или не устанавливается, что означает нулевые операции gl! Если ваша игра использует камеры полного размера, теперь это не будет стоить вам ничего по поводу режима вырезки.Класс 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, или с помощью встроенной камеры.setCrop
, чтобы определить область обрезки. См. полную документацию для получения более подробной информации и изучения обширных примеров и тестов.### Новые функции и обновления объекта текстовой игрыОбъект текстовой игры получил внутреннее обновление, чтобы сделать его более гибким. Некоторые свойства были переименованы или перемещены, а также добавлены новые функции:
setCrop
, чтобы обрезать текст.renderer
.canvasTexture
было удалено.texture
и frame
. Эти свойства заменяют старое canvasTexture
, но выполняют ту же задачу, позволяя обрезку текстуры и значительно уменьшая код рендерера.text
не приводило к изменению отображаемого текста, так как ожидалось использование метода setText
для изменения отображаемого текста. Внутри свойство text
было переименовано в _text
и помечено как приватное, а также добавлен новый геттер / сеттер для text
, который передает управление методу setText
, что позволяет использовать оба способа установки текста. Исправление #3919 (спасибо @hackhat @samid737)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
.По умолчанию используется режим 'right-down', что означает, что плитки будут упорядочены, начиная с верхнего левого угла, отрисовываясь вправо и затем переходя к следующей строке.
Четыре режима отрисовки:
0 = right-down
1 = left-down
2 = right-up
3 = left-up* Tilemap имеет новое свойство renderOrder
, которое представляет собой строковую версию режима рендера, используемую при создании новых слоев через карту. Если карта создается из Tiled JSON данных, она будет использовать тот режим рендера, который указан в данных карты.
setRenderOrder
. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Затем он используется во время создания любых слоев с этого момента.setRenderOrder
. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Затем он используется во время рендера слоя. Вы можете изменять значение на лету.setRenderOrder
. Этот метод принимает либо целое число, либо строковую версию режима рендера и сохраняет его локально. Под WebGL он пересоздает весь буфер вершин, используя новый режим отрисовки. Под Canvas он использует его во время рендера. Вы можете изменять его на лету.renderorder
из Tiled JSON.renderOrder
, которое заполняется парсером Tiled.### Обновления Matter.jsВерсия Matter.js, используемая в Phaser, была обновлена с 0.13.1 до 0.14.2. Для ясности, почему мы не включаем Matter через npm, это потому, что мы используем кастомизированную версию Matter, которая включает дополнительные функции и оптимизации, которые еще не включены в официальной библиотеке.Большинство обновлений касались документации и пространства имен модулей, однако те, которые относятся к Phaser, перечислены ниже. Вы также можете просмотреть полный Change Log Matter.
point
в Body.scale, закрывает #428 (894c1ef), закрывает #428
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
, который генерирует объект данных обрезки, необходимый для игровых объектов, поддерживающих обрезку. Это позволяет нам удалить дублирующийся код из нескольких игровых объектов и заменить его одним вызовом функции.batchSprite
, который объединяет процесс рисования текстурного игрового объекта на холсте. Он обрабатывает прозрачность, режим смешивания и матричные вычисления в одной функции и теперь используется почти всеми рендерерами игровых объектов на холсте.batchTexture
в конвейере текстурного окрашивания теперь поддерживает обрезанные игровые объекты и будет корректировать рисуемый текстурный кадр соответственно.Matrix Stack
был удален. Он больше не используется внутренне и просто занимал место. * Вы можете теперь указать lineHeight
для ретро шрифта в объекте конфигурации ретро шрифта (спасибо @FelixNemis)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)CullTiles
из версии 3.11 не учитывали положение слоя Tilemap при вычислении границ, что приводило к тому, что статические слои, отображаемые за пределами области просмотра камеры, никогда не рисовались в режиме Canvas. Метод также был оптимизирован, теперь он выполняет меньше делений и меньше проверок при отключении отсечения.collisionEnd
многократно, когда он должен срабатывать только один раз (спасибо @mikewesthad).Body.speed
физики Arcade Physics теперь устанавливается всякий раз, когда вы задаете скорость через setVelocity
, setVelocityX
или setVelocityY
, что предотвращает сброс скорости тела до нуля, если useDamping
включено. Исправление #3888 (спасибо @samme)getPixelAlpha
менеджера текстур не использовал правильное имя кадра. Теперь это имя передается правильно. Исправление #3937 (спасибо @goldfire)getPixelAlpha
и getPixel
менеджера текстур позволяли координатам x/y за пределами вырезанной области кадра. Теперь они проверяются на соответствие границам кадра. Исправление #3937 (спасибо @goldfire)SKIP_TEST
с помощью геттера или метода setBlendMode
.World.disable
передавал неверный аргумент, поэтому тело никогда не отключалось. (спасибо @samme) * В Canvas режиме появился визуальный дефект с округленными прямоугольниками из-за добавления аргумента overshoot
в вызове Graphics arc. Это было исправлено, теперь дуги рендерятся правильно и последовательно в WebGL и Canvas, а также округленные прямоугольники снова работают нормально. Исправление #3912 (спасибо @valse)InputManager.inputCandidate
, который определяет, может ли объект игры быть взаимодействован с указателем и камерой, теперь учитывает полное состояние камеры. Это означает, что если камера игнорирует объект игры, вы больше не сможете взаимодействовать с ним, или если камера игнорирует контейнер с интерактивным объектом игры внутри него, вы не сможете взаимодействовать с детьми этого контейнера. Ранее они взаимодействовали бы независимо от состояния камеры. Исправление #3984 (спасибо @NemoStein @samid737)Transform.getWorldTransformMatrix
был переписан для корректного итерирования родителей трансформации и применения матричных умножений по ходу. Это (вместе с некоторыми изменениями в Input Manager) исправляет проблему с объектами игры внутри контейнеров, которые не проходят тесты столкновений при определенных углах. Исправление #3920 (спасибо @chaping @hackhat)collide
во время метода update
не возвращал результаты обратно в родительский объект тела, что приводило к продолжительному движению тел. Использование Colliders работало, но ручная проверка не работала.Теперь оба метода работают. Исправление #3777 (спасибо @samme)setTintFill
игнорировал значение alpha
объекта игры в шейдере. Теперь значение alpha смешивается с заполнением цвета, что позволяет правильно выключать альфа-канал заполненных цветом объектов игры. Исправление #3992 (спасибо @trl-bsd)collideSpriteVsTilemapLayer
теперь синхронизирует результаты столкновений обратно в тело, что позволяет вызывать collide
из цикла обновления снова. Исправление #3999 (спасибо @nkholski @mikewesthad)deltaX
и deltaY
теперь возвращают предыдущие значения delta, а не ноль. Исправление #3987 (спасибо @HaoboZ)@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, которая блокировала браузер при индексировании поля поиска.
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
— это новая метод, которая перемещает камеру так, чтобы область видимости была центрирована на указанные координаты. Практический способ перехода к различным точкам на карте без необходимости вычисления смещений прокрутки.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.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 миллисекунд.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).clearMask(true)
теперь проверяет наличие маски перед ее уничтожением, чтобы избежать исключения, если объект игры не имеет маски. Исправление #3809 (спасибо @NokFrt)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 за его помощь в завершении документации для игровых объектов.
addPointer
или не указали один указатель в конфигурации. Теперь, если касание включено в конфигурации, по умолчанию всегда создаются два указателя.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 до тех пор, пока это свойство не будет снова установлено.mousePointer
, pointer1
, pointer2
, pointer3
, pointer4
, pointer5
, pointer6
, pointer7
, pointer8
и pointer10
. Большинство из этих свойств будут неопределены, пока вы не вызовете метод addPointer
или не установите количество активных указателей в конфигурации игры.transformPointer
, который устанавливает преобразованные свойства x и y указателя в одном вызове, вместо двух вызовов, как это было раньше. Этот метод теперь используется всеми обработчиками событий указателя.makePixelPerfect
, который позволяет указать текстуру-основу для игрового объекта как пиксель-совершенный при выполнении всех проверок ввода. Вы можете использовать его следующим образом: this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect())
, или более простым способом: setInteractive({ pixelPerfect: true })
— вы также можете передать или установить необязательный уровень терпимости по прозрачности. См. документацию метода для полных подробностей и новых примеров, чтобы увидеть его в действии. Обратите внимание, что при взаимодействии указателя с игровым объектом будет постоянно проверяться текстура, извлекая один пиксель из заданных координат и проверяя его цветовые значения. Этот процесс является дорогостоящим, поэтому он должен быть включен только для тех игровых объектов, которые действительно в этом нуждаются. ### Ввод - Пользовательские указатели* Теперь вы можете задать пользовательский указатель для вашей игры через this.input.setDefaultCursor()
. Это примет любую допустимую строку 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 для задания указателя.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)
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).centerX
и centerY
, которые возвращают координаты центра области просмотра относительно холста (спасибо @samme).visible
. Невидимый 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')
изнутри сцены.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).remove()
компонента Animation, когда Animation
удаляется из AnimationManager
. Это препятствовало правильному остановлению удаленных анимаций.TweenManager.getTweensOf
исправлен для предотвращения возможного бесконечного цикла, если в него передано несколько целей (спасибо @cyantree).Персонально я также документировал всю систему ввода, что включает в себя 328 классов, свойств и методов для описания, а также множество других областей.
npm run help
отобразит дружественный список всех доступных скриптов (сначала выполните npm install
)hasFocus
, которое является только для чтения булевым значением, которое позволяет узнать, имеет ли окно, в которое встроена игра (включая iframe), фокус или нет.autoFocus
, которое по умолчанию равно true
и автоматически вызывает window.focus()
при запуске игры.window.focus
. Это означает, что в играх, использующих клавиатурные управления, если вы переключаетесь на другое окно или нажимаете вне игры, а затем снова нажимаете на неё, клавиши продолжат работать (в отличие от предыдущего поведения, когда они оставались неактивными).setAllowDrag
, который переключает свойство allowDrag
(спасибо @samme)setAllowGravity
, который переключает свойство allowGravity
(спасибо @samme)setAllowRotation
, который переключает свойство allowRotation
(спасибо @samme)allowDrag
, allowGravity
и allowRotation
(спасибо @samme)addToScene
, которое позволяет внедрить новый тип файла в LoaderPlugin данной сцены. Вы можете использовать это, чтобы добавить тип файла в сцену, в которой он был загружен.mapping
. Это позволяет задать глобальному плагину ключ свойства, чтобы он автоматически внедрялся в любые сцены как экземпляр уровня сцены. Это позволяет иметь один глобальный плагин, работающий в PluginManager, который автоматически внедряется в каждую сцену.lerpX
и lerpY
, которые позволяют установить значение интерполяции, используемое при следовании за целью. По умолчанию это значение равно 1 (без интерполяции) и offsetX
и offsetY
, которые позволяют установить значения смещения следования. startFollow теперь сразу устанавливает значения scrollX
и scrollY
камеры равными координатам позиции цели, чтобы избежать значительного начального линейного интерполяционного смещения в течение первых нескольких preUpdates.mapping
, который позволяет глобальному плагину быть внедренным в сцену как ссылка.preDestroy
, чтобы воспользоваться системой обратных вызовов preDestroy.preDestroy
, чтобы воспользоваться системой обратных вызовов preDestroy.ignoreDestroy
.destroy
.dragend
теперь будет транслироваться только в том случае, если пороговые значения расстояния перетаскивания или времени не были достигнуты. Исправление #3686 (спасибо @RollinSafary)Мои благодарности следующим за помощь в Phaser 3 Примерах, Документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:
@mikez @wtravO @thomastanck
Нововведение в этой версии — переработанный менеджер плагинов. 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)
maxTextures
, который основан на gl.MAX_TEXTURE_IMAGE_UNITS
, вы можете получить его через новый метод getMaxTextures()
.maxTextureSize
, который основан на gl.MAX_TEXTURE_SIZE
, вы можете получить его через новый метод getMaxTextureSize()
.compression
, который содержит поддержку сжатых текстур браузером / устройством через gl-расширения, которые заполняются во время init
.generateFrameNames
для определения анимации из текстурного атласа вы теперь можете пропустить все параметры конфигурации, и он создаст анимацию, используя каждый найденный в атласе кадр. Пожалуйста, понимайте, что вы не контролируете последовательность этих кадров, если делаете это, и она полностью определяется данными JSON (спасибо @Aram19)this.input.keyboard.on('keydown_NUMPAD_ZERO')
(спасибо @Gaushao)setRandomPosition
, который случайным образом располагает их в определенной области, или если область не указана, в пределах размера игры.### Обновленияprestep
, которое некоторые глобальные системы используют для выполнения предварительных задач, например, звук и ввод. Вы можете использовать его для выполнения предварительных задач, что идеально подходит для плагинов.step
. Это событие отправляется один раз на кадр. Вы можете использовать его для подключения плагинов или кода, который существует вне сцены.poststep
. Это последний шанс для выполнения задач перед началом процесса рендеринга.setTexture2D
только в том случае, если индекс источника боба изменился. Ранее он вызывал его для каждого боба.WebGLRenderingContext
во время инициализации WebGLRenderer.init, если ранее он был неопределен при запуске в WebGL. Если вы предоставили свой собственный контекст, он устанавливается в этот контекст.onStepCallback
класса Game был удален. Теперь вы можете слушать новые события шага.document.body
перед установкой слушателей. Исправляет старые версии Firefox, похоже. #3649 (спасибо @squilibob)getBounds
для вложенного контейнера. Исправление #3624 (спасибо @poasher)Большое спасибо следующим за помощь в примерах Phaser 3, документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:
@samme @mzguimaraes @NaNdreas @Matthew-Herman @melissaelopez @TheColorRed
Мы добавили компонент 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 теперь обрабатывает поток данных немного по-другому. Ранее он загружал каждый файл, и только после того, как все они были загружены, он обрабатывал их по порядку. Это добавляло их в различные кэши, создавал текстуры и так далее.Теперь это происходит сразу после загрузки файла, так как браузер, вероятно, будет в основном бездействовать в это время, поэтому это позволяет нам распределить обработку файлов на протяжении всего времени загрузки, а не в одном пакете в конце.
atlasXML
, который загружает XML-атлас текстур в формате Shoebox / Starling / Flash CC.multiatlas
Loader изменился. Теперь вам не нужно указывать URL-адреса изображений, вместо этого Loader читает их из JSON-данных и автоматически добавляет их в 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
. Все остальное осталось без изменений, но пожалуйста, обновите его использование на новое имя метода.
loader
.Также добавлено новое свойство cache
, которое является ссылкой на кеш, в который будет сохранен тип файла.hasCacheConflict
, который проверяет, существует ли ключ, соответствующий ключу, используемому этим файлом, в целевом кеше.addToCache
, который добавляет файл в его целевой кеш и затем вызывает событие filecomplete
, передавая ключ файла и ссылку на сам файл слушателю (спасибо @kalebwalton за связанный PR).cacheManager
, которое является ссылкой на глобальный кеш игры и используется типами файлов.textureManager
, которое является ссылкой на глобальный менеджер текстур и используется типами файлов.destroy
для всех файлов после завершения их обработки. Они теперь освобождают ссылки и дополнительные данные, что позволяет им быть собраны сборщиком мусора.load.image({ key: 'shinyRobot', url: 'rob.png', normalMap: 'rob_n.png' });
- вы всё ещё можете использовать предыдущий метод массива.loaderEnableParallel
было удалено.* Теперь вы можете задать заголовок X-Requested-With
в запросах XHR, указав его в конфигурации XHRSettings, как в игре, так и в сцене или конфигурации файла.raw-loader
, и изменена синтаксическая структура вызовов DefinePlugin.raw-loader
для импорта исходного кода шейдеров. Вместо этого он компилируется в обычные JS-файлы в рамках нашего внутреннего рабочего процесса. Это должно позволить вам легче упаковывать Phaser с пакетами, отличными от Webpack.addtexture
каждый раз, когда вы добавляете новую текстуру, включая загрузку изображений из загрузчика (так как он автоматически заполняет менеджер текстур).После получения события addtexture
вы можете быть уверены, что изображение загружено, и текстура безопасна для применения к игровому объекту.destroy
, которые очищают их ссылки, освобождая их для сборки мусора.selfParent
, который позволяет самому холсту быть ключом родителя, используемым для последующего удаления.setSize
, который позволяет задать координаты x и y, ширину и высоту фрейма и автоматически обновляет все внутренние свойства. Этот метод теперь вызывается напрямую в конструкторе.TextureManager.exists
, как раньше.removetexture
.renderer
, так как оно часто используется внутри и полезно, если вы расширяете класс.* При уничтожении TextureSource теперь автоматически создается glTexture из его холста, если используется один.nativeTextures
, когда вы вызываете метод deleteTexture
.exists
, который возвращает логическое значение, указывающее на наличие записи для данного ключа в кэше.getIndex
возвращает индекс указанной сцены в списке сцен.ready
, когда завершается полная инициализация и все плагины становятся доступными. Re: #3636 (спасибо @Yazir)addToScene
. Если вы установите его в true
, объект игры будет автоматически добавлен в сцену, в то время как false
будет делать обратное, то есть: this.make.image(config, false)
. Вы все еще можете указать свойство add
в объекте конфигурации, но если предоставлен аргумент, он перекроет это свойство.addAtlasPyxel
и связанный парсер. Он и так не работал, и никто, похоже, больше не использует Pyxel. Если будет достаточно спроса, мы можем рассмотреть возможность его возвращения.loop
, если оно задано в исходном JSON.getDataSourceImage
, который возвращает сырые данные изображения источника.* WebAudioSoundManager теперь слушает события 'click' на теле документа, а также события касания, перед тем как возобновить AudioContext, чтобы управлять изменениями, внесенными в Chrome v66, которые не позволяют воспроизводить аудио до тех пор, пока не будет получено действие пользователя, даже на десктопе. ### Исправления ошибок* DataManagerPlugin будет выбрасывать ошибку при вызове Game.destroy, если у вас есть сцены в менеджере сцен, которые еще не были запущены. Исправление #3596 (спасибо @kuoruan)Game.scene.add
и передали объект данных, данные будут игнорироваться при запуске сцены.toJSON
для ParticleEmitter, отсутствовало свойство angle
, а также были некорректно преобразованы Emitter Ops (спасибо @samme)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)* Пайплайн передачи рассеянного света был жестко закодирован для предположения, что карту нормалей будет хранить в исходном индексе ноль. Теперь он правильно получает карту нормалей из индекса источника кадра, что означает, что все игровые объекты, которые использовали кадры из текстур многокарт, теперь будут работать правильно с источниками света.@wtravO @Fabadiculous @zilbuz @samme @iamchristopher @erd0s @PaNaVTEC @ksmai @snowbillr
Предварительная версия 3.7.0. Подробности см. в версии 3.7.1.
destroyChild
, который вызовет destroy
на дочернем элементе после его удаления.destroyChild
, который вызовет destroy
на всех дочерних элементах в группе после их удаления.### ОбновленияsetLite
на setLiteCollision
.setPassive
на setPassiveCollision
.setFixed
на setFixedCollision
.setActive
на setActiveCollision
. Ранее метод setActive
коллизии перезаписывал метод setActive
объектов, поэтому было переименовано.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.Group.getHandler
возвращал любого члена группы, независимо от состояния, что приводило к тому, что пулы оставались фиксированными на одном члене. Fix #3592 (спасибо @samme)Благодарю следующих за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как путём отчета об ошибках, их исправления, так и помощью в написании документации:
@Fabadiculous @Antriel
boot
, как и раньше, и системы, которые это требуют, будут слушать это событие и настраивать свои внутренние свойства в соответствии с этим. Они также будут делать то же самое под событием start
, что позволит им правильно перезапускаться после остановки. В 3.5, если сцена ранее не была запущена или начата, вы не могли бы полностью получить доступ ко всем её внутренним системам, но в 3.5.1 это возможно.deleteTexture
на обоих рендерах, но это доступно только в WebGL (спасибо @jmcriat)Благодарю следующих за помощь в создании примеров, документации и определений TypeScript для Phaser 3, как путём отчета об ошибках, их исправления, так и помощью в написании документации:
@NemoStein @gabegordon @gazpachu @samme @cristlee @melissaelopez @dazigemm @tgrajewski
fadeEffect
, flashEffect
и shakeEffect
. Вы все еще можете использовать дружественные методы уровня Camera: shake
, fade
и flash
._fadeAlpha
), были удалены. Если вам нужно получить доступ к этим значениям, вы можете сделать это гораздо более чисто через соответствующие классы эффектов камеры. Они всегда были приватными, но мы знали, что некоторые из вас модифицировали их, поэтому вам потребуется обновить код.Camera.cull
.callback
методов эффектов камеры изменилась. Оно больше не является callback-ом onComplete
, а теперь является callback-ом onUpdate
. Оно вызывается каждый кадр в течение всего эффекта. См. документацию для деталей аргументов.progress
на экземпляре эффекта, что позволяет вам синхронизировать длительность эффекта с другими событиями в игре.this.scene.transition
, который позволяет осуществлять переход от одной сцены к другой за указанный период времени. Метод принимает конфигурационный объект, который позволяет контролировать различные аспекты перехода, от перемещения сцен по списку отображения до указания функции обратного вызова onUpdate
.Вызовная сцена может быть отправлена в спячку, остановлена или полностью удалена из менеджера сцен по завершении перехода, и вы даже можете заблокировать события ввода в обеих сценах во время перехода, если это необходимо. Существуют различные события, отправляемые как из вызывающей, так и из целевой сцены, которые вместе с функцией обратного вызова onUpdate
предоставляют вам гибкость для создания действительно впечатляющих переходов как в, так и из сцен.
Для получения более подробной информации, пожалуйста, обратитесь к полным JSDocs для плагина ScenePlugin, а также к новым примерам в Phaser 3 Labs.
GameObject.ignoreDestroy
позволяет контролировать, уничтожается ли объект игры или нет. Установка флага сообщает объекту игнорировать запросы на уничтожение от групп, контейнеров и даже самой сцены. Подробнее см. документацию.Scene Input Plugin
появился новый параметр enabled
, который позволяет включать или отключать обработку ввода на уровне каждой сцены.### Исправленные ошибкиGL_INVALID_OPERATION: Vertex buffer is not big enough for the draw call
в WebGL.mute
, loop
, seek
и volume
.ignoreDestroy
.* Мастерская пружина мыши по умолчанию отключает отладочное отображение своего ограничения (вы можете переопределить это, передав свою собственную конфигурацию)Мои благодарности следующим за помощь в примерах Phaser 3, документации и определениях TypeScript, либо отчетами об ошибках, их исправлением или помощью в написании документации:
@samme @Antriel
В этой версии появился бета-выпуск нового объекта игры Container. Мы пометили его как бета-версию из-за известных проблем, возникающих при использовании контейнеров в сценах с несколькими камерами или нерегулярными областями видимости камер. Однако, в остальных случаях, которые мы проверили, они работают нормально, поэтому мы решили выпустить их в этот билд, чтобы разработчики могли привыкнуть к ним. Использование контейнера выдаст одно предупреждение в консоли в качестве напоминания. Мы уберем это предупреждение, когда контейнеры выйдут из бета-версии в будущем релизе. В то же время они полностью документированы, и вы можете найти множество примеров в репозитории Phaser 3 Examples.
correction
, используемый в вызове Engine.update и позволяющий корректировать время, передаваемое симуляции. Значение по умолчанию равно 1 для сохранения совместимости с предыдущими выпусками.getDelta
, который позволяет указать собственную функцию для вычисления значения delta, передаваемого в Matter Engine при обновлении.set60Hz
и set30Hz
, которые устанавливают частоту обновления движка на 60 Гц и 30 Гц соответственно. 60 Гц является значением по умолчанию. * Matter Physics имеет новый параметр конфигурации и времени выполнения autoUpdate
, значение по умолчанию которого равно true
. При включении этот параметр позволяет движку Matter обновляться в синхронизации с шагом игры (установленным с помощью requestAnimationFrame
). Значение delta, передаваемое в Matter, теперь контролируется функцией getDelta
.
step
, который позволяет вручную продвигать физическую симуляцию на один шаг, используя переданные значения delta и correction. При использовании вместе с autoUpdate=false
теперь можно явно контролировать частоту обновления физической симуляции и отвязать её от шага игры.debugShowJoint
и debugJointColor
. Если они определены, они отображают сочленения в телах Matter во время отладочной фазы postUpdate (только если отладка включена) (спасибо @OmarShehata).destroyChildren
, который автоматически вызывает destroy
для всех дочерних элементов Group, если установлен в true
(по умолчанию false
, поэтому публичный API не изменяется). Исправление #3246 (спасибо @DouglasLapsley).letterSpacing
, которое принимает положительное или отрицательное число для добавления / уменьшения интервала между символами (спасибо @wtravO)Tilemap. addTileset
, и это будет работать в WebGL, в отличие от предыдущего поведения, при котором отображался дефектный Tilemap. Исправление #3407 (спасибо @Zykino)ScenePlugin. start
без аргументов, но более ясное.destroy
при уничтожении (спасибо @rexrainbow)mapAdd
, которое используется для расширения стандартной карты внедрения сцены, а не её перезаписи (спасибо @sebashwa)getTopLeft
, getTopRight
, getBottomLeft
и getBottomRight
имеют новый опциональный аргумент includeParent
, который учитывает все преобразования предков в возвращаемой точке.### Исправления ошибокstartFollow
, но PathFollower. setPath по-прежнему использовал PathFollower. start
(спасибо @samid737)setRate
на своих звуковых объектах, вместо calculateRate
.getValue
для осей джойстика теперь корректно применяет порог и обнуляет возвращаемое значение.setZ
вместо setDepth
для слоя отладочных графических данных, что приводило к тому, что слой отображался позади объектов в некоторых списках отображения. Исправление #3498 (спасибо @Huararanga)divisions
и всегда возвращал 1, что приводило к его неисправности при использовании как части Path. Теперь он по умолчанию возвращает 1, если не указано иное (спасибо _ok)setDisplaySize
(спасибо Babsobar)setDisplaySize
(спасибо Babsobar)null
, теперь он возвращает первый доступный Canvas. Исправление #3520 (спасибо @mchiasson)data
он не передавался, если Сцена ещё не была доступна (то есть, игра ещё не завершила загрузку). Теперь данные передаются в методы init
и create
Сцены и сохраняются в свойстве data
настроек Сцены. Исправление #3363 (спасибо @pixelhijack)Tween.play
для твинга, который был приостановлен из-за его конфигурационного объекта, а не из-за вызова метода pause
. Исправление #3452 (спасибо @jazen)destroy
для твингов вместо stop
. Исправление (спасибо @Antriel)setOffset
для статического тела Arcade Physics приводил к ошибке из-за отсутствия метода. Метод добавлен и теперь работает как ожидается. Исправление #3465 (спасибо @josephjaniga и @DouglasLapsley)setInteractive
вызывается для объекта игры, который не может установить область столкновения, он больше не пытается назначить dropZone
неопределённому свойству input
.setOrigin
, если объект игры не имеет компонента origin (что не всегда так, например, для Graphics и Container)destroy
, что приводило к ошибке при попытке уничтожить родительский объект игры.Исправление #3516 (спасибо @RollinSafary)### Обновленияeval
. Теперь эти функции определены через генераторы. Исправление #3441 (спасибо @jamierocks @Colbydude @jdotrjs)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ı.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.Fixed
ve Smoothed
eksporları, FixedKeyControl
ve SmoothedKeyControl
olarak yeniden adlandırıldı, bu, sınıf isimlerine uygun hale getirmek için. Исправление #3463 (спасибо @seivan)setSize
и setDisplaySize
. Этот компонент используется для объектов игры, размер которых не основан на текстуре.key
, который позволяет просматривать верхнеуровневое свойство любого объекта в данном отсортированном массиве и получать ближайшее совпадение.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.extend
объекта конфигурации сцены теперь блокируется перезапись свойства sys
сцены.extend
объекта конфигурации сцены, если вы определяете свойство data
, содержащее объект, оно заполняет менеджер данных сцены этими значениями.isProcessing
, который теперь является булевым значением, а не целым числом. Он также стал публичным и только для чтения.a
, b
, c
, d
, tx
и ty
. Также имеются следующие новые геттеры: scaleX
, scaleY
и rotation
.List.getFirst
, который предлагает ту же функциональность.List.add
, который предлагает ту же функциональность.removeAllListeners
для любых локальных событий.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
Особая благодарность @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).wrap
, wrapArray
и wrapObject
, которые позволяют обернуть тела физики вокруг границ мира (спасибо @samme).makeActive
, который делегирует управление менеджеру Tween (спасибо @allanbreyes).callback
, который вызывается при завершении эффекта (спасибо @pixelscripter).callback
, который вызывается при завершении эффекта (спасибо @pixelscripter).callback
, который вызывается при завершении эффекта (спасибо @pixelscripter).fadeIn — это новый метод, который будет плавно вводить камеру из заданного цвета (черный по умолчанию) и затем, при необходимости, вызывать обратный вызов. Это то же самое, что использование Camera.flash, но с более понятным названием метода. Исправление #3412 (спасибо @Jerenaux)
destroy
от любого объекта игры, добавленного к ним, и если событие получено, автоматически удалить этот объект игры из группы. Исправление #3418 (спасибо @hadikcz)this.matter.add.gameObject
, который внедряет тело Matter JS в любой объект игры, такой как объект Text или TileSprite.DataManager.merge
, где он копировал ссылку на объект вместо его значения (спасибо @rexrainbow)shutdown
и destroy
обратные вызовы в createSceneFromObject, так как эти обратные вызовы не вызываются автоматически и должны быть вызваны через события сцены (спасибо @samme)makeActive
(спасибо @allanbreyes)antialias
в undefined
, если он не был установлен в конфигурации игры. Исправление #3386 (спасибо @samme)undefined
, что препятствовало регистрации новой сцены с тем же ключом. Теперь она правильно удаляется из хеша (спасибо @macbury)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)
Game.resize
позволяет изменять размер конфигурации игры, рендерера и системы ввода одним вызовом.Game.resize
вызываются методы resize
всех систем сцен. Это, в свою очередь, вызывает событие resize
, на которое ваша сцена может откликнуться. Событие будет отправлено новую ширину и высоту холста как только два параметра.InputManager.resize
позволяет обновлять bounds def и input scale одним вызовом.Config.roundPixels
для предотвращения подпиксельной интерполяции при рендеринге объектов игры в WebGL и Canvas.Load.plugin
теперь принимает класс как аргумент, а также URL-строку (спасибо @nkholski).Tween.complete
позволяет помечать твин как завершённый, независимо от того, на каком этапе он находится. Если определён обработчик завершения, он будет вызван. Вы можете задать задержку перед этим (спасибо @Jerenaux за идею).HEADLESS
как renderType
в конфигурации игры, и она будет выполнять специальный шаг игры, пропускающий рендеринг.Она всё ещё создаёт элемент Canvas, так как многие внутренние системы (например, ввод) на него опираются, но она не рисует ничего на нём. Исправление #3256 (спасибо @rgk)dropZone
, который позволяет задать объект как зону для перетаскивания прямо из метода.remove
, который позволяет удалять и уничтожать сцены.allowRotation
к родительскому Game Object._queue.length
вместо кэшированной длины (спасибо @srobertson421)ScenePlugin.launch
аргумент data
теперь передается в очередные сцены (спасибо @gaudeon)y
, если значение, которое было задано, никогда не превышало нижней границы Rectangle. Fix #3290 (спасибо @chancezeus)topOnly
в Input Manager сломала способ работы зон сброса, так как они теперь фильтровались из списка отображения до обработки. Зоны сброса теперь обрабатываются отдельно в Input Plugin, что позволяет иметь topOnly
установленным и всё ещё сбрасывать элемент в зону сброса. Это косвенно исправило #3291 (спасибо @rexrainbow)_drag
.* При масштабировании Game Object его Arcade Physics тело всё ещё вычисляло его позицию на основе его исходного размера, а не масштабированного (спасибо @pixelpicosean).sign
класса RandomDataGenerator имело коллизию методов. Fix #3323 (спасибо @vinerz и @samme)collideGroupVsSelf
), теперь он корректно вызывает collideGroupVsGroup
. Fix #3322 (спасибо @patrickgalbraith)setSizeToFrame()
и updateDisplayOrigin()
на родительском объекте игры, чтобы захватить ситуации, когда вы начинаете воспроизводить анимацию на объекте игры, который использует другой размер по сравнению с предыдущим установленным кадром.transparent
в конфигурации игры, но не предоставляете backgroundColor
, то он будет отображаться как черный. Теперь он будет правильно прозрачным. Если вы предоставляете цвет, он должен включать компонент альфа.keyB
расширяет это.init
.keydown
, если вы продолжаете удерживать клавишу. Исправление #3239 (спасибо @squaresun)Tween.updateTweenData
теперь проверяет, существует ли объект-цель перед обновлением его свойств.FORWARD_SLASH
содержал опечатку и был изменен на FORWARD_SLASH
. Исправление #3271 (спасибо @josedarioxyz)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).BitmapText
игнорировали вызов setOrigin
. Исправляет #3249 (спасибо @amkazan).WebGL: INVALID_ENUM: blendEquation: invalid mode.
возникающая на iOS. Исправляет #3244 (спасибо @Ziao).drawBlitter
могла упасть, если roundPixels
была истинной. Исправляет #3243 (спасибо @Jerenaux и @vulcanoidlogic).Объект игры 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)
name
и соответствующий метод setName
.Vector2.ZERO
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )