v4-new-features
phaserjs/phaser
Utilisez cette compétence pour découvrir les nouvelles fonctionnalités, les objets de jeu, les composants et les capacités de rendu ajoutés dans Phaser 4. Elle couvre les filtres, les RenderNodes, CaptureFrame, Gradient, Noise, SpriteGPULayer, TilemapGPULayer, le composant Lighting, RenderSteps et les nouveaux modes de teinte. Thèmes abordés : nouveautés de la v4, fonctionnalités de Phaser 4, RenderNode, SpriteGPULayer, CaptureFrame, objet de jeu Gradient, objet de jeu Noise, nouveaux modes de teinte. Pour la migration du code de la v3 vers la v4, consultez plutôt la compétence « Migration de la v3 vers la v4 ».
...Développer toutNouvelles fonctionnalités de Phaser 4
Nouvelles fonctionnalités et capacités de Phaser 4 : Filtres (remplaçant FX/BitmapMask), RenderNodes (remplaçant les pipelines), objets de jeu CaptureFrame, Gradient et Noise, SpriteGPULayer, TilemapGPULayer, composant Lighting, RenderSteps et nouveaux modes de teinte.
Compétences associées :../v3-to-v4-migration/SKILL.md, ../filters-and-postfx/SKILL.md, ../game-object-components/SKILL.md, ../tilemaps/SKILL.md
Vous effectuez une migration depuis la v3 ? Consultez le Guide de migration de la v3 vers la v4 pour connaître les modifications de code étape par étape, les API supprimées et obtenir une liste de contrôle pour la migration.
Présentation : ce qui a changé dans la v4
Phaser 4 est une refonte complète du moteur de rendu WebGL. Le moteur de rendu v3 permettait à chaque sous-système de gérer l’état WebGL de manière indépendante, ce qui entraînait des conflits (par exemple, certains effets visuels perturbaient les masques). La v4 centralise la gestion de l’état WebGL via un graphe RenderNode, dans lequel chaque nœud gère exactement une tâche de rendu.
Principales suppressions
Principaux ajouts
- Nouveaux GameObjects:
CaptureFrame,Gradient,Noise,NoiseCell2D/3D/4D,NoiseSimplex2D/3D,SpriteGPULayer,Stamp,TilemapGPULayer - Nouveaux composants:
Lighting,RenderSteps,RenderNodes - Nouveaux modes de teinte:
MULTIPLY,FILL,ADD,SCREEN,OVERLAY,HARD_LIGHT - Nouveaux filtres: Blend, Blocky, CombineColorMatrix, GradientMap, ImageLight, Key, Mask, NormalTools, PanoramaBlur, ParallelFilters, Quantize, Sampler, Threshold
- Orientation GL: la v4 utilise l'orientation GL standard (Y=0 en bas pour les textures)
Système de filtres (remplaçant FX et BitmapMask)
Référence complète :
filters-and-postfx.md
Les filtres unifient les systèmes FX et Mask de la v3. Chaque filtre prend une image en entrée et produit une image en sortie via un passage de shader. Les filtres peuvent être appliqués à n’importe quel objet de jeu ou caméra — la v3 imposait des restrictions quant aux objets prenant en charge les effets FX.
// Approche v3 (FX) :
sprite.preFX.addGlow(0xff00ff, 4);
sprite.postFX.addBlur(0, 2, 2, 1);// Approche v4 (filtres) :
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff, 4, 0, 1);
sprite.filters.external.addBlur(0, 2, 2, 1);// Approche v3 (BitmapMask) :
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// Approche v4 (FilterMask) :
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);
Filtres internes vs externes: les filtres internes s’exécutent avant la transformation de la caméra (espace local à l’objet, moins coûteux). Les filtres externes s’exécutent après (espace écran, pleine résolution).
RenderNodes (remplacement des pipelines)
Dans la v3, un pipeline était un système de rendu qui assumait souvent plusieurs responsabilités. Dans la v4, chaque RenderNode gère une seule tâche de rendu via sa méthode run(). Certains nœuds disposent également d’une méthode batch() permettant d’accumuler l’état avant le dessin.
Architecture
Le RenderNodeManager (sur le moteur de rendu WebGL) gère tous les nœuds de rendu. Les objets de jeu font référence aux nœuds via des mappages basés sur les rôles.
// Rôles des RenderNodes sur un objet de jeu :
// - « Submitter » : exécute les autres rôles de nœuds pour chaque élément
// - « Transformer » : fournit les coordonnées des sommets
// - « Texturer » : gère les textures// Les GameObjects disposent de mappages de nœuds de rendu par défaut et personnalisés :
gameObject.defaultRenderNodes // nœuds intégrés par rôle
gameObject.customRenderNodes // remplacements par rôle
gameObject.renderNodeData // données indexées par nom de nœud
Configuration de nœuds de rendu personnalisés
// Remplacer un rôle de rendu spécifique :
gameObject.setRenderNodeRole('Submitter', 'MyCustomSubmitter');// Transmettre des données à un nœud de rendu :
gameObject.setRenderNodeRole('Transformer', 'MyTransformer', {
customProperty: 42
});// Supprimer un nœud personnalisé (retour à la valeur par défaut) :
gameObject.setRenderNodeRole('Submitter', null);
Types de nœuds de rendu intégrés
Gestionnaires de lots (accumulent et dessinent plusieurs objets par appel de dessin) :
BatchHandlerQuad-- regroupement standard de quadrilatères (Image, Sprite, BitmapText, etc.)BatchHandlerQuadSingle-- variante à quad uniqueBatchHandlerTileSprite-- traitement par lots de TileSpriteBatchHandlerTriFlat-- traitement par lots de triangles plats (Graphics, Shape)BatchHandlerPointLight-- traitement par lots des lumières ponctuellesBatchHandlerStrip-- traitement par lots de bandes de triangles
Soumetteurs (coordonnées de rendu par type d’objet) :
SubmitterQuad,SubmitterTile,SubmitterTileSpriteSubmitterSpriteGPULayer,SubmitterTilemapGPULayer
Transformateurs (calcul des positions des sommets) :
TransformerImage,TransformerStamp,TransformerTile,TransformerTileSprite
Texturiseurs (gestion de la liaison des textures) :
TexturerImage,TexturerTileSprite
Filtres (post-traitement — voir filters-and-postfx.md) :
BaseFilter,BaseFilterShaderFilterBarrel,FilterBlend,FilterBlocky,FilterBlur(variantes Faible/Moyenne/Élevée)FilterBokeh,FilterColorMatrix,FilterCombineColorMatrixFilterDisplacement,FilterGlow,FilterGradientMap,FilterImageLightFilterKey,FilterMask,FilterNormalTools,FilterPanoramaBlurFilterParallelFilters,FilterPixelate,FilterQuantizeFilterSampler,FilterShadow,FilterThreshold,FilterVignette,FilterWipe
Autres:
Camera,FillCamera,FillRect,FillPath,FillTriDrawLine,StrokePath,ShaderQuadListCompositor,RebindContext,YieldContextGestionnaire de textures dynamiques
Extension : nœuds de rendu personnalisés
// Enregistrer un constructeur de nœud personnalisé :
renderer.renderNodes.addNodeConstructor('MyNode', MyNodeClass);// Ou ajouter une instance de nœud pré-construite :
renderer.renderNodes.addNode('MyNode', myNodeInstance);
Nouveaux objets de jeu
CaptureFrame
Capture le contenu actuel du framebuffer dans une texture à l'emplacement où il se trouve dans la liste d'affichage. Ne rend rien en soi. WebGL uniquement.
// Tout ce qui se trouve au-dessus de cet élément dans la liste d'affichage est capturé :
const image1 = this.add.image(400, 300, 'background');// Active l'utilisation du tampon de trame sur la caméra :
this.cameras.main.setForceComposite(true);// Crée le point de capture :
const capture = this.add.captureFrame('myCapturedTexture');// Utiliser la texture capturée sur un autre objet :
const overlay = this.add.image(400, 300, 'myCapturedTexture');
// Ajouter des filtres à la superposition pour déformer la scène capturée
Détails importants :
- Nécessite
camera.setForceComposite(true)ou un contexte de framebuffer (filtres, DynamicTexture, caméra avec alpha partiel) - À l’intérieur d’un conteneur comportant des filtres, seule le contenu de ce conteneur est capturé
- Définir
visible = falsearrête la capture - Composants : BlendMode, Depth, RenderNodes, Visible
Source: src/gameobjects/captureframe/CaptureFrame.js
Dégradé
Affiche des dégradés de couleurs rendus par le GPU. Étend l’interface Shader. Prend en charge les modes linéaires, radiaux et d’autres formes grâce à un ColorRamp configurable contenant des objets ColorBand.
// Dégradé linéaire simple :
const grad = this.add.gradient(undefined, 100, 100, 200, 200);// Dégradé radial complexe avec plusieurs bandes de couleur :
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);// Animation :
halo.offset = 0,1 * (1 + Math.sin(time / 1000));
Détails clés :
- Configuration :
GradientQuadConfigavecbands,shapeMode,repeatMode,start,shape,dither - Couleurs définies via
ColorRampavec des objetsColorBand(prend en charge le mode HSV et divers modes d'interpolation) - Appeler
gradient.ramp.encode()après avoir modifié les données de la rampe à l'exécution
Source: src/gameobjects/gradient/Gradient.js
Objets de jeu « Noise »
Tous les types de bruit héritent de Shader et sont réservés à WebGL. Six variantes disponibles :
// Bruit blanc de base :
const noise = this.add.noise({
noiseOffset: [0, 0],
noisePower: 1
}, 100, 100, 256, 256);// Bruit cellulaire personnalisable :
const cells = this.add.noiseCell2D({
noiseOffset: [0, 0],
noiseIterations: 3,
noiseNormalMap: true // sortie sous forme de carte normale pour l'éclairage
}, 200, 200, 256, 256);// Bruit simplex pour des effets naturels :
const simplex = this.add.noiseSimplex2D({
noiseFlow: 0, // animer ce paramètre pour faire évoluer le bruit
noiseIterations: 4,
noiseWarpAmount: 0.5, // turbulence
noiseSeed: 42,
noiseNormalMap: false
}, 300, 300, 256, 256);
Propriétés communes à tous les types de bruit :
noiseOffset-- tableau[x, y]permettant de faire défiler le motifnoisePower-- permet de modeler les niveaux de sortie (une valeur plus élevée atténue les valeurs élevées)noiseNormalMap-- carte normale de sortie (pour l’intégration à l’éclairage)noiseIterations-- niveau de détail (types cellulaires/simplex)
Équivalents mathématiques: Phaser.Math.Hash(), Phaser.Math.HashCell(), Phaser.Math.HashSimplex()
Source: src/gameobjects/noise/
SpriteGPULayer
Permet de rendre un très grand nombre de quadrilatères (jusqu’à plusieurs millions) en un seul appel de dessin en stockant les données dans un tampon GPU statique. Jusqu’à 100 fois plus rapide que les sprites individuels. WebGL uniquement.
const layer = this.add.spriteGPULayer(texture, size); // size = nombre maximal d'éléments // Ajoute des éléments (effectuez cette opération en une seule fois, et non de manière incrémentielle) :
const member = { x: 100, y: 200, frame: 'tree', scaleX: 1, scaleY: 1, alpha: 1 };
layer.addMember(member);// Réutilisez l’objet membre pour plus d’efficacité avec des millions d’entrées :
member.x = 300;
member.y = 400;
member.frame = 'bush';
layer.addMember(member);// Activez l'éclairage sur le calque :
layer.setLighting(true);
Détails clés :
- Une seule texture (pas d’atlas multiple), une seule image par couche
- Les membres prennent en charge des animations de type « tween » (fondu, rebond, ondulation, changement de couleur) définies lors de la création
- La mise à jour du contenu du tampon est coûteuse — remplissez-le une seule fois, puis ne le modifiez plus
- Il est recommandé d’utiliser des textures de taille puissance de deux pour le pixel art afin d’éviter les raccords
- « Supprimez » visuellement des membres en définissant
scaleX/scaleY/alphasur 0 (ce qui évite la reconstruction du tampon) - Composants : Alpha, BlendMode, Depth, ElapseTimer, Lighting, Mask, RenderNodes, TextureCrop, Visible
Source: src/gameobjects/spritegpulayer/SpriteGPULayer.js
Nouveaux composants
Référence complète des composants :
game-object-components.md
Composant Lighting
Remplace l'approche de la v3 consistant à attribuer un pipeline d'éclairage. WebGL uniquement.
// Approche v3 :
sprite.setPipeline('Light2D');// Approche v4 :
sprite.setLighting(true);// Auto-ombrage (simule les ombres de surface à partir de la luminosité de la texture) :
sprite.setSelfShadow(true, 0.5,1/3);
// Arguments : enabled, penumbra (valeur plus faible = contour plus net), diffuseFlatThreshold (0-1)// Utilisation de la valeur par défaut à l'échelle du jeu pour les ombres propres :
sprite.setSelfShadow(null); // lit la valeur dans config.render.selfShadow
Pris en charge sur: BitmapText, Blitter, Graphics, Shape, Image, Sprite, Particles, SpriteGPULayer, Stamp, Text, TileSprite, Video, TilemapLayer, TilemapGPULayer.
Remarque concernant le regroupement: l’éclairage modifie le shader, ce qui rompt les lots. Regroupez les objets éclairés entre eux et les objets non éclairés entre eux pour optimiser les performances.
Source: src/gameobjects/components/Lighting.js
Composant RenderSteps
Permet d’injecter une logique personnalisée dans le processus de rendu d’un objet de jeu. WebGL uniquement. Le système de filtres utilise RenderSteps en interne.
// Ajouter une étape de rendu personnalisée :
gameObject.addRenderStep(function (renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
// Logique de rendu personnalisée ici
// Appeler l'étape suivante lorsque prêt :
var nextFn = gameObject._renderSteps[renderStep + 1];
if (nextFn) {
nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep + 1, displayList, displayListIndex);
}
});
Points clés :
- Les étapes sont stockées dans le tableau
_renderStepset exécutées viarenderWebGLStep() - La première étape s’exécute en premier et est chargée d’appeler les étapes suivantes
- C'est ainsi que les filtres différèrent et contrôlent le flux
renderWebGL
Source: src/gameobjects/components/RenderSteps.js
Composant RenderNodes
Fournit les cartes `defaultRenderNodes`, `customRenderNodes` et `renderNodeData ` sur les objets de jeu. Reportez-vous à la section « RenderNodes » ci-dessus pour connaître leur utilisation.
Source: src/gameobjects/components/RenderNodes.js
TilemapGPULayer
Référence complète sur les tilemaps :
tilemaps.md
Rendu de tilemap haute performance basé sur le GPU. Rendu de la couche entière sous la forme d’un seul quad via un shader spécialisé. WebGL uniquement.
// Création via Tilemap avec l'indicateur gpu :
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const gpuLayer = map.createLayer('Ground', tileset, 0, 0, true); // dernier argument : gpu = true
Fonctionnalités :
- Un seul ensemble de tuiles avec une seule image de texture
- 4 096 x 4 096 tuiles maximum, jusqu’à 2^23 identifiants de tuiles uniques
- Prise en charge du retournement de tuiles et des animations
- Cartes de tuiles orthographiques uniquement (pas d’isométriques ni d’hexagonales)
- Filtrage parfait des textures en mode LINÉAIRE (pas de joints entre les tuiles)
- Le coût est calculé par pixel, et non par tuile — aucune perte de performances même avec un grand nombre de tuiles visibles
Restrictions :
- Impossible d’utiliser plusieurs jeux de tuiles
- L'édition nécessite un appel manuel à la fonction
generateLayerDataTexture()pour la mise à jour - Mode orthographique uniquement
Données internes: les données de tuiles sont stockées dans une texture (4 octets par tuile : 2 bits de retournement, 1 bit d’animation, 1 bit inutilisé, index de tuile sur 28 bits). Les données d’animation sont stockées dans une texture distincte.
Source: src/tilemaps/TilemapGPULayer.js
Pour les options de configuration détaillées, les tableaux de référence de l'API et les correspondances des fichiers source, consultez le guide de référence.
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 variantBatchHandlerTileSprite-- TileSprite batchingBatchHandlerTriFlat-- flat triangle batching (Graphics, Shape)BatchHandlerPointLight-- point light batchingBatchHandlerStrip-- triangle strip batching
Submitters (coordinate rendering per object type):
SubmitterQuad,SubmitterTile,SubmitterTileSpriteSubmitterSpriteGPULayer,SubmitterTilemapGPULayer
Transformers (compute vertex positions):
TransformerImage,TransformerStamp,TransformerTile,TransformerTileSprite
Texturers (manage texture binding):
TexturerImage,TexturerTileSprite
Filters (post-processing -- see filters-and-postfx.md):
BaseFilter,BaseFilterShaderFilterBarrel,FilterBlend,FilterBlocky,FilterBlur(Low/Med/High variants)FilterBokeh,FilterColorMatrix,FilterCombineColorMatrixFilterDisplacement,FilterGlow,FilterGradientMap,FilterImageLightFilterKey,FilterMask,FilterNormalTools,FilterPanoramaBlurFilterParallelFilters,FilterPixelate,FilterQuantizeFilterSampler,FilterShadow,FilterThreshold,FilterVignette,FilterWipe
Other:
Camera,FillCamera,FillRect,FillPath,FillTriDrawLine,StrokePath,ShaderQuadListCompositor,RebindContext,YieldContextDynamicTextureHandler
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 = falsestops 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:
GradientQuadConfigwithbands,shapeMode,repeatMode,start,shape,dither - Colors defined via
ColorRampwithColorBandobjects (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 patternnoisePower-- 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/alphato 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
_renderStepsarray, executed viarenderWebGLStep() - First step runs first and is responsible for calling subsequent steps
- This is how Filters defer and control the
renderWebGLflow
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.
Tous les fichiers
0 fichiersInstaller v4-new-features
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/phaserjs/phaser/tree/master/skills/v4-new-features # Copy the skill folder to .claude/skills/ or .codex/skills/
Copier





Maison
