Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗
Jeu de drift mobile en 3D, jouable dans le navigateur. Inspiration FR Legends. Lance la voiture, tiens l'angle, clippe les murs, encaisse le combo. Aucune installation, aucun compte, aucune pub. Tout reste sur ton appareil.
| 🛣️ 6 pistes | Docks de Minato (nuit), Col d'Akane (coucher de soleil), Piton Volcan (jour), Quai de Shiohama (aube), Col de Yukimi (neige, adhérence ×0,88), Corniche de Kaigan (crépuscule). |
| 🏝️ L'île, monde ouvert | 2,1 × 1,5 km, 15 routes, 10 carrefours, 9 km de bitume, relief jusqu'à 110 m. Circulation (5 modèles, roulage à gauche), 4 pilotes rivaux à défier (touge, tandem de rue), 6 habitants à qui parler, radars, zones de glisse, belvédères photo, 12 daruma dorés, carte et GPS. |
| 👥 Multijoueur | Jusqu'à 4 pilotes sur l'île, pair à pair (WebRTC), sans compte ni serveur de jeu : invitation par code ou lien, messages rapides, course et battle de drift lancées par l'hôte. |
| 📖 Aventure | « Le Tour de l'Île » : 6 chapitres × 3 missions, 7 personnages, archives à collectionner, défis de rue. |
| 🎯 3 modes | Run noté (note de S à D), Tandem (chasse le leader), Libre (entraînement). En run noté, ton fantôme (meilleur run de la piste) roule en transparence et le HUD affiche l'écart de points en direct. |
| 🔧 Atelier | 3 voitures, carrosserie, 12 peintures × 5 finitions, 6 livrées, 5 jantes, fumée colorée, 6 pièces de perf × 3 niveaux, réglages freins et suspension. |
| 🎬 Moments forts | En fin de run, les 3 meilleurs instants (gros combo, clip, frôlé, angle record) ; replay cinématique (poursuite, travelling, bord de piste, ralenti sur les clips et les frôlés). Les 8 derniers enregistrements des pistes se revoient depuis la Carrière. |
| 💴 Carrière | Yens fictifs (aucun achat réel), 36 défis, bonus quotidien, records par piste. |
| 📱 Tactile d'abord | Boutons déplaçables et redimensionnables, miroir gauche/droite, clavier et manette aussi. |
| ⚡ Fluide sur petit Android | Physique à 120 Hz interpolée, résolution dynamique, 65–68 appels de dessin par image. |
| Action | Tactile | Clavier |
|---|---|---|
| Gaz / frein | GAZ / FREIN | ↑ ↓ ou Z S / W S |
| Braquer | ‹ › | ← → ou Q D / A D |
| Frein à main (lancer la glisse) | FREIN À MAIN | Espace |
| Vue (caméra) | 👁 | C |
| Se replacer | menu pause | R |
| Interagir (île) | bouton contextuel en bas | E |
| Carte et GPS (île) | menu pause | M |
| Klaxon · messages rapides (session) | 📯 👋 GG ➜ 🔥 | H · 1 à 4 |
Manette compatible. Le geste de base : prends de la vitesse, braque, tire le frein à main un court instant, puis tiens les gaz.
Moteur et rendu
InstancedMesh, shaders précompilésSimulation
Son et interface
Qualité et livraison
node:test (106) : économie, physique, tracés, île, vie de l'île, multijoueur, aventurebuild.mjs assemble src/* en un seul index.htmlmainZéro dépendance npm en production. Pas de framework, pas de bundler : un script Node concatène les sources, le navigateur fait le reste.
flowchart LR
A["src/*.js<br>src/head.html<br>src/body.html"] -->|node build.mjs| B["index.html<br>(fichier unique)"]
L["assets/logo.webp<br>assets/favicon.svg"] -->|intégrés en data URI| B
B -->|push sur main| V["Vercel"]
V --> P["sideways-drift-club.vercel.app"]
C["Three.js r128<br>cdnjs"] -.chargé au runtime.-> P
| Outil | Usage |
|---|---|
| Node.js ≥ 18 | Build (build.mjs) et tests (node --test) |
| Playwright + Chromium | Captures, bot expert, mesures de perf et d'audio (tools/) |
| Vercel | Hébergement statique, déploiement à chaque merge sur main |
| Claude (Anthropic) | Conception et code assistés par IA (mention dans l'écran d'aide) |
| Outils d'IA générative | Logo et visuels |
Le jeu est une PWA : il s'installe comme une appli, en plein écran, sans store.
| Appareil | Étapes |
|---|---|
| Android (Chrome) | Ouvre le jeu → menu ⋮ → Installer l'application (ou Ajouter à l'écran d'accueil). |
| iPhone / iPad (Safari) | Ouvre le jeu → bouton Partager → Sur l'écran d'accueil. |
| Ordinateur (Chrome, Edge) | Icône d'installation dans la barre d'adresse, ou joue directement dans l'onglet. |
Mise à jour côté joueur : rien à faire. Le jeu n'a pas de cache hors ligne (pas de service worker) : chaque ouverture charge la dernière version. Ta progression (localStorage) est conservée.
git clone https://github.com/shanlihenriderussy-rgb/Sideways-Drift-Club.git
cd Sideways-Drift-Club
node build.mjs # régénère index.html
npx serve . # ou : python3 -m http.server 8000
Ouvre http://localhost:3000 (ou :8000). Un simple double-clic sur index.html fonctionne aussi.
Hors ligne (tests, captures) :
mkdir -p vendor
curl -o vendor/three.min.js https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js
node build.mjs --local # test.html, Three.js depuis vendor/
node --test tests/*.test.js # 80 tests
git checkout main && git pull.src/ (jamais dans index.html, il est généré).node --test tests/*.test.js # tout doit passer
node build.mjs # régénère index.html
Nouveau tracé → tests/tracks.test.js impose : pas de recoupement, ≥ 5 virages, 900–1 900 m, un seul type de clip par virage.src/ et index.html ensemble (conventional commits : feat(piste): …, fix(atelier): …).main. Au merge, Vercel redéploie en ligne en ~1 min.node build.mjs --local
node tools/readme-shots.js # docs/screenshots/*.jpg (bot au volant)
node tools/readme-banner.js # docs/brand/banner.jpg
| Rôle | Couleur |
|---|---|
| Action, argent, combo | |
| Rubriques, tandem | |
| Alertes | |
| Fond |
Direction : « Télémétrie de nuit ». La 3D est le sujet, l'interface s'efface.
| Fichier | Rôle |
|---|---|
src/physics.js | Modèle bicyclette, pneus saturés, régulateur d'angle de drift (assistance) ; lit les champs de fiche tunée (steerRate, driftSteer, angleBoost, rollK, brakeK, brakeRear, hbK, latBal, damp, camber) et l'adhérence de piste (grip) |
src/economy.js | Portefeuille en yens, catalogue de l'atelier, gains de fin de run, défis, bonus quotidien, fiche tunée. Logique pure, testée |
src/track.js | 6 tracés, échantillonnage, virages et clips (un type par virage, règle des tracés officiels), barème (par), adhérence (grip, neige) |
src/world.js | Ciel (nuages, étoiles), crêtes, route et murs par lieu, décor instancié par thème, tribune, eau animée. Thèmes dawn, snow, dusk = palettes posées sur une famille de décor (decor) |
src/car.js | Voitures procédurales : caisse lissée (loft), habitacle, livrée peinte, pièces modulaires, roues instanciées |
src/fx.js | Fumée colorée (points), traces de gomme (envoi GPU partiel), étincelles |
src/audio.js | Moteur, turbo, crissement synthétisés (Web Audio) |
src/ai.js | Leader tandem sur trajectoire précalculée |
src/story.js | Aventure « Le Tour de l'Île » : 6 chapitres × 3 missions, dialogues, objectifs, exploration (archives, défis de rue, rencontres). Logique pure, testée |
src/island.js | L'île : monde ouvert continu (9 km de routes, carrefours, relief, volcan, mer), recherche de route, terrain (partie pure, testée) et rendu Three.js, dont circulation instanciée (~15 appels de dessin pour tout le trafic), habitants, radars, arches de zone, étiquettes flottantes |
src/isleai.js | Vie de l'île : GPS (plus court chemin), circulation (suivi de voie, distance d'arrêt, klaxon, dépassement), rivaux en glisse, activités à étoiles, habitants et belvédères. Logique pure, testée |
src/ghost.js | Fantôme du record : échantillon toutes les 0,1 s (position, cap, dérive, points), stockage compact vérifié (), relecture interpolée. Logique pure, testée |
sdc:profile.story.sdc:profile.isle.Réglages → Personnaliser : déplacer chaque bouton, taille générale + taille par bouton, transparence, miroir, réinitialisation. Disposition enregistrée par orientation (localStorage, clé sdc:touchLayout). Un doigt peut glisser d'un bouton à l'autre sans lâcher (hit-test + hystérésis de 28 px). Zoom : bloqué sur la surface de jeu (touch-action: none, garde touchend, gesture*), autorisé dans les menus (pan-y pinch-zoom) ; le viewport ne l'interdit pas (WCAG 1.4.4).
sdc:profile : solde, voitures, pièces, défis, 40 derniers mouvements) restent en localStorage sur l'appareil du joueur.sdc:ghostssrc/replay.js | Moments forts : choix des 3 meilleurs instants sans chevauchement, découpe de la trajectoire, enregistrements vérifiés (sdc:recs, 8 au plus), lecture interpolée. Logique pure, testée |
src/net.js | Multijoueur pair à pair : session hôte/invités avec relais, état compact à 15 Hz, interpolation 120 ms, filtrage de tout ce qui vient du réseau, codes d'invitation compressés, transport WebRTC. Partie pure testée |
src/shop.js | Atelier : 6 rayons, aperçu avant achat, barre d'achat |
src/game.js | Boucle (pas fixe 120 Hz + interpolation), caméra, score, collisions, entrées, interface, carrière |
assets/favicon.svg, icons/, manifest.webmanifest | Favicon (intégré au build), icônes d'application, manifeste PWA |
docs/ | Visuels de cette page : screenshots/, brand/ (bannière, logos PNG, boutons) |
tests/ | node --test tests/*.test.js : économie, effets physiques des réglages, tracés, île, vie de l'île, multijoueur, aventure |
tools/ | Bancs d'essai : physique (Node), captures, tour complet, bot expert, perf, CPU ralenti, analyse audio, visuels du README (Playwright) |