チュートリアル5 — メニュー、オプション、ポーズ、多言語対応
メニュー
MenuSceneを継承したシーンは、すべてメニューになります。$titleと、items()の各行を用意します。
protected function items(): array
{
return [
// [ラベル, 右側の値, Enterで実行, 左右キーで実行]
['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
}
switchTo()は画面を入れ替え(フェードつき)、push()は上に重ねて開き、pop()で元に戻ります。
ポーズ
ポーズは、ゲームの上に重ねるメニューです。isOverlay()がtrueを返し、ゲームはその下に描画されたままになります。
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)],
];
}
}
// ゲーム本編の中で:
if ($this->actions()->isPressed('pause')) {
$this->scenes()->push(PauseScene::class);
return;
}
game.yamlにpause_scene: App\Scene\PauseSceneを書いておくと、タブが非表示になったときや、ウィンドウがフォーカスを失ったときにも、ポーズが自動的に開きます。
言語
config/lang.yamlでテキストを翻訳します(メニューのラベルは自動的に翻訳されます)。
fr:
PLAY: JOUER
'{n} COINS': '{n} PIECES'
コードでは:Lang::t('{n} COINS', ['n' => $this->coins])。言語を切り替えるには:
$this->engine->lang->setLang('fr')。