nape-js

Moteur physique 2D entièrement typé pour TypeScript et JavaScript — réécriture moderne de Nape

Corps rigides • Cercles, polygones et capsules • Contraintes • Simulation de fluides • Callbacks de collision • Raycasting et requêtes spatiales • Fracture • Corps mous via contraintes • Multijoueur déterministe • Sérialisation • Prise en charge des Web Workers — sans dépendances, ~174 Ko gzip.

v3.43.5 ~175 Ko gzip
npm install @newkrok/nape-js

Démos interactives

Cliquez/glissez sur le canvas pour interagir. Choisissez une démo ci-dessous. Physique Jeu

Chargement du moteur…
FPS : — Corps : — Step : —
Code source

Dernières démos de jeu complètes

Les jeux multi-systèmes les plus récents construits sur le moteur — IA, vagues, caméras et rigs 3D, chacun dans un seul fichier ouvrable sur CodePen.

Hitch & Park — gameplay screenshotJouer →

Jeu completHitch & Park

Un jeu de stationnement avec remorque vu de dessus : cinq sites — supermarché, parking à étages, cale de mise à l'eau, rue commerçante, camping —, chacun avec une place marquée où la remorque doit finir nez vers l'extérieur, droite et à l'arrêt. Les voitures garées se laissent pousser (leurs feux de détresse vous dénoncent), les cônes tombent, piliers, haies et arbres ne bougent pas ; chaque accrochage coûte des points et le chrono court contre un temps de référence. ↑ ↓ avancer / reculer, ← → braquer, ESPACE freiner, G guide de trajectoire ; en tactile, maintenez et faites glisser. Physique : la voiture est un châssis plus quatre corps de roue — les arrière sur des WeldJoint, les avant sur des PivotJoint braqués par des AngleJoint aux angles d'Ackermann —, et seules les roues avant sont motrices : ce sont bien les roues braquées qui tirent la voiture ; la remorque pend à un PivotJoint sur la boule d'attelage et se met en portefeuille si vous reculez mal. En 3D : sites ombrés, roues qui tournent et braquent, feux stop et de recul, incrustation de caméra de recul.

GameplayVéhiculeJointsTop-downListenersMobile
Flipper Fray — gameplay screenshotJouer →

Jeu completFlipper Fray

Une bagarre de flipper à quatre joueurs : une table ronde, quatre poches, chacune gardée par une paire de flippers. Le plateau est un dôme : tout roule du centre vers l'extérieur, donc chaque bille finit par être le problème de quelqu'un ; bumpers, slingshots et plots de couloir projettent les billes partout, et chaque bille qui passe vos flippers vous coûte une vie — cinq vies, la dernière poche debout gagne, ou celle qui a le plus de vies au bout de trois minutes. Vous tenez la poche du bas contre trois gardiens IA ; le multibille lâche des billes supplémentaires selon un calendrier et toutes les trente secondes une bille-bombe sort : deux vies si elle tombe, une explosion si personne ne l'avale. ← → / A D pour les flippers, ESPACE pour les deux ; en tactile, maintenez la moitié gauche ou droite de l'écran. Physique : les flippers sont des corps cinématiques pilotés par setVelocityFromTarget, si bien qu'un coup transmet une vraie vitesse angulaire à la bille ; les billes sont des cercles marqués bullet, donc rien ne traverse les fines parois de l'anneau ; les impulsions des bumpers et des slingshots et l'attribution des buts passent par des InteractionListener. En 3D, une arène néon avec des billes chromées, des poches lumineuses et des lignes de couloir, vue de derrière votre propre poche.

GameplayPinballIAKinematicCCDListenersMobile
Swarm Night — gameplay screenshotJouer →

Jeu completSwarm Night

