DE

Tutorial 5 — Menüs, Optionen, Pause und Sprachen

Ein Menü

Jede Szene, die von MenuScene erbt, ist ein Menü: ein $title und Zeilen in items().

protected function items(): array
{
    return [
        // [Beschriftung, Wert rechts, bei Eingabe, bei links / rechts]
        ['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 in einem Untermenü
}

switchTo() ersetzt den Bildschirm (mit Überblendung), push() öffnet einen darüber, pop() kehrt zurück.

Die Pause

Eine Pause ist ein Menü über dem Spiel: isOverlay() gibt true zurück, und das Spiel bleibt darunter sichtbar.

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)],
        ];
    }
}

// im Spiel:
if ($this->actions()->isPressed('pause')) {
    $this->scenes()->push(PauseScene::class);
    return;
}

Mit pause_scene: App\Scene\PauseScene in game.yaml öffnet sich die Pause auch von selbst, wenn der Tab verborgen wird oder das Fenster den Fokus verliert.

Die Sprachen

config/lang.yaml übersetzt die Texte (die Beschriftungen der Menüs werden automatisch übersetzt):

fr:
  PLAY: JOUER
  '{n} COINS': '{n} PIECES'

Im Code: Lang::t('{n} COINS', ['n' => $this->coins]); die Sprache wechselst du mit $this->engine->lang->setLang('fr').