选项
首页首页 Skill 其他 v4-new-features

v4-new-features

phaserjs/phaser phaserjs/phaser

在学习 Phaser 4 中新增的功能、游戏对象、组件和渲染能力时,请运用此技巧。内容涵盖滤镜、渲染节点、帧捕获、渐变、噪点、SpriteGPULayer、TilemapGPULayer、照明组件、渲染步骤以及新的色调模式。 触发条件:v4 新增内容、Phaser 4 功能、RenderNode、SpriteGPULayer、CaptureFrame、Gradient 游戏对象、Noise 游戏对象、新的色调模式。若需将 v3 代码迁移至 v4,请参阅“v3 到 v4 迁移”技能。

...展开全部
62
更新时间 2026-08-04

Phaser 4 的新功能

Phaser 4 的新功能与特性: 滤镜(取代 FX/BitmapMask)、渲染节点(取代管道)、CaptureFrame、渐变、噪点游戏对象、SpriteGPULayer、TilemapGPULayer、照明组件、渲染步骤以及新的色调模式。

相关技能文档:../v3-to-v4-migration/SKILL.md、../filters-and-postfx/SKILL.md、../game-object-components/SKILL.md、../tilemaps/SKILL.md

正在从 v3 迁移?请参阅《v3 到 v4 迁移指南》,了解分步代码更改、已移除的 API 以及迁移检查清单。

概述:v4 中的变更

Phaser 4 对 WebGL 渲染引擎进行了全面重构。v3 渲染器允许每个子系统独立管理 WebGL 状态,这会导致冲突(例如某些特效破坏遮罩)。v4 通过 RenderNode 图集中化了 WebGL 状态管理,其中每个节点仅处理一个渲染任务。

关键移除项

主要新增功能

  • 新增 GameObjectCaptureFrameGradientNoiseNoiseCell2D/3D/4DNoiseSimplex2D/3DSpriteGPULayerStampTilemapGPULayer
  • 新增组件LightingRenderStepsRenderNodes
  • 新增色调模式MULTIPLYFILLADDSCREENOVERLAYHARD_LIGHT
  • 新增滤镜:Blend、Blocky、CombineColorMatrix、GradientMap、ImageLight、Key、Mask、NormalTools、PanoramaBlur、ParallelFilters、Quantize、Sampler、Threshold
  • GL 方向:v4 采用标准 GL 方向(纹理的 Y=0 位于底部)

滤镜系统(取代 FX 和 BitmapMask)

完整参考文档:filters-and-postfx.md

滤镜系统整合了 v3 版本的 FX 和 Mask 系统。每个滤镜都接收一张输入图像,并通过着色器处理生成输出图像。滤镜可应用于任何游戏对象或摄像机——而 v3 版本对支持 FX 的对象存在限制。

// v3 方法(FX):
sprite.preFX.addGlow(0xff00ff,4);
sprite.postFX.addBlur(0,2,2,1);// v4 方法(滤镜):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff,4,0,1);
sprite.filters.external.addBlur(0,2,2,1);// v3 方法(位图蒙版):
constmask =new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// v4 方法(FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);

内部与外部:内部滤镜在摄像机变换之前运行(对象局部空间,开销更低)。外部滤镜在摄像机变换之后运行(屏幕空间,全分辨率)。


渲染节点(取代管道)

在 v3 中,管道(Pipeline)是一种通常处理多项任务的渲染系统。在 v4 中,每个渲染节点(RenderNode)通过其run()方法处理单一渲染任务。某些节点还提供batch()方法,用于在绘制前累积状态。

架构

RenderNodeManager(位于 WebGL 渲染器上)管理所有渲染节点。游戏对象通过基于角色的映射来引用节点。

// 游戏对象上的渲染节点角色:
// - 'Submitter':为每个元素运行其他节点角色
// - 'Transformer':提供顶点坐标
// - 'Texturer':处理纹理// 游戏对象具有默认和自定义的渲染节点映射:
gameObject.defaultRenderNodes  // 按角色划分的内置节点
gameObject.customRenderNodes   // 按角色划分的覆盖项
gameObject.renderNodeData      // 以节点名称为键的数据

