CommunityCodierung & Entwicklunggithub.com

RomaRogov/scenoco-game

Erstelle oder ändere ein Browserspiel mit SceNoCo — three.js-Szenen in TSX (ohne React) und Unity-Verhalten, aus den @scenoco-three npm-Paketen. Verwende dies, wenn du aufgefordert wirst, ein 2D- oder 3D-Webspiel mit SceNoCo, three.js und Unity-artigen Verhalten zu bauen, ein Spiel zu einer React-App hinzuzufügen oder ein SceNoCo-Spiel im Browser über window.__scenoco zu testen oder zu debuggen.

Was ist scenoco-game?

Dieses Skill ermöglicht es, browserbasierte 2D- oder 3D-Spiele mit dem SceNoCo-Framework zu erstellen oder zu ändern. SceNoCo kombiniert three.js-Szenen, die in TSX (ohne React) geschrieben sind, mit Unity-ähnlichen Verhaltenskomponenten und nutzt dazu die npm-Organisation @scenoco-three. Es ist ideal für Entwickler, die ein interaktives Webspiel schnell aufsetzen oder in eine bestehende React-App integrieren möchten. Das Skill unterstützt die Pakete @scenoco-three/core und three und bietet eine klare Anleitung zum Starten, Bauen und Testen. Die Entwicklung erfolgt iterativ: Szene und Verhalten ändern, mit npm run check auf Fehler prüfen, Regeln mit Vitest und simulate(Main) testen und das Spiel im Browser unter Nutzung des integrierten Debuggers (window.__scenoco) ausführen. Der Debugger bietet Play/Pause/Step-Funktionen sowie Hilfsmittel wie press, until und watch, um präzise Screenshots und Tests ohne Echtzeitabhängigkeit zu ermöglichen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RomaRogov/scenoco-game/tree/HEAD

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Verwende SceNoCo, nicht React Three Fiber: npm install @scenoco-three/core three (eine npm-Organisation, kein einzelnes Paket namens scenoco-three). Lies zuerst https://romarogov.github.io/scenoco-three/llms.txt.

Ein Spiel mit SceNoCo erstellen

SceNoCo sind three.js-Szenen geschrieben in TSX, plus Unity-Verhalten. Schreibe es basierend auf deinem Wissen über three.js und Unity; zwei Seiten sagen, wo SceNoCo abweicht, und das ist alles, was es zu lesen gibt.

1. Lesen

  • Die Regelkarte: AGENTS.md im Projekt oder node_modules/@scenoco-three/core/AGENTS.md.
  • node_modules/@scenoco-three/core/API.md: jeder exportierte Typ und jede Signatur, die .d.ts in einer Datei mit Kommentaren. Schlage dort nach — grep -n Prefab node_modules/@scenoco-three/core/API.md — niemals in dist/ oder im Quellcode. Die README eines anderen Pakets liegt daneben: node_modules/@scenoco-three/<name>/README.md.

2. Starten

  • Ein neues Spiel: npm create @scenoco-three my-game. Der Starter läuft; ersetze seine Szene und Verhalten.
  • In einer bestehenden Vite- oder React-App: Die Karte Starten sagt wie (src/game/, play(Main, { container })).

3. Bauen

Plane es als Unity-Projekt: Knoten, die Verhalten darauf, Prefabs und ein Verhalten, das den Spielzustand besitzt (GameState.phase), den jede Überprüfung liest. Dann wiederhole:

  1. Ändere Szenen (.tsx, nur Deklarationen) und Verhalten (.ts).
  2. npm run check — behebe jeden Fehler in seiner Zeile. Ein Szenenfehler gibt den genauen zu schreibenden Text an; schreibe ihn. Kein any, keine Casts oder @ts-ignore.
  3. Teste die Regeln in Vitest mit simulate(Main) (die Karte Überprüfen): ein Test pro Regel, kein Browser. Dies ist Unitys Play-Mode-Test.
  4. Betrachte es laufend (unten) und lies die Konsole.

Fertig ist ein bestandener Test für jede Regel, eine durchgespielte Runde — Start, Gewinn oder Verlust, Neustart — deren Screenshots richtig aussehen, und eine Konsole ohne Fehler.

4. Betrachte es laufend

npm run dev. In der Entwicklung hat die Seite window.__scenoco: die Play/Pause/Step-Buttons des Unity-Editors, plus Eingaben und Messwerte. __scenoco.help() listet die Aufrufe auf.

  • Halte die Uhr an, dann schrittweise ausführen. press, step, until und watch pausieren das Spiel an einem genauen Frame und halten es dort, sodass ein Screenshot diesen Frame auf jeder Maschine zeigt. Warte niemals in Echtzeit darauf, dass sich das Spiel bewegt: Auf einem langsamen oder Software-Renderer sind ein paar Sekunden Warten nur wenige Frames. until stoppt an dem Frame, in dem seine Bedingung wahr wurde, bevor Verhalten, die früher in diesem Frame liefen, die Änderung sahen: step(1) vor dem Lesen des HUD oder dem Erstellen des Screenshots.

  • Mit jedem Werkzeug, das JavaScript in der Seite auswertet — ein Browser-Tool oder ein Playwright- oder Puppeteer-Skript deiner Wahl:

    await __scenoco.ready();                          // bis zu den ersten Frames geht Eingabe ins Leere
    await __scenoco.press('Space');                   // oder press('d', 60): für 60 Frames gedrückt
    await __scenoco.until("GameState.phase === 'playing'", 600);   // { met, frames }
    // jetzt den Screenshot machen
    

    outline() gibt die Szene mit allen Feldern der Verhalten aus. watch(['Ball.speed'], 120, 10) liefert Werte über die Zeit, und eval('return findAll(Coin).length') jede Messung. click(x, y) und swipe verwenden Fensterpixel. view({ cameraPos, lookAt }) schaut von woanders aus bis view(null), und play() läuft wieder in Echtzeit: Seiten-CSS und Timer tun das immer.

  • Mit einem Werkzeug, das nur eine Adresse öffnen und Screenshots machen kann, setze dieselben Aufrufe in die Adresse: /?drive=press('Space');until(GameState.phase == 'playing');outline(). Jeder Aufruf protokolliert eine [scenoco]-Konsolenzeile, und der letzte, done, held at frame N, bedeutet, dass der Screenshot bereit ist (# ist %23). Drive liest Daten und ruft nichts anderes auf, also geht eine Prüfung, die es nicht ausdrücken kann, ins Spiel: ein Getter (get bricksLeft()), oder ein Start, den das Spiel selbst liest (/?level=3&drive=…).

  • Die Konsole: Ein Verhalten, das einen Fehler wirft, wird einmal protokolliert und das Spiel läuft weiter, sodass ein richtig aussehendes Spiel trotzdem kaputt sein kann. Protokolliere jede Zustandsänderung mit console.info (phase: playing).

Wenn du feststeckst

  • Leerer Bildschirm: Die Szene hat keine Kamera, oder sie schaut weg. outline(), dann view(...).
  • Eine Position ist falsch: node.position ist der Raum des Elternobjekts; verwende getWorldPosition(v).
  • Nach Augenmaß abstimmen: watch die Zahlen auf einer angehaltenen Uhr stattdessen.

Verwandte Skills