◀ Zur Spieleübersicht

Spiele einbinden

Alle Möglichkeiten, easygames auf einer Webseite, in einer App oder auf dem TV zu zeigen – mit Beispielen zum Kopieren.

Welche Variante passt?

VarianteWannAufwand
DirektlinkEin Link oder Knopf öffnet das Spiel als ganze Seite (Vollbild). Einfachste und robusteste Lösung, auch für Homepage-Menüs.1 Zeile
iframeEin Spiel soll mitten in einer Seite laufen.1 Zeile
easygames.jsSpiele per Attribut oder JavaScript-Variable einbauen, mit Vollbild-Knopf. Die Spieleliste kommt automatisch mit.2 Zeilen
BibliothekDie komplette Übersicht mit Suche, Anleitungen und Spielfenster in deine Seite einbetten.1 Zeile
AppSpiele in einer Android-, iOS- oder Hybrid-App, auch offline.je nach App
Faustregel: Wo Vollbild wichtig ist (Handy, TV, App), öffne das Spiel am besten direkt als eigene Seite (Direktlink). Das ist am zuverlässigsten.

Code-Generator

Spiel wählen, Optionen einstellen, Code kopieren.

Direktlink

iframe


    

easygames.js (Attribute)


    

easygames.js (JavaScript mit Variable)


    

2. Ein Spiel als iframe

<iframe src="zotik/" title="ZOTIK"
  allow="fullscreen; autoplay" allowfullscreen loading="lazy"
  style="width:100%;max-width:960px;aspect-ratio:16/10;border:0;border-radius:12px"></iframe>
Wichtig: Ohne allow="fullscreen" kann im iframe kein Vollbild gestartet werden. Ohne autoplay bleibt Ton oft stumm, bis jemand tippt.

3. easygames.js – per Attribut oder JavaScript

Einmal einbinden. Das Script lädt die Spieleliste selbst und findet seinen Pfad automatisch.

<script src="easygames.js"></script>

Variante A – nur HTML

<div data-easygames="zotik"></div>
<div data-easygames="anmacha-snake" data-ratio="4/3" data-max-width="720px"></div>
<div data-easygames="all"></div>   <!-- komplette Bibliothek -->

Variante B – JavaScript mit Variablen

<div id="ziel"></div>
<script>
  const spielId = 'zotik';   // beliebige Spiel-ID, z. B. aus einer Datenbank oder URL
  EasyGames.embed('#ziel', { game: spielId, ratio: '16/10', maxWidth: '960px' });
  // Bibliothek: EasyGames.library('#alle');
</script>

Optionen

AttributJS-OptionStandardWirkung
data-easygamesgame–Spiel-ID oder all
data-widthwidth100%Breite
data-max-widthmaxWidth960pxMaximale Breite
data-ratioratio16/10Seitenverhältnis
data-heightheight–Feste Höhe, ersetzt das Seitenverhältnis
data-radiusradius12pxEckenrundung
data-titletitleSpieltitelTitel für Screenreader
data-fullscreen="false"fullscreen:falseKnopf anVollbild-Knopf ausblenden
data-tv-link="false"tvLink:falseZeile anTV-Link unter Mehrspieler-Spielen ausblenden

Funktionen

AufrufErgebnis
EasyGames.embed(ziel, optionen)Setzt ein Spiel in das Ziel (Selektor oder Element).
EasyGames.library(ziel, optionen)Setzt die komplette Übersicht ein.
EasyGames.ready(callback)Ruft zurück, sobald die Spieleliste geladen ist.
EasyGames.list()Alle Spiele: id, title, desc, icon, url, card. Praktisch für eigene Menüs.
EasyGames.get(id) / url(id)Ein Spiel bzw. nur seine URL.
EasyGames.guide(id, cb)Anleitung und Bedienung als Objekt {anleitung, steuerung, tipps}.
EasyGames.fullscreen(iframe)Startet Vollbild; fällt auf einen neuen Tab zurück, wenn der Browser es nicht kann (z. B. iPhone).
EasyGames.tvUrl(id)Link für den TV (öffentliche Adresse, ggf. mit ?tv); null bei Einzelspielen, siehe TV-Link.
EasyGames.device()Geräteinfos (Typ, Rolle, Eingaben …), siehe Geräteerkennung.
EasyGames.scan()Sucht neu hinzugefügte data-easygames-Elemente (für dynamische Seiten).

Eigenes Spielmenü bauen

<script>
  EasyGames.ready(() => {
    EasyGames.list().forEach(g => {
      const a = document.createElement('a');
      a.href = g.url; a.textContent = g.title;   // Direktlink im Vollbild
      document.body.appendChild(a);
    });
  });
</script>

4. Ganze Bibliothek einbetten

<iframe src="?embed=1" title="easygames"
  allow="fullscreen; autoplay" allowfullscreen
  style="width:100%;height:90vh;border:0"></iframe>

URL-Parameter der Übersicht

ParameterWirkung
?embed=1Einbettungsmodus: keine Kopfzeile, kein Footer.
?tv=1 / ?tv=0TV-Modus erzwingen oder abschalten (sonst automatisch bei Smart-TV-Browsern).
?device=tv|phone|tablet|desktopGerätetyp vorgeben, z. B. zum Testen.
#spiel-idÖffnet das Spiel direkt im Viewer.