设置自定义渲染节点

// 覆盖特定的渲染角色:
gameObject.setRenderNodeRole('Submitter','MyCustomSubmitter');// 向渲染节点传递数据:
gameObject.setRenderNodeRole('Transformer','MyTransformer', {
    customProperty:42
});// 移除自定义节点(恢复为默认值):
gameObject.setRenderNodeRole('Submitter',null);

内置渲染节点类型

批处理处理程序(每次绘制调用中累积并绘制多个对象):

  • BatchHandlerQuad-- 标准四边形批处理(Image、Sprite、BitmapText 等)
  • BatchHandlerQuadSingle-- 单四边形变体
  • BatchHandlerTileSprite-- TileSprite 批处理
  • BatchHandlerTriFlat—— 平面三角形批处理(Graphics、Shape)
  • BatchHandlerPointLight—— 点光源批处理
  • BatchHandlerStrip-- 三角带批处理

提交器(按对象类型协调渲染):

  • SubmitterQuadSubmitterTileSubmitterTileSprite
  • SubmitterSpriteGPULayerSubmitterTilemapGPULayer

变换器(计算顶点位置):

  • TransformerImageTransformerStampTransformerTileTransformerTileSprite

纹理器(管理纹理绑定):

  • 纹理器图像纹理器贴图精灵

滤镜(后处理——参见filters-and-postfx.md):

  • BaseFilterBaseFilterShader
  • FilterBarrelFilterBlendFilterBlockyFilterBlur(低/中/高三种变体)
  • FilterBokehFilterColorMatrixFilterCombineColorMatrix
  • FilterDisplacementFilterGlowFilterGradientMapFilterImageLight
  • FilterKeyFilterMaskFilterNormalToolsFilterPanoramaBlur
  • FilterParallelFiltersFilterPixelateFilterQuantize
  • FilterSamplerFilterShadowFilterThresholdFilterVignetteFilterWipe

其他

  • CameraFillCameraFillRectFillPathFillTri
  • DrawLineStrokePathShaderQuad
  • 列表合成器重新绑定上下文释放上下文
  • 动态纹理处理器

继承自:自定义渲染节点

// 注册自定义节点构造函数:
renderer.renderNodes.addNodeConstructor('MyNode',MyNodeClass);// 或添加预构建的节点实例:
renderer.renderNodes.addNode('MyNode', myNodeInstance);

新游戏对象

CaptureFrame

将当前帧缓冲区的内容捕获到纹理中,位置位于其在显示列表中的当前位置。本身不会进行任何渲染。仅限 WebGL。

// 显示列表中位于此处上方的一切内容都会被捕获:
constimage1 =this.add.image(400,300,'background');// 在摄像机上启用帧缓冲区功能:
this.cameras.main.setForceComposite(true);// 创建捕获点:
constcapture =this.add.captureFrame('myCapturedTexture');// 在另一个对象上使用捕获的纹理:
constoverlay =this.add.image(400,300,'myCapturedTexture');
// 为叠加层添加滤镜以扭曲捕获的场景

关键细节:

  • 需要camera.setForceComposite(true)或帧缓冲区上下文(滤镜、动态纹理、具有部分透明度的摄像机)
  • 在带有滤镜的容器内,仅捕获该容器中的内容
  • visible设置为 false将停止捕获
  • 组件:BlendMode、Depth、RenderNodes、Visible

来源src/gameobjects/captureframe/CaptureFrame.js

渐变

显示由 GPU 渲染的颜色渐变。继承自Shader。支持线性、径向及其他形状模式,并可通过包含ColorBand对象的可配置ColorRamp进行设置。

// 简单的线性渐变:
constgrad =this.add.gradient(undefined,100,100,200,200);// 包含多个颜色带的复杂径向渐变:
consthalo =this.add.gradient({
   bands: [
        {start:0.5,end:0.6,colorStart: [0.5,0.5,1,0],colorEnd:0xffffff,colorSpace:1,interpolation:4},
        {start:0.6,end:1,colorStart:0xffffff,colorEnd: [1,0.5,0.5,0],colorSpace:1,interpolation:3}
    ],
    dither:true,
    repeatMode:1,
    shapeMode:2,       // 径向
    start: {x:0.5,y:0.5},
    shape: {x:0.5,y:0.0}
},400,300,800,800);// 动画效果:
halo.offset=0.1* (1+Math.sin(time /1000));

