Grupos locais, controles físicos e controles de celular no PlayDrop
Leia controles físicos e de celular do PlayDrop com sdk.device, acompanhe as posições dos jogadores locais e declare suporte a controles e tamanhos de grupo.
Um grupo local é formado por várias pessoas jogando em uma só tela, cada uma com um controle: um controle físico ou um celular que o PlayDrop transforma em controle quando alguém escaneia um código. Seu jogo lê todos os controles do mesmo jeito pelo SDK, no site e nos apps.
Declare os controles e os tamanhos de grupo
{
"types": ["solo", "party"],
"party": { "local": [1, 2, 3, 4] },
"controller": { "support": "optional", "type": "simpler" }
}controller.supportéoff,optionalourequired. Declare-o em todo jogo, inclusive comoff.controller.typeindica os controles mínimos de que o jogo precisa:any(direções, Confirmar e Cancelar),simpler(um analógico, quatro botões frontais e Menu; os controles de celular se enquadram) oustandard(direcional, dois analógicos clicáveis, quatro botões frontais, dois botões de ombro, dois gatilhos e Menu).party.locallista os números exatos de jogadores em uma só tela; um1exige o tiposolo. Com o suporte a controles ativado, todo número listado precisa ser jogável com controles.
Leia os controles
await sdk.device.enableControllerInput().catch(() => { /* keep keyboard and touch */ });
const stop = sdk.device.onButton(({ playerIndex, button, pressed }) => {
if (button === "south" && pressed) jump(playerIndex);
});
function update() {
for (const slot of sdk.device.localPlayers) {
const pad = sdk.device.gamepad(slot.playerIndex);
if (pad?.connected) move(slot.playerIndex, pad.axes[0], pad.axes[1]);
}
requestAnimationFrame(update);
}
update();- Chame
enableControllerInput()uma vez depois deinit(). A chamada é rejeitada comcontroller_input_unavailableoucontroller_input_timeoutquando o host não consegue fornecer a entrada; o jogo continua rodando. gamepad(playerIndex)retorna um snapshot no layout padrão do navegador:axes(x/y esquerdo e x/y direito, de -1 a 1), dezessetebuttons,source(physicalouvirtual) eid. OplayerIndex0 é o jogador 1.- Os botões têm nomes por posição, como
southeeast.pad.label("south")informa o nome do botão a mostrar: "A", "Cross" ou "B", conforme o controle.pad.has("dpad")diz se o controle tem determinado comando. - Menu e Home pertencem ao PlayDrop e sempre aparecem como não pressionados.
- Nunca chame
navigator.getGamepads(): os controles de celular só chegam aos jogos pelo SDK, e o PlayDrop registra um aviso.
Posições dos jogadores locais
sdk.device.localPlayers lista as posições que os jogadores escolheram, { playerIndex, gamepadKey }, e onLocalPlayersChange(callback) informa as mudanças. Um controle desconectado mantém sua posição. Quando a lista de jogadores mudar ou ficar vazia, volte para um menu adequado em vez de travar. Um controle sozinho é uma entrada comum, não um grupo.
A partir de um botão, sdk.social.openParty({ mode: "local" }) abre a janela de pareamento do PlayDrop, com o QR code para os celulares e os controles físicos conectados. Ofereça só os modos que você declarou.
Local ou online, nunca os dois
O host inicia um jogo como grupo local ou como grupo online, nunca os dois: jogadores locais não podem entrar em salas online. Para jogar online com amigos, veja grupos online e voz.
Pense no sofá
Mostre a cor de cada jogador e o nome dos botões do controle dele, deixe qualquer pessoa entrar apertando um botão e mantenha o HUD legível do sofá. Mantenha os controles por toque e por teclado para o modo solo.