Un roguelite de survie façon Vampire Survivors : cinq minutes dans un cimetière clôturé, et vous ne faites que vous déplacer — chaque arme tire toute seule. Les victimes lâchent des gemmes d'XP ; une barre pleine met la nuit en pause et propose trois cartes d'amélioration parmi six armes (fouet, baguette, couteaux, cercle, orbes, foudre) et huit passifs. Six types de monstres arrivent selon un calendrier, plus des chevaliers du tombeau qui chargent avec un trésor et un colosse d'os à 4:00 dont le coup au sol projette toute la foule. L'aube à 5:00 est la victoire. WASD / flèches pour bouger, 1 / 2 / 3 ou clic pour choisir une carte ; sur tactile, maintenez n'importe où pour diriger. Physique : jusqu'à 420 monstres sont des cercles dynamiques dans un Space sans gravité, la horde se presse et s'écoule entre les pierres sans code de nuée ; le recul est une impulsion proportionnelle à la masse, et projectiles, couteaux, crachats et orbes sont des corps capteurs livrés par des InteractionListener avec filtrage des camps par masques. En 3D, un cimetière au clair de lune où chaque monstre est un rig low-poly instancié.

GameplayRogueliteIACaméraCapteursPerformanceMobile

Tous les jeux →

Pourquoi nape-js ?

nape-js est l'un des rares moteurs physiques 2D pour JavaScript et TypeScript à proposer la dynamique des corps rigides, des liaisons (PivotJoint, DistanceJoint, WeldJoint, AngleJoint, MotorJoint, LineJoint, PulleyJoint, SpringJoint), la flottabilité des fluides, la fracture, des corps mous et du tissu construits à partir de réseaux de contraintes, le raycasting et les balayages convexes, un contrôleur de personnage intégré, un pas de simulation déterministe pour le rollback multijoueur, la sérialisation binaire, l'enregistrement de replays et un pont Web Worker hors thread principal — dans un seul paquet ESM (~174 Ko gzip), avec des types TypeScript complets et sans dépendance au DOM.

Vous cherchez une alternative à Box2D, Matter.js, Planck.js ou Rapier ? Lancez le benchmark dans le navigateur pour les comparer directement, ou plongez dans les exemples interactifs — démos physiques et mini-jeux jouables (platformer, MOBA, tower defense, lance-pierre, flipper, shooter en vue de dessus).

Conçu pour le développement assisté par IA

Les agents de code travaillent mieux avec une bibliothèque qu'ils peuvent lire, typer et réellement exécuter. nape-js fournit les trois.

llms.txt, servi

Toute l'API dans un fichier texte à /llms.txt, plus une référence complète à /llms-full.txt — le standard émergent pour fournir la documentation à un modèle. Donnez l'URL à votre agent au lieu de scraper du HTML.

Des types fiables pour le modèle

Du TypeScript écrit à la main partout avec strict: true, livré sous forme de déclarations générées. Votre agent obtient de vraies signatures et la TSDoc au survol, et invente donc moins de méthodes inexistantes.

Fonctionne sans interface dans Node

Zéro dépendance au DOM : un agent peut importer le moteur, faire avancer une simulation et vérifier le résultat dans un terminal — sans navigateur, sans canvas, sans mock.

Déterministe, donc les tests tiennent

Avec space.deterministic = true, les mêmes entrées donnent le même résultat sur la même plateforme. Un test de régression écrit par un agent reste vert pour la bonne raison.

Pièges documentés

Un guide des anti-patterns et un guide de dépannage détaillent les erreurs que les modèles commettent le plus souvent avec les API physiques.

Des recettes par tâche

Le livre de recettes est organisé par objectif — plateforme, ragdoll, fluide, replay — c'est-à-dire la forme sous laquelle arrive généralement un prompt.

Benchmarks

Mesuré dans votre navigateur, en direct. Chaque test exécute le step() de la physique dans une boucle serrée et rapporte le temps médian par step.

Appuyez sur le bouton pour démarrer.

L'API en un coup d'œil

Cœur

  • Space — monde physique
  • Body — corps rigide
  • Vec2 — vecteur 2D
  • AABB — boîte englobante

Formes

  • Circle — basée sur un rayon
  • Polygon — enveloppe convexe
  • Capsule — extrémités arrondies
  • Polygon.box(w, h)

Soutenir nape-js

nape-js est sous licence MIT et développé ouvertement. S'il vous fait gagner du temps — ou fait tourner votre jeu — un parrainage fait vivre les démos, les guides et les versions.