关键细节:

  • 配置:GradientQuadConfig,包含色带shapeModerepeatModestartshapedither
  • 颜色通过ColorRamp配合ColorBand对象定义(支持 HSV 及多种插值模式)
  • 在运行时修改渐变数据后调用gradient.ramp.encode()

来源src/gameobjects/gradient/Gradient.js

噪声游戏对象

所有噪声类型均继承自Shader,且仅支持 WebGL。提供六种变体:

// 基本白噪声:
constnoise =this.add.noise({
    noiseOffset: [0,0],
    noisePower:1
},100,100,256,256);// 可自定义的细胞噪声:
constcells =this.add.noiseCell2D({
    noiseOffset: [0,0],
   noiseIterations:3,
    noiseNormalMap:true    // 作为法线贴图输出以实现光照效果
},200,200,256,256);// 用于自然效果的单纯形噪声:
constsimplex =this.add.noiseSimplex2D({
    noiseFlow:0,           // 通过动画控制其演变
   噪声迭代次数:4,
    噪声扭曲量:0.5,   // 湍流
    噪声种子:42,
    噪声法线贴图:false
},300,300,256,256);

各类噪声共有的属性:

  • noiseOffset--[x, y]数组,用于平移图案
  • 噪声幂次-- 调整输出强度(数值越大,对高值的抑制效果越强)
  • noiseNormalMap-- 输出法线贴图(用于光照整合)
  • noiseIterations-- 细节级别(适用于细胞型/单纯形类型)

数学等效函数Phaser.Math.Hash()Phaser.Math.HashCell()Phaser.Math.HashSimplex()

来源src/gameobjects/noise/

SpriteGPULayer

通过将数据存储在静态 GPU 缓冲区中,可在单次渲染调用中渲染数量极大的四边形(多达数百万个)。速度比单独渲染精灵快达 100 倍。仅限 WebGL。

constlayer =this.add.spriteGPULayer(texture, size);// size = 成员的最大数量// 添加成员(请一次性完成,而非分批添加):
constmember = {x:100,y:200,frame:'tree',scaleX:1,scaleY:1,alpha:1};
layer.addMember(member);// 当条目数量达数百万时,为提高效率请复用成员对象:
member.x=300;
member.y=400;
member.frame='bush';
layer.addMember(member);// 在图层上启用光照:
layer.setLighting(true);

关键细节:

  • 仅支持单一纹理(不支持多图集),每个图层仅限一张图像
  • 成员支持在创建时定义的类似补间动画的效果(淡入淡出、弹跳、波浪、颜色偏移)
  • 更新缓冲区内容开销较大——请一次性填充后保持不变
  • 建议像素艺术使用2的幂大小的纹理,以避免接缝
  • 通过将scaleX/scaleY/alpha设置为 0 来“移除”成员(避免缓冲区重建)
  • 组件:Alpha、BlendMode、Depth、ElapseTimer、Lighting、Mask、RenderNodes、TextureCrop、Visible

来源src/gameobjects/spritegpulayer/SpriteGPULayer.js


新组件

完整组件参考:game-object-components.md

Lighting 组件

取代了 v3 中通过分配光照管道的方式。仅限 WebGL。

// v3 方法:
sprite.setPipeline('Light2D');// v4 方法:
sprite.setLighting(true);// 自阴影(通过纹理亮度模拟表面阴影):
sprite.setSelfShadow(true,0.5,1/3);
// 参数:enabled、penumbra(数值越低,边缘越锐利)、diffuseFlatThreshold(0-1)// 使用全局默认值设置自阴影:
sprite.setSelfShadow(null);  // 从 config.render.selfShadow 读取

支持对象:BitmapText、Blitter、Graphics、Shape、Image、Sprite、Particles、SpriteGPULayer、Stamp、Text、TileSprite、Video、TilemapLayer、TilemapGPULayer。

