Customizable On-screen Joystick

Playroom includes a customizable on-screen joystick controller that can be used by players as input. It also supports additional buttons that can be used for actions such as jumping, shooting, etc. Joystick can also be controlled by W,A,S and D keys of the keybord.

Here is a usage example, check out the API Docs for more details:

 
import { insertCoin, myPlayer, onPlayerJoin, Joystick } from 'playroomkit';
 
// Start the game
await insertCoin();
 
let players = [];
// Create a joystick controller for each joining player
onPlayerJoin((state)=>{
  // Joystick will only create UI for current player (myPlayer)
  // For others, it will only sync their state
  const joystick = new Joystick(state, {
    type: "dpad",
    buttons: [
      {id: "jump", label: "Jump"}
    ],
    keyboard: false // Disable W,A,S and D keys which controls joystick
  });
  players.push({state, joystick});
})
 
// In your game loop
players.forEach(({state, joystick})=>{
  // Update player position based on joystick state
  const dpad = joystick.dpad();
  if (dpad.x === "left"){
    // move player left
  }
  else if (dpad.x === "right"){
    // move player right
  }
 
  // Check if jump button is pressed
  if (joystick.isPressed("jump")){
    // jump
  }
});
 

Here are a few examples of the joystick UI:

D-Pad

Angular with Buttons

Angular with Button and Zone

FAQs

I want angular value as 0-360 degrees

You can convert radians to degrees and then add 90 to get the value in degrees.

function radToDeg(rad){
  return rad * 180 / Math.PI + 90;
}
 
console.log(radToDeg(joystick.angle()));

I want to convert angular value to X, Y components that go between -1 and 1

You can use Math.cos and Math.sin to get the X and Y components.

function radToXY(rad){
  return {
    y: Math.cos(rad),
    x: Math.sin(rad)
  };
}
 
console.log(radToXY(joystick.angle()));