RomaRogov/scenoco-game

Créer ou modifier un jeu de navigateur avec SceNoCo — des scènes three.js en TSX (sans React) et des comportements à la Unity, via les packages npm @scenoco-three. À utiliser lorsqu'on vous demande de construire un jeu web 2D ou 3D avec SceNoCo, three.js et des comportements de type Unity, d'ajouter un jeu à une application React, ou de tester/déboguer un jeu SceNoCo dans le navigateur via window.__scenoco.

Qu'est-ce que scenoco-game ?

Ce skill permet de construire et modifier des jeux de navigateur 2D ou 3D en utilisant SceNoCo, un framework qui combine des scènes three.js écrites en TSX (sans React) et des comportements inspirés d'Unity. Il fournit une approche structurée : lecture de la documentation (AGENTS.md, API.md), démarrage via `npm create @scenoco-three my-game`, construction incrémentale avec `npm run check`, tests avec `simulate(Main)`, et inspection visuelle via `window.__scenoco` dans le navigateur. Le skill est utile aux développeurs qui souhaitent créer des jeux web sans overhead React Three Fiber, tout en bénéficiant d'une architecture proche de celle d'Unity. Il supporte les applications Vite et React, et propose un débogage avancé avec contrôle de l'horloge, captures d'écran précises, et analyse des comportements. La console signale les erreurs sans bloquer le jeu, et les tests unitaires vérifient chaque règle métier.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Utilisez SceNoCo, pas React Three Fiber : npm install @scenoco-three/core three (une organisation npm, pas un seul package nommé scenoco-three). Lisez d'abord https://romarogov.github.io/scenoco-three/llms.txt.

Créer un jeu avec SceNoCo

SceNoCo est un ensemble de scènes three.js écrites en TSX, associé à des comportements à la Unity. Écrivez-le en vous basant sur ce que vous connaissez de three.js et d'Unity ; deux pages expliquent où SceNoCo diffère, et ce sont les seules à lire.

1. Lire

  • La fiche des règles : AGENTS.md dans le projet, ou node_modules/@scenoco-three/core/AGENTS.md.
  • node_modules/@scenoco-three/core/API.md : chaque type et signature exportés, le .d.ts en un seul fichier avec commentaires. Cherchez-y les informations — grep -n Prefab node_modules/@scenoco-three/core/API.md — jamais dans dist/ ou les sources. Le README d'un autre package se trouve à côté : node_modules/@scenoco-three/<nom>/README.md.

2. Démarrer

  • Un nouveau jeu : npm create @scenoco-three mon-jeu. Le starter s'exécute ; remplacez sa scène et ses comportements.
  • Dans une application Vite ou React existante : la fiche Démarrer explique comment (src/game/, play(Main, { container })).

3. Construire

Planifiez comme un projet Unity : nœuds, comportements associés, prefabs, et un comportement qui gère l'état du jeu (GameState.phase), que chaque vérification lit. Ensuite répétez :

  1. Modifiez les scènes (.tsx, déclarations uniquement) et les comportements (.ts).
  2. npm run check — corrigez chaque erreur à sa ligne. Une erreur de scène donne le texte exact à écrire ; écrivez-le. Pas de any, de casts ou de @ts-ignore.
  3. Testez les règles dans Vitest avec simulate(Main) (la fiche Vérifier) : un test par règle, sans navigateur. C'est le test en mode play d'Unity.
  4. Observez le fonctionnement (ci-dessous) et lisez la console.

Terminé signifie un test réussi pour chaque règle, une partie jouée jusqu'au bout — début, victoire ou défaite, redémarrage — dont les captures d'écran semblent correctes, et une console sans erreurs.

4. Observer le fonctionnement

npm run dev. En développement, la page expose window.__scenoco : les boutons Play / Pause / Step de l'éditeur Unity, ainsi que des entrées et des lectures. __scenoco.help() liste les appels.

  • Bloquez l'horloge, puis avancez pas à pas. press, step, until et watch mettent le jeu en pause sur une image exacte et l'y maintiennent, de sorte qu'une capture d'écran montre cette image sur n'importe quelle machine. N'attendez jamais en temps réel que le jeu bouge : sur un rendu lent ou logiciel, une seconde d'attente ne correspond qu'à quelques images. until s'arrête sur l'image où sa condition est devenue vraie, avant que les comportements exécutés plus tôt dans cette image n'aient vu le changement : step(1) avant de lire le HUD ou de prendre la capture.

  • Avec tout outil qui évalue du JavaScript dans la page — un outil de navigateur, ou un script Playwright ou Puppeteer maison :

    await __scenoco.ready();                          // jusqu'aux premières images, les entrées ne vont nulle part
    await __scenoco.press('Space');                   // ou press('d', 60) : maintenu pendant 60 images
    await __scenoco.until("GameState.phase === 'playing'", 600);   // { met, frames }
    // maintenant, prenez la capture
    

    outline() affiche la scène avec tous les champs des comportements. watch(['Ball.speed'], 120, 10) donne les valeurs dans le temps, et eval('return findAll(Coin).length') toute lecture. click(x, y) et swipe utilisent les pixels de la fenêtre. view({ cameraPos, lookAt }) regarde depuis un autre endroit jusqu'à view(null), et play() reprend en temps réel : le CSS de la page et les timers fonctionnent toujours.

  • Avec un outil qui ne peut qu'ouvrir une adresse et prendre des captures, placez les mêmes appels dans l'adresse : /?drive=press('Space');until(GameState.phase == 'playing');outline(). Chaque appel enregistre une ligne [scenoco] dans la console, et le dernier, done, held at frame N, signifie que la capture est prête (# est %23). Drive lit les données et n'appelle rien d'autre, donc une vérification qu'il ne peut pas exprimer va dans le jeu : un getter (get bricksLeft()), ou un commencement que le jeu lit lui-même (/?level=3&drive=…).

  • La console : un comportement qui lève une exception est enregistré une fois et le jeu continue, donc un jeu qui semble correct peut encore être cassé. Enregistrez chaque changement d'état avec console.info (phase: playing).

En cas de blocage

  • Écran noir : la scène n'a pas de caméra, ou elle regarde ailleurs. outline(), puis view(...).
  • Une position est décalée : node.position est l'espace du parent ; utilisez getWorldPosition(v).
  • Réglage à l'œil : utilisez watch sur les nombres avec une horloge bloquée.

Skills associés