批处理注意事项:光照会改变着色器,从而破坏批处理。为获得最佳性能,请将受光照影响的对象和不受光照影响的对象分别分组。

来源src/gameobjects/components/Lighting.js

RenderSteps 组件

允许将自定义逻辑注入游戏对象的渲染过程中。仅限 WebGL。滤镜系统内部使用 RenderSteps。

// 添加自定义渲染步骤:
gameObject.addRenderStep(function(renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
    // 此处为自定义渲染逻辑
    // 准备就绪后调用下一步:
   varnextFn = gameObject._renderSteps[renderStep +1];
    if(nextFn) {
        nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep +1, displayList, displayListIndex);
    }
});

关键细节:

  • 渲染步骤存储在_renderSteps数组中,通过renderWebGLStep()执行
  • 第一步首先执行,并负责调用后续步骤
  • 这就是滤镜如何延迟并控制renderWebGL流程的方式

来源src/gameobjects/components/RenderSteps.js

RenderNodes 组件

为游戏对象提供defaultRenderNodescustomRenderNodesrenderNodeData映射。用法请参见上文的“RenderNodes”部分。

来源src/gameobjects/components/RenderNodes.js


TilemapGPULayer

完整的瓦片地图参考文档:tilemaps.md

基于 GPU 的高性能瓦片地图渲染。通过专用着色器将整个图层渲染为单个四边形。仅限 WebGL。

// 通过 Tilemap 并启用 gpu 标志创建:
constmap =this.make.tilemap({key:'level1'});
consttileset = map.addTilesetImage('tiles','tilesImage');
constgpuLayer = map.createLayer('Ground', tileset,0,0,true);  // 最后一个参数:gpu = true

功能:

  • 单个贴图集,配单张纹理图像
  • 最多支持 4096x4096 个地砖,最多 2^23 个唯一地砖 ID
  • 支持瓦片翻转和动画
  • 仅支持正交瓦片地图(不支持等距/六边形)
  • LINEAR 模式下完美纹理过滤(无贴图接缝)
  • 计算成本按像素计算,而非按贴图计算——即使可见贴图数量众多,也不会造成性能损失

限制:

  • 无法使用多个贴图集
  • 编辑时需手动调用generateLayerDataTexture()进行更新
  • 仅支持正交投影

内部数据:瓦片数据存储在纹理中(每块瓦片 4 字节:2 个翻转位、1 个动画位、1 个未使用位、28 位瓦片索引)。动画数据存储在单独的纹理中。

来源src/tilemaps/TilemapGPULayer.js


有关详细的配置选项、API 参考表和源文件映射,请参阅参考指南

在 GitHub 上查看

Phaser 4 New Features

New features and capabilities in Phaser 4: Filters (replacing FX/BitmapMask), RenderNodes (replacing Pipelines), CaptureFrame, Gradient, Noise game objects, SpriteGPULayer, TilemapGPULayer, Lighting component, RenderSteps, and new tint modes.

Related skills: ../v3-to-v4-migration/SKILL.md, ../filters-and-postfx/SKILL.md, ../game-object-components/SKILL.md, ../tilemaps/SKILL.md

Migrating from v3? See the v3 to v4 Migration Guide for step-by-step code changes, removed APIs, and a migration checklist.

Overview: What Changed in v4

Phaser 4 is a complete overhaul of the WebGL rendering engine. The v3 renderer let each subsystem manage WebGL state independently, causing conflicts (e.g. certain FX breaking Masks). v4 centralizes WebGL state management through a RenderNode graph, where each node handles exactly one rendering task.

Key Removals

Key Additions

  • New GameObjects: CaptureFrame, Gradient, Noise, NoiseCell2D/3D/4D, NoiseSimplex2D/3D, SpriteGPULayer, Stamp, TilemapGPULayer
  • New Components: Lighting, RenderSteps, RenderNodes
  • New Tint Modes: MULTIPLY, FILL, ADD, SCREEN, OVERLAY, HARD_LIGHT
  • New Filters: Blend, Blocky, CombineColorMatrix, GradientMap, ImageLight, Key, Mask, NormalTools, PanoramaBlur, ParallelFilters, Quantize, Sampler, Threshold
  • GL Orientation: v4 uses standard GL orientation (Y=0 at bottom for textures)

