選項
首頁首頁 Skill 其他 v4-new-features

v4-new-features

phaserjs/phaser phaserjs/phaser

在學習 Phaser 4 中新增的功能、遊戲物件、元件及渲染能力時,請運用這項技巧。內容涵蓋濾鏡、RenderNodes、CaptureFrame、漸層、噪點、SpriteGPULayer、TilemapGPULayer、照明元件、RenderSteps 以及新的色調模式。 觸發條件:v4 新增功能、Phaser 4 功能、RenderNode、SpriteGPULayer、CaptureFrame、Gradient 遊戲物件、Noise 遊戲物件、新的色調模式。若要將 v3 程式碼遷移至 v4,請參閱「v3 至 v4 遷移」技能。

...展開全部
63
更新時間 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 和遮罩系統。每個濾鏡皆會接收一張輸入影像,並透過著色器處理階段產生一張輸出影像。濾鏡可套用至任何遊戲物件或相機——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 方法(濾鏡遮罩):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);

內部與外部的差異:內部濾鏡在相機變換之前執行(物件本位空間,效率較高);外部濾鏡則在變換之後執行(螢幕空間,全解析度)。


渲染節點(取代管線)

在 v3 中,管線(Pipeline)是一種常需處理多項任務的渲染系統。在 v4 中,每個渲染節點(RenderNode)皆透過其run()方法處理單一渲染任務。部分節點還具備batch()方法,用於在繪製前累積狀態。

架構

RenderNodeManager(位於 WebGL 渲染器上)管理所有渲染節點。遊戲物件透過基於角色的映射來引用節點。

// 遊戲物件上的 RenderNode 角色:
// - 'Submitter':針對每個元素執行其他節點角色
// - 'Transformer':提供頂點座標
// - 'Texturer':處理貼圖// 遊戲物件具有預設與自訂的渲染節點映射:
gameObject.defaultRenderNodes  // 各角色的內建節點
gameObject.customRenderNodes   // 各角色的覆寫設定
gameObject.renderNodeData      // 以節點名稱作為鍵值對的資料

設定自訂渲染節點

// 覆寫特定渲染角色:
gameObject.setRenderNodeRole('Submitter','MyCustomSubmitter');// 將資料傳遞給渲染節點:
gameObject.setRenderNodeRole('Transformer','MyTransformer', {
    customProperty:42
});// 移除自訂節點(回退至預設值):
gameObject.setRenderNodeRole('Submitter',null);

內建的 RenderNode 類型

批次處理器(每筆繪製呼叫累積並繪製多個物件):

  • BatchHandlerQuad-- 標準四邊形批次處理(Image、Sprite、BitmapText 等)
  • BatchHandlerQuadSingle-- 單四邊形變體
  • BatchHandlerTileSprite-- TileSprite 批次處理
  • BatchHandlerTriFlat—— 平面三角形批次處理(Graphics、Shape)
  • BatchHandlerPointLight—— 點光源批次處理
  • BatchHandlerStrip-- 三角形條帶批次處理

提交器(依物件類型進行座標渲染):

  • SubmitterQuadSubmitterTileSubmitterTileSprite
  • SubmitterSpriteGPULayerSubmitterTilemapGPULayer

變換器(計算頂點位置):

  • TransformerImageTransformerStampTransformerTileTransformerTileSprite

貼圖器(管理貼圖綁定):

  • TexturerImageTexturerTileSprite

濾鏡(後處理——請參閱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)或使用幀緩衝區上下文(濾鏡、DynamicTexture、具備部分透明度的相機)
  • 若位於帶有濾鏡的容器內,僅會擷取該容器中的內容
  • 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,           // 動畫此參數以實現演化
   noiseIterations:4,
    noiseWarpAmount:0.5,   // 湍流
    noiseSeed:42,
    noiseNormalMap:false
},300,300,256,256);

各類噪波共有的屬性:

  • noiseOffset--[x, y]陣列,用於捲動圖案
  • noisePower-- 調整輸出強度(數值越高,越能抑制高值)
  • noiseNormalMap-- 輸出法線貼圖(用於光照整合)
  • noiseIterations-- 細節層級(適用於細胞型/單純形類型)

數學對應函式Phaser.Math.Hash()Phaser.Math.HashCell()Phaser.Math.HashSimplex()

來源src/gameobjects/noise/

SpriteGPULayer

透過將資料儲存於靜態 GPU 緩衝區,可在單次繪製呼叫中渲染極大量(多達數百萬個)的四邊形。速度最高可達單個 Sprite 的 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);

關鍵細節:

  • 僅支援單一紋理(不支援多圖集),每個圖層僅限一張圖像
  • 成員支援在建立時定義的類比動畫效果(淡入淡出、彈跳、波浪、色彩變換)
  • 更新緩衝區內容的開銷較大——請一次性填入資料,之後保持不變
  • 建議像素藝術使用二的冪次方尺寸的貼圖,以避免接縫
  • 透過將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 元件

在遊戲物件上提供defaultRenderNodescustomRenderNodes 以及renderNodeData映射。使用方法請參閱上方的「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 會自動偵測並使用該技能
儲存庫 phaserjs/phaser

相關技能

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