nape-js

Motor de física 2D totalmente tipado para TypeScript y JavaScript — reescritura moderna de Nape

Cuerpos rígidos • Círculos, polígonos y cápsulas • Restricciones • Simulación de fluidos • Callbacks de colisión • Raycasting y consultas espaciales • Fractura • Cuerpo blando mediante restricciones • Multijugador determinista • Serialización • Compatible con Web Worker: sin dependencias, ~174 KB gzip.

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

Demos interactivas

Haz clic o arrastra sobre el lienzo para interactuar. Elige una demo abajo. Física Juego

Cargando el motor…
FPS: — Cuerpos: — Paso: —
Código fuente

Últimas demos de juego completas

Los juegos multisistema más recientes sobre el motor — IA, oleadas, cámaras y rigs 3D, cada uno en un solo archivo que puedes abrir en CodePen.

Hitch & Park — gameplay screenshotJugar →

Juego completoHitch & Park

Un juego de aparcar con remolque visto desde arriba: cinco lugares — supermercado, aparcamiento de varias plantas, rampa del puerto, calle céntrica, camping —, cada uno con una plaza marcada donde debe acabar el remolque, con el morro hacia fuera, recto y parado. Los coches aparcados se pueden empujar (sus luces de emergencia te delatan), los conos se caen y los pilares, setos y árboles no se mueven; cada golpe resta puntos y el reloj corre contra un tiempo de referencia. ↑ ↓ avanzar / marcha atrás, ← → girar, ESPACIO frenar, G guía de trayectoria; en táctil, mantén pulsado y arrastra. Física: el coche es un chasis más cuatro cuerpos de rueda — las traseras con WeldJoint, las delanteras con PivotJoint y dirigidas por AngleJoint con ángulos de Ackermann —, y solo las ruedas delanteras traccionan, así que son las ruedas giradas las que tiran del coche; el remolque cuelga de un PivotJoint en la bola y se cruza si das marcha atrás mal. En 3D: escenarios con sombras, ruedas que giran y se orientan, luces de freno y de marcha atrás, y una ventana de cámara trasera.

JugabilidadVehículoJointsTop-downListenersMóvil
Flipper Fray — gameplay screenshotJugar →

Juego completoFlipper Fray

Una pelea de pinball para cuatro jugadores: una mesa redonda, cuatro bolsillos y un par de flippers guardando cada uno. El campo es una cúpula: todo rueda hacia fuera desde el centro, así que cada bola acaba siendo problema de alguien; bumpers, slingshots y postes de carril lanzan las bolas de un lado a otro, y cada bola que pasa tus flippers te cuesta una vida — cinco vidas, gana el último bolsillo en pie, o el que más vidas tenga cuando se acaben los tres minutos. Defiendes el bolsillo inferior contra tres porteros IA; el multibola suelta bolas extra según un calendario y cada medio minuto sale una bola bomba: dos vidas si entra, una explosión si nadie se la traga. ← → / A D para los flippers, ESPACIO ambos; en táctil, mantén pulsada la mitad izquierda o derecha de la pantalla. Física: los flippers son cuerpos cinemáticos movidos con setVelocityFromTarget, así que un golpe transmite velocidad angular real a la bola; las bolas son círculos con marca bullet, así que nada atraviesa las finas paredes del anillo; los empujones de bumpers y slingshots y la anotación de goles llegan por InteractionListener. En 3D, una arena de neón con bolas cromadas, bolsillos luminosos y luces de carril, vista desde detrás de tu propio bolsillo.

JugabilidadPinballIAKinematicCCDListenersMóvil
Swarm Night — gameplay screenshotJugar →

Juego completoSwarm Night

Un roguelite de supervivencia al estilo Vampire Survivors: cinco minutos en un cementerio vallado, y tú solo te mueves: cada arma dispara por sí sola. Las muertes sueltan gemas de XP; una barra llena detiene la noche y ofrece tres cartas de mejora entre seis armas (látigo, varita, cuchillos, escudo, orbes, rayo) y ocho pasivas. Seis tipos de monstruo llegan según un horario, más caballeros sepulcrales que embisten con tesoro y un coloso de hueso a las 4:00 cuyo golpe lanza a toda la multitud. El amanecer a las 5:00 es la victoria. WASD / flechas para moverte, 1 / 2 / 3 o clic para elegir carta; en táctil, mantén pulsado para dirigir. Física: hasta 420 monstruos son círculos dinámicos en un Space sin gravedad, así que la horda se apiña y fluye entre las lápidas sin código de bandada; el retroceso es un impulso escalado por masa, y proyectiles, cuchillos, escupitajos y orbes son cuerpos sensores entregados mediante InteractionListener con filtrado de bandos por máscaras. En 3D, un cementerio a la luz de la luna donde cada monstruo es un rig low-poly instanciado.

JugabilidadRogueliteIACámaraSensoresRendimientoMóvil

Todos los juegos →

¿Por qué nape-js?

nape-js es uno de los pocos motores de física 2D para JavaScript y TypeScript que incluye dinámica de cuerpos rígidos, uniones (PivotJoint, DistanceJoint, WeldJoint, AngleJoint, MotorJoint, LineJoint, PulleyJoint, SpringJoint), flotabilidad de fluidos, fractura, cuerpos blandos y telas construidos con redes de restricciones, raycasting y barridos convexos, un controlador de personaje integrado, paso determinista para rollback multijugador, serialización binaria, grabación de repeticiones y un puente Web Worker fuera del hilo principal, como un único paquete ESM (~174 KB gzip), con tipos de TypeScript completos y sin dependencias del DOM.

¿Buscas una alternativa a Box2D, Matter.js, Planck.js o Rapier? Ejecuta el benchmark en el navegador para compararlos cara a cara, o entra directo a los ejemplos interactivos — demos de física y mini-juegos jugables (plataformas, MOBA, tower defense, resortera, pinball, shooter cenital).

Pensado para el desarrollo asistido por IA

Los agentes de programación funcionan mejor con una biblioteca que puedan leer, comprobar de tipos y ejecutar de verdad. nape-js ofrece las tres cosas.

llms.txt, servido

Toda la API en un archivo de texto en /llms.txt, más una referencia completa en /llms-full.txt: el estándar emergente para pasar documentación a un modelo. Dale la URL a tu agente en lugar de raspar HTML.

Tipos en los que el modelo puede confiar

TypeScript escrito a mano en todo el proyecto con strict: true, distribuido como declaraciones generadas. Tu agente obtiene firmas reales y TSDoc al pasar el cursor, así que inventa menos métodos inexistentes.

Se ejecuta sin interfaz en Node

Cero dependencias del DOM: un agente puede importar el motor, avanzar una simulación y comprobar el resultado en la terminal, sin navegador, sin canvas y sin mocks.

Determinista, para que las pruebas aguanten

Con space.deterministic = true, las mismas entradas dan la misma salida en la misma plataforma. Una prueba de regresión escrita por un agente sigue en verde por el motivo correcto.

Errores documentados

Una guía de antipatrones y una guía de resolución de problemas detallan los fallos que los modelos cometen más a menudo con las API de física.

Recetas por tarea

El recetario está organizado por objetivos —plataformas, ragdoll, fluidos, repeticiones—, que es la forma en la que suele llegar un prompt.

Benchmarks

Medido en tu navegador ahora mismo. Cada prueba ejecuta el step() de física en un bucle cerrado e informa la mediana del tiempo por paso.

Presiona el botón para comenzar.

La API de un vistazo

Núcleo

  • Space — mundo físico
  • Body — cuerpo rígido
  • Vec2 — vector 2D
  • AABB — caja envolvente

Formas

  • Circle — basada en radio
  • Polygon — envolvente convexa
  • Capsule — extremos redondeados
  • Polygon.box(w, h)

Apoya a nape-js

nape-js tiene licencia MIT y se desarrolla en abierto. Si te ahorra tiempo — o tu juego corre sobre él — un patrocinio mantiene vivas las demos, guías y versiones.