Filters System (Replacing FX and BitmapMask)

Full reference: filters-and-postfx.md

Filters unify the v3 FX and Mask systems. Every filter takes an input image and produces an output image via a shader pass. Filters can be applied to any game object or camera -- v3 had restrictions on which objects supported FX.

// v3 approach (FX):
sprite.preFX.addGlow(0xff00ff, 4);
sprite.postFX.addBlur(0, 2, 2, 1);// v4 approach (Filters):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff, 4, 0, 1);
sprite.filters.external.addBlur(0, 2, 2, 1);// v3 approach (BitmapMask):
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// v4 approach (FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);

Internal vs External: Internal filters run before the camera transform (object-local space, cheaper). External filters run after (screen space, full-resolution).


RenderNodes (Replacing Pipelines)

In v3, a Pipeline was a rendering system that often handled multiple responsibilities. In v4, each RenderNode handles a single rendering task via its run() method. Some nodes also have a batch() method to accumulate state before drawing.

Architecture

The RenderNodeManager (on the WebGL renderer) owns all render nodes. Game objects reference nodes through role-based maps.

// RenderNode roles on a game object:
// - 'Submitter': runs other node roles for each element
// - 'Transformer': provides vertex coordinates
// - 'Texturer': handles textures// GameObjects have default and custom render node maps:
gameObject.defaultRenderNodes  // built-in nodes per role
gameObject.customRenderNodes   // overrides per role
gameObject.renderNodeData      // data keyed by node name

Setting Custom RenderNodes

// Override a specific render role:
gameObject.setRenderNodeRole('Submitter', 'MyCustomSubmitter');// Pass data to a render node:
gameObject.setRenderNodeRole('Transformer', 'MyTransformer', {
    customProperty: 42
});// Remove a custom node (falls back to default):
gameObject.setRenderNodeRole('Submitter', null);

Built-in RenderNode Types

Batch Handlers (accumulate and draw multiple objects per draw call):

  • BatchHandlerQuad -- standard quad batching (Image, Sprite, BitmapText, etc.)
  • BatchHandlerQuadSingle -- single-quad variant
  • BatchHandlerTileSprite -- TileSprite batching
  • BatchHandlerTriFlat -- flat triangle batching (Graphics, Shape)
  • BatchHandlerPointLight -- point light batching
  • BatchHandlerStrip -- triangle strip batching

Submitters (coordinate rendering per object type):

  • SubmitterQuad, SubmitterTile, SubmitterTileSprite
  • SubmitterSpriteGPULayer, SubmitterTilemapGPULayer

Transformers (compute vertex positions):

  • TransformerImage, TransformerStamp, TransformerTile, TransformerTileSprite

Texturers (manage texture binding):

  • TexturerImage, TexturerTileSprite

Filters (post-processing -- see filters-and-postfx.md):

  • BaseFilter, BaseFilterShader
  • FilterBarrel, FilterBlend, FilterBlocky, FilterBlur (Low/Med/High variants)
  • FilterBokeh, FilterColorMatrix, FilterCombineColorMatrix
  • FilterDisplacement, FilterGlow, FilterGradientMap, FilterImageLight
  • FilterKey, FilterMask, FilterNormalTools, FilterPanoramaBlur
  • FilterParallelFilters, FilterPixelate, FilterQuantize
  • FilterSampler, FilterShadow, FilterThreshold, FilterVignette, FilterWipe

Other:

  • Camera, FillCamera, FillRect, FillPath, FillTri
  • DrawLine, StrokePath, ShaderQuad
  • ListCompositor, RebindContext, YieldContext
  • DynamicTextureHandler

Extending: Custom RenderNodes

// Register a custom node constructor:
renderer.renderNodes.addNodeConstructor('MyNode', MyNodeClass);// Or add a pre-built node instance:
renderer.renderNodes.addNode('MyNode', myNodeInstance);

New Game Objects

CaptureFrame

Captures the current framebuffer contents to a texture at the point in the display list where it sits. Does not render anything itself. WebGL only.

