Build games as easily as you play them — join the Phaser Beam waitlist for Early Access.
class Example extends Phaser.Scene { constructor () { super(); } preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v385'); this.load.script('threejs', 'js/three145.js'); this.load.image('logo', 'assets/sprites/phaser3-logo-small.png'); this.load.image('bg', 'assets/skies/gradient3.png'); } create () { this.add.image(400, 300, 'bg'); this.init3D(); this.add.image(0, 0, 'logo').setOrigin(0, 0); } // This is all mostly ThreeJS code init3D () { const camera = new THREE.PerspectiveCamera(70, 800 / 600, 1, 10000); camera.position.z = 300; const scene = new THREE.Scene(); const texture1 = new THREE.TextureLoader().load('assets/normal-maps/brick.jpg'); const texture2 = new THREE.TextureLoader().load('assets/textures/gold.png'); const texture3 = new THREE.TextureLoader().load('assets/textures/grass.png'); const material1 = new THREE.MeshBasicMaterial({ map: texture1 }); const material2 = new THREE.MeshBasicMaterial({ map: texture2 }); const material3 = new THREE.MeshBasicMaterial({ map: texture3 }); const geometry1 = new THREE.BoxGeometry(100, 100, 100); const mesh1 = new THREE.Mesh(geometry1, material1); const geometry2 = new THREE.SphereGeometry(64, 32, 16); const mesh2 = new THREE.Mesh(geometry2, material2); const geometry3 = new THREE.CylinderGeometry(35, 35, 80, 32); const mesh3 = new THREE.Mesh(geometry3, material3); mesh2.position.x = -200; mesh3.position.x = 200; scene.add(mesh1); scene.add(mesh2); scene.add(mesh3); // Tell three to use the Phaser canvas // Also: Notice we're using the WebGL1 Renderer here const renderer = new THREE.WebGL1Renderer({ canvas: this.sys.game.canvas, context: this.sys.game.context, antialias: true, }); // Create the Phaser Extern, tells Phaser to hand-off rendering to ThreeJS const view = this.add.extern(); renderer.setPixelRatio(1); renderer.setSize(800, 600); // You can skip this if threeJS is providing the _background_ // and all Phaser objects are on-top of it renderer.autoClear = false; // The Extern render function view.render = () => { // This is essential to get ThreeJS to reset the GL state renderer.resetState(); mesh1.rotation.x += 0.005; mesh1.rotation.y += 0.01; mesh2.rotation.x -= 0.005; mesh2.rotation.y += 0.02; mesh3.rotation.x += 0.03; mesh3.rotation.y += 0.02; renderer.render(scene, camera); // Call it again, after rendering, if you get graphical corruption // renderer.resetState(); }; } } const config = { type: Phaser.WEBGL, width: 800, height: 600, backgroundColor: '#000000', parent: 'phaser-example', scene: Example }; const game = new Phaser.Game(config);
class Example extends Phaser.Scene
{
constructor ()
{
super();
}
preload ()
{
this.load.setBaseURL('https://cdn.phaserfiles.com/v385');
this.load.script('threejs', 'js/three145.js');
this.load.image('logo', 'assets/sprites/phaser3-logo-small.png');
this.load.image('bg', 'assets/skies/gradient3.png');
}
create ()
{
this.add.image(400, 300, 'bg');
this.init3D();
this.add.image(0, 0, 'logo').setOrigin(0, 0);
}
// This is all mostly ThreeJS code
init3D ()
{
const camera = new THREE.PerspectiveCamera(70, 800 / 600, 1, 10000);
camera.position.z = 300;
const scene = new THREE.Scene();
const texture1 = new THREE.TextureLoader().load('assets/normal-maps/brick.jpg');
const texture2 = new THREE.TextureLoader().load('assets/textures/gold.png');
const texture3 = new THREE.TextureLoader().load('assets/textures/grass.png');
const material1 = new THREE.MeshBasicMaterial({ map: texture1 });
const material2 = new THREE.MeshBasicMaterial({ map: texture2 });
const material3 = new THREE.MeshBasicMaterial({ map: texture3 });
const geometry1 = new THREE.BoxGeometry(100, 100, 100);
const mesh1 = new THREE.Mesh(geometry1, material1);
const geometry2 = new THREE.SphereGeometry(64, 32, 16);
const mesh2 = new THREE.Mesh(geometry2, material2);
const geometry3 = new THREE.CylinderGeometry(35, 35, 80, 32);
const mesh3 = new THREE.Mesh(geometry3, material3);
mesh2.position.x = -200;
mesh3.position.x = 200;
scene.add(mesh1);
scene.add(mesh2);
scene.add(mesh3);
// Tell three to use the Phaser canvas
// Also: Notice we're using the WebGL1 Renderer here
const renderer = new THREE.WebGL1Renderer({
canvas: this.sys.game.canvas,
context: this.sys.game.context,
antialias: true,
});
// Create the Phaser Extern, tells Phaser to hand-off rendering to ThreeJS
const view = this.add.extern();
renderer.setPixelRatio(1);
renderer.setSize(800, 600);
// You can skip this if threeJS is providing the _background_
// and all Phaser objects are on-top of it
renderer.autoClear = false;
// The Extern render function
view.render = () => {
// This is essential to get ThreeJS to reset the GL state
renderer.resetState();
mesh1.rotation.x += 0.005;
mesh1.rotation.y += 0.01;
mesh2.rotation.x -= 0.005;
mesh2.rotation.y += 0.02;
mesh3.rotation.x += 0.03;
mesh3.rotation.y += 0.02;
renderer.render(scene, camera);
// Call it again, after rendering, if you get graphical corruption
// renderer.resetState();
};
}
}
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#000000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);