Tutorial 5 — Menus, opções, pausa e idiomas
Um menu
Toda cena que herda de MenuScene é um menu: um $title e linhas em items().
protected function items(): array
{
return [
// [rótulo, valor à direita, ao apertar Enter, para esquerda / direita]
['PLAY', null, fn () => $this->scenes()->switchTo(PlayScene::class, ['level' => 1])],
['VOLUME', fn () => round($this->sound()->getSfxVolume() * 100) . '%', null,
fn (int $dir) => $this->sound()->setSfxVolume($this->sound()->getSfxVolume() + $dir / 10)],
['OPTIONS', null, fn () => $this->scenes()->push(OptionsScene::class)],
];
}
protected function back(): void
{
$this->scenes()->pop(); // Esc em um submenu
}
switchTo() substitui a tela (com um fade), push() abre uma por cima e pop() volta a ela.
A pausa
Uma pausa é um menu por cima do jogo: isOverlay() retorna true, e o jogo continua desenhado por baixo.
final class PauseScene extends MenuScene
{
protected string $title = 'PAUSE';
public function isOverlay(): bool
{
return true;
}
protected function items(): array
{
return [
['RESUME', null, fn () => $this->scenes()->pop()],
['TITLE SCREEN', null, fn () => $this->scenes()->switchTo(TitleScene::class)],
];
}
}
// no jogo:
if ($this->actions()->isPressed('pause')) {
$this->scenes()->push(PauseScene::class);
return;
}
Com pause_scene: App\Scene\PauseScene no game.yaml, a pausa também abre sozinha quando a aba
fica oculta ou a janela perde o foco.
Os idiomas
config/lang.yaml traduz os textos (os rótulos dos menus são traduzidos automaticamente):
pt:
PLAY: JOGAR
'{n} COINS': '{n} MOEDAS'
No código: Lang::t('{n} COINS', ['n' => $this->coins]); para trocar de idioma:
$this->engine->lang->setLang('pt').