// Everything above this in the display list gets captured:
const image1 = this.add.image(400, 300, 'background');// Enable framebuffer usage on the camera:
this.cameras.main.setForceComposite(true);// Create the capture point:
const capture = this.add.captureFrame('myCapturedTexture');// Use the captured texture on another object:
const overlay = this.add.image(400, 300, 'myCapturedTexture');
// Add filters to the overlay to distort the captured scene

Key details:

  • Requires camera.setForceComposite(true) or a framebuffer context (Filters, DynamicTexture, camera with partial alpha)
  • Inside a Container with filters, captures only that Container's contents
  • Setting visible = false stops capturing
  • Components: BlendMode, Depth, RenderNodes, Visible

Source: src/gameobjects/captureframe/CaptureFrame.js

Gradient

Displays GPU-rendered color gradients. Extends Shader. Supports linear, radial, and other shape modes with configurable ColorRamp containing ColorBand objects.

// Simple linear gradient:
const grad = this.add.gradient(undefined, 100, 100, 200, 200);// Complex radial gradient with multiple color bands:
const halo = this.add.gradient({
    bands: [
        { start: 0.5, end: 0.6, colorStart: [0.5, 0.5, 1, 0], colorEnd: 0xffffff, colorSpace: 1, interpolation: 4 },
        { start: 0.6, end: 1, colorStart: 0xffffff, colorEnd: [1, 0.5, 0.5, 0], colorSpace: 1, interpolation: 3 }
    ],
    dither: true,
    repeatMode: 1,
    shapeMode: 2,       // radial
    start: { x: 0.5, y: 0.5 },
    shape: { x: 0.5, y: 0.0 }
}, 400, 300, 800, 800);// Animate:
halo.offset = 0.1 * (1 + Math.sin(time / 1000));

Key details:

  • Config: GradientQuadConfig with bands, shapeMode, repeatMode, start, shape, dither
  • Colors defined via ColorRamp with ColorBand objects (supports HSV, various interpolation modes)
  • Call gradient.ramp.encode() after modifying ramp data at runtime

Source: src/gameobjects/gradient/Gradient.js

Noise Game Objects

All noise types extend Shader and are WebGL only. Six variants available:

// Basic white noise:
const noise = this.add.noise({
    noiseOffset: [0, 0],
    noisePower: 1
}, 100, 100, 256, 256);// Cellular noise with customization:
const cells = this.add.noiseCell2D({
    noiseOffset: [0, 0],
    noiseIterations: 3,
    noiseNormalMap: true    // output as normal map for lighting
}, 200, 200, 256, 256);// Simplex noise for natural effects:
const simplex = this.add.noiseSimplex2D({
    noiseFlow: 0,           // animate this for evolution
    noiseIterations: 4,
    noiseWarpAmount: 0.5,   // turbulence
    noiseSeed: 42,
    noiseNormalMap: false
}, 300, 300, 256, 256);

Common properties across noise types:

  • noiseOffset -- [x, y] array to scroll the pattern
  • noisePower -- sculpt output levels (higher suppresses high values)
  • noiseNormalMap -- output normal map (for lighting integration)
  • noiseIterations -- detail level (cellular/simplex types)

Math equivalents: Phaser.Math.Hash(), Phaser.Math.HashCell(), Phaser.Math.HashSimplex()

Source: src/gameobjects/noise/

SpriteGPULayer

Renders very large numbers of quads (up to millions) in a single draw call by storing data in a static GPU buffer. Up to 100x faster than individual sprites. WebGL only.

const layer = this.add.spriteGPULayer(texture, size); // size = max number of members// Add members (do this all at once, not incrementally):
const member = { x: 100, y: 200, frame: 'tree', scaleX: 1, scaleY: 1, alpha: 1 };
layer.addMember(member);// Reuse the member object for efficiency with millions of entries:
member.x = 300;
member.y = 400;
member.frame = 'bush';
layer.addMember(member);// Enable lighting on the layer:
layer.setLighting(true);

