Using Three.js with Playroom Kit
three.js (opens in a new tab) is a general purpose 3D library for Javascript.
Playroom works great with three.js to make multiplayer 3D games. Below is a live preview of a simple flying plane game adapted from this code by Codrops (opens in a new tab).
Touch the screen to fly the plane.
Code
Below are the interesting bits from the full code (opens in a new tab) for the above example.
async function init(event){
// Init Playroom, let players create their profiles.
await insertCoin();
// Create the touch joystick.
createJoystick();
// Create the scene, lights, sea, sky, etc.
createScene();
createLights();
createSea();
createSky();
// Create the plane(s) when the player joins.
onPlayerJoin((state) => {
const plane = createPlane(state.getProfile().color.hex);
players.push({ state, plane });
// Remove the plane when the player leaves.
state.onQuit(() => {
scene.remove(plane.mesh);
players = players.filter((p) => p.state != state);
});
});
// Start the game loop.
loop();
}
function createJoystick() {
// Create a joystick, listen for events, and pass the events to the Playroom.
const joystick = nipplejs.create();
joystick.on("plain", (e, data) => {
myPlayer().setState("dir", data.direction);
});
joystick.on("end", () => {
myPlayer().setState("dir", undefined);
});
}
function loop(){
if (isHost()) {
// Host screen: Update the plane positions based on the joystick input.
for (const player of players) {
const controls = player.state.getState("dir") || {};
const curPos = player.state.getState("pos") || { x: 0, y: 0 };
if (controls.x == "left") {
curPos.x = Math.max(-0.4, curPos.x - 0.01);
} else if (controls.x == "right") {
curPos.x = Math.min(0.4, curPos.x + 0.01);
}
if (controls.y == "up") {
curPos.y = Math.min(1, curPos.y + 0.01);
} else if (controls.y == "down") {
curPos.y = Math.max(-1, curPos.y - 0.01);
}
player.state.setState("pos", curPos);
updatePlane(player.plane, curPos);
}
} else {
// Non-host screen: Update the plane positions based on the states from the host.
for (const player of players) {
const pos = player.state.getState("pos");
if (pos) {
updatePlane(player.plane, pos);
}
}
}
requestAnimationFrame(loop);
}