5. Vollbild

Geräteerkennung (TV, Handy, Controller)

easygames erkennt selbst, auf welchem Gerät es läuft. Die Übersicht passt sich an (TV-Layout, Hinweise, Filter), und Spiele können dasselbe nutzen.

device.js einbinden

<script src="device.js"></script>
<script>
  const d = EasyGamesDevice.get();
  console.log(d.type, d.role, d.input);
  EasyGamesDevice.on(d => console.log('geändert:', d.orientation));
</script>

Über easygames.js steht es als EasyGames.device() bereit.

Was geliefert wird

FeldWerteBedeutung
typetv, phone, tablet, desktopGerätetyp (Browser-Kennung, Touch/Maus, Bildschirmgröße)
rolehost, controller, bothVorschlag für Mehrspieler: TV = Gastgeber (großer Bildschirm), Handy = Controller, sonst beides
inputtouch, mouse, keyboard, remote, gamepadMögliche Eingaben
osandroid, ios, ipados, windows, macos, linux, chromeos, tizen, webos, androidtvBetriebssystem
orientation, width, height, dpr–Ausrichtung und Größe, wird bei Drehen aktualisiert
app, webview, standalonetrue/falseLäuft in einer App-WebView bzw. als installierte Web-App
fullscreentrue/falseBrowser kann Vollbild
join, joinedCode / trueWert von ?join=CODE – das Gerät wurde per QR-Code als Controller eingeladen
howauto, overrideErkannt oder per ?device= vorgegeben
Erkennung ist eine gut begründete Annahme: Manche TV-Browser melden sich nicht als TV. Mit ?device=tv (auch phone, tablet, desktop) oder EasyGamesDevice.set('tv') lässt sich der Typ vorgeben. ?tv=1 und ?tv=0 funktionieren ebenfalls.

CSS-Klassen am <html>

eg-tv | eg-phone | eg-tablet | eg-desktop     eg-portrait | eg-landscape     eg-gamepad     eg-app
/* z. B. */  html.eg-tv .menu { font-size: 150% }  html.eg-phone .stick { display: block }

So funktioniert die Handy-Kopplung bei den Spielen

Für Spiele-Entwickler: Gerät im Spiel nutzen

// A) device.js im Spiel einbinden
<script src="../device.js"></script>
if (EasyGamesDevice.joinCode()) startAsController();
else if (EasyGamesDevice.is('tv')) startAsHostWithQr();

// B) Läuft das Spiel im Viewer der Übersicht, kommt das Gerät auch per Nachricht
addEventListener('message', e => {
  if (e.data && e.data.type === 'easygames:device') use(e.data.device);
});
parent.postMessage({ type: 'easygames:getDevice' }, '*');   // jetzt anfordern
// Bei gleicher Herkunft steht es auch als window.EASYGAMES_DEVICE bereit.

Filter in der Übersicht

Karten zeigen Abzeichen (📱 Handy-Controller, 🌐 Online, 👥 Mehrspieler), und Filterknöpfe zeigen nur diese Spiele. Die Zuordnung steht in modes.js.

Android-App mit Offline-Sync

Die App ist eine native Android-Hülle (Kotlin) um die easygames-Oberfläche. Sie speichert alle Spiele samt Bibliotheken auf dem Gerät und hält sie über GitHub aktuell – ohne neues APK.

So kommen Updates auf das Handy

  1. Push auf GitHub: Ein Spiel wird geändert oder ein neues kommt dazu.
  2. Manifest: Der Server-Job (android/server/, systemd-Timer, alle 10 Minuten) holt den neuesten Stand, berechnet sync/manifest.json neu (Liste aller Dateien mit Prüfsumme, dazu sync/catalog.json mit Spielen, Handbuch, Größen) und pusht es nach GitHub, falls sich etwas geändert hat. GitHub Actions werden nicht gebraucht.
  3. Sync in der App: Sobald WLAN verbunden ist (und beim Start), lädt die App das Manifest, vergleicht Prüfsummen und lädt nur geänderte Dateien. Jede Datei wird geprüft, erst wenn alles da ist, wird der neue Stand aktiv. Ein Abbruch lässt den alten Stand unberührt.
  4. Aktivieren: Mitten im Spiel passiert nichts. Danach zeigt die App „Update bereit – Neu laden“, spätestens beim nächsten Start ist alles aktuell.

Offline

Bauen

Die App wird auf eurem Server gebaut (android/build.sh, Anleitung in android/README.md). Ein neues APK ist nur für App-Änderungen nötig, nicht für Spiele-Updates.

Neues Spiel hinzufügen

Neue Spiele erscheinen automatisch in Übersicht, Suche, Generator, Einbettung und TV-Navigation. Dafür sind nur wenige Einträge nötig:

SchrittDateiInhalt
1mein-spiel/index.htmlDas Spiel. Vorlage: tools/spiel-vorlage/index.html
2games.jsid, title, icon oder img, bg, glow, path, desc
3modes.js oder modes:{…} am Eintragpad (Handy-Controller), online, multi, tvParam
4guides.jsanleitung, steuerung, tipps
5node tools/check-games.jsPrüft IDs, Pfade, Bilder, Anleitungen, Modi

Was passiert ohne Eintrag?

Spiel-Vertrag

gamekit.js – fertige Bausteine

<script src="../device.js"></script>
<script src="../gamekit.js"></script>
<script>
  EasyGamesKit.start({
    controller: code => startPad(code),        // ?join=CODE → Handy als Controller
    host: () => startHost(),                   // TV oder ?tv → Gastgeber mit QR-Code
    solo: () => startGame()                    // sonst normal spielen
  });
  // EasyGamesKit.joinUrl(raum)        Adresse für den QR-Code (die Spielseite selbst)
  // EasyGamesKit.onDevice(d => …)     Gerät jetzt und bei Änderungen
  // EasyGamesKit.fullscreenOnInput()  Vollbild beim ersten Tipp/OK
  // EasyGamesKit.keepAwake()          Bildschirm anlassen
  // EasyGamesKit.close() / menu()     Übersicht bitten, das Spiel zu schließen / das Menü zu zeigen
</script>

7. postMessage – Spiele sprechen mit der Übersicht

Läuft ein Spiel im Viewer der Übersicht, kann es Nachrichten senden:

parent.postMessage({ type: 'easygames:close' }, '*');   // Spiel schließen
parent.postMessage({ type: 'easygames:menu'  }, '*');   // Menüleiste zeigen
parent.postMessage({ type: 'easygames:next'  }, '*');   // nächstes Spiel
parent.postMessage({ type: 'easygames:prev'  }, '*');   // voriges Spiel

Nur Nachrichten aus dem Spiel-Frame der Übersicht werden beachtet.

8. In einer App (auch offline)

Was in die App muss

Empfehlung

Öffne in der App entweder die Übersicht (index.html) oder ein Spiel direkt in einer Vollbild-WebView – nicht als iframe in einer anderen Seite. Das vermeidet Probleme mit Vollbild und Zurück-Taste.

Dateien laden: file:// oder https?

Beispiel Android (Kotlin)

val web = findViewById<WebView>(R.id.web)
web.settings.javaScriptEnabled = true
web.settings.domStorageEnabled = true
web.settings.mediaPlaybackRequiresUserGesture = false
// Assets unter https://appassets.androidplatform.net/assets/ ausliefern:
val loader = WebViewAssetLoader.Builder()
    .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this)).build()
web.webViewClient = object : WebViewClientCompat() {
    override fun shouldInterceptRequest(v: WebView, r: WebResourceRequest) = loader.shouldInterceptRequest(r.url)
}
// Vollbild aus HTML5 (onShowCustomView/onHideCustomView) im WebChromeClient umsetzen
web.loadUrl("https://appassets.androidplatform.net/assets/easygames/index.html")
// Zurück-Taste: if (web.canGoBack()) web.goBack() else finish()

Beispiel iOS (Swift)

let cfg = WKWebViewConfiguration()
cfg.allowsInlineMediaPlayback = true
cfg.mediaTypesRequiringUserActionForPlayback = []
let web = WKWebView(frame: .zero, configuration: cfg)
let dir = Bundle.main.url(forResource: "easygames", withExtension: nil)!
web.loadFileURL(dir.appendingPathComponent("index.html"), allowingReadAccessTo: dir)
// Zurück: web.allowsBackForwardNavigationGestures = true
Die Beispiele sind Ausgangspunkte. Bitte in deiner App mit echten Geräten prüfen: Vollbild, Ton, Zurück-Taste und Speicherstand verhalten sich je nach Version unterschiedlich.

Ton und Touch

9. Eigener Server und Pfade

10. Fehlerhilfe

ProblemUrsache und Lösung
Vollbild-Knopf tut nichtsIm iframe fehlt allow="fullscreen", oder das Gerät (iPhone) unterstützt es nicht. Dann Direktlink nutzen.
Kein TonErst nach Tippen erlaubt. In Apps die Autoplay-Einstellung der WebView anpassen.
Übersicht ist leergames.js wird nicht gefunden (falscher Pfad, nicht mitgepackt, oder Browser-Konsole prüfen).
Keine Anleitungenguides.js fehlt. Die Karten funktionieren trotzdem, nur das Anleitungsfenster zeigt dann die Kurzbeschreibung.
EasyGames ist undefinedDas Script ist noch nicht geladen. EasyGames.ready(...) verwenden oder das Script vor dem eigenen Code einbinden.
Spiel ist zu klein/abgeschnittenSeitenverhältnis oder Höhe anpassen (data-ratio, data-height).
Zurück-Taste schließt das Spiel nichtSpiel liegt auf anderer Domain oder file://. Zurück in der App selbst an die WebView weiterreichen.
Bild bleibt leerMixed Content (http in https), Blockierung durch X-Frame-Options, oder das Spiel braucht Netz und ist offline.
TV zeigt falsches Layout?tv=1 anhängen (bzw. ?tv=0 zum Abschalten).