Key details:

  • Single texture only (no multi-atlas), single image per layer
  • Members support tween-like animations (fade, bounce, wave, color shift) defined at creation
  • Updating buffer contents is expensive -- populate once, leave unchanged
  • Power-of-two textures recommended for pixel art to avoid seaming
  • "Remove" members visually by setting scaleX/scaleY/alpha to 0 (avoids buffer rebuild)
  • Components: Alpha, BlendMode, Depth, ElapseTimer, Lighting, Mask, RenderNodes, TextureCrop, Visible

Source: src/gameobjects/spritegpulayer/SpriteGPULayer.js


New Components

Full component reference: game-object-components.md

Lighting Component

Replaces the v3 approach of assigning a lighting pipeline. WebGL only.

// v3 approach:
sprite.setPipeline('Light2D');// v4 approach:
sprite.setLighting(true);// Self-shadowing (simulates surface shadows from texture brightness):
sprite.setSelfShadow(true, 0.5, 1/3);
// Args: enabled, penumbra (lower = sharper), diffuseFlatThreshold (0-1)// Use game-wide default for self-shadow:
sprite.setSelfShadow(null);  // reads from config.render.selfShadow

Supported on: BitmapText, Blitter, Graphics, Shape, Image, Sprite, Particles, SpriteGPULayer, Stamp, Text, TileSprite, Video, TilemapLayer, TilemapGPULayer.

Batching note: Lighting changes the shader, which breaks batches. Group lit objects together and unlit objects together for best performance.

Source: src/gameobjects/components/Lighting.js

RenderSteps Component

Allows injecting custom logic into the render process of a game object. WebGL only. The Filters system uses RenderSteps internally.

// Add a custom render step:
gameObject.addRenderStep(function (renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
    // Custom rendering logic here
    // Call next step when ready:
    var nextFn = gameObject._renderSteps[renderStep + 1];
    if (nextFn) {
        nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep + 1, displayList, displayListIndex);
    }
});

Key details:

  • Steps are stored in _renderSteps array, executed via renderWebGLStep()
  • First step runs first and is responsible for calling subsequent steps
  • This is how Filters defer and control the renderWebGL flow

Source: src/gameobjects/components/RenderSteps.js

RenderNodes Component

Provides defaultRenderNodes, customRenderNodes, and renderNodeData maps on game objects. See the RenderNodes section above for usage.

Source: src/gameobjects/components/RenderNodes.js


TilemapGPULayer

Full tilemap reference: tilemaps.md

High-performance GPU-based tilemap rendering. Renders the entire layer as a single quad via a specialized shader. WebGL only.

// Create via Tilemap with the gpu flag:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const gpuLayer = map.createLayer('Ground', tileset, 0, 0, true);  // last arg: gpu = true

Capabilities:

  • Single tileset with single texture image
  • Maximum 4096x4096 tiles, up to 2^23 unique tile IDs
  • Tile flipping and animation supported
  • Orthographic tilemaps only (no isometric/hexagonal)
  • Perfect texture filtering in LINEAR mode (no tile seams)
  • Cost is per-pixel, not per-tile -- no performance loss with many visible tiles

Restrictions:

  • Cannot use multiple tilesets
  • Editing requires manual generateLayerDataTexture() call to update
  • Orthographic only

Internal data: Tile data stored in a texture (4 bytes/tile: 2 flip bits, 1 animation bit, 1 unused, 28-bit tile index). Animation data in a separate texture.

Source: src/tilemaps/TilemapGPULayer.js


For detailed configuration options, API reference tables, and source file maps, see the reference guide.

所有文件

0 个文件

安装 v4-new-features

下载技能文件并将其解压到 .claude/skills/ 目录中。

下载ZIP

克隆仓库并复制技能文件到您的项目中。

git clone https://github.com/phaserjs/phaser/tree/master/skills/v4-new-features # Copy the skill folder to .claude/skills/ or .codex/skills/

复制 复制
快速设置: 将技能文件夹复制到 .claude/skills/ 目录下,Claude 会自动检测并使用该技能

相关技能

multica-creating-agents
更新时间 2026-08-12
tilemaps
更新时间 2026-08-04
agent-github-pr-manager
更新时间 2026-08-03
pixijs-application
更新时间 2026-08-04
OR