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) |