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。 以下为已保存的摘录。
Projeto: Dino Game com persistência de dados em backend demo.gif ainda não existe. Depois de jogar uma partida, grave a tela (ex: ScreenToGif, Xbox Game Bar Win+G, ou o gravador de tela do navegador) e salve o arquivo como demo.gif na raiz do repositório. Carlos Henrique Mendina Gonçalves Pereira — Engenharia de Computação查看完整 README ↗
https://project2-2026b-cau19.vercel.app
Carlos Henrique Mendina Gonçalves Pereira — Engenharia de Computação
Jogo estilo "Dino Game": um personagem parado no canto esquerdo da tela desvia de obstáculos (pulando) para sobreviver o maior tempo possível. Não há autenticação/login; o jogador apenas informa um nome ao final da partida para entrar em uma tela de ranking com os maiores scores. O frontend se comunica com o backend por meio de uma API (leitura e escrita), e os dados de ranking são persistidos do lado do servidor.
Modalidade: A (parceria dev com Ricardo Facco Pigatto — comparação de decisões de código entre duas implementações do mesmo "Dino Game").
Ricardo Facco Pigatto, autor da proposta original do "Dino Game" no documento de definições da disciplina — também está desenvolvendo sua própria versão do jogo. Parceria de código (modalidade A): comparar as decisões de implementação entre os dois projetos.
A ser preenchido pelo Ricardo, com foco nas diferenças percebidas no código entre as duas implementações (modalidade A) — por exemplo, escolhas de stack, estrutura do backend, física do jogo, modelagem do banco de dados.
Iniciei o projeto com pouca experiência prévia — apenas HTML e CSS soltos, sem contato com JavaScript —
e escolhi o Dino Game acreditando que seria fácil por causa do backend simples. A dificuldade real,
porém, esteve na lógica do jogo: minha maior virada de chave foi entender que o HTML/CSS criam a
estrutura prévia (como o <canvas id="game-canvas">) e o JavaScript apenas manipula esse elemento via
document.getElementById, quadro a quadro.
Para viabilizar o desenvolvimento, adaptei minha ideia inicial e trabalhei em conjunto com IA para estruturar tutoriais, analisar código e resolver problemas mais complexos — como debugar um erro 404 na Vercel, processo em que acompanhei e aprovei cada etapa. Ao mesmo tempo, mantive a mão na massa: estruturei o HTML, ajustei manualmente a física do pulo e da gravidade, e escrevi trechos de código de forma guiada.
Olhando para trás, hoje eu seguiria a dica da professora e escolheria algo como um formulário — a lógica em tempo real do jogo pesou mais do que eu esperava. Ainda assim, o processo foi uma descoberta valiosa e honesta sobre como construir e entender software.
1. Física do pulo — game.js
dino.velocityY += GRAVITY;
dino.y += dino.velocityY;
if (dino.y > GROUND_Y - dino.height) {
dino.y = GROUND_Y - dino.height;
dino.velocityY = 0;
}
Não existe nenhuma fórmula de parábola escrita à mão. A cada quadro, a gravidade é somada à velocidade
vertical, e a velocidade é somada à posição. O pulo (JUMP_FORCE = -5) só define uma velocidade inicial
negativa ("pra cima"); a gravidade puxa essa velocidade de volta pra positivo sozinha, quadro a quadro —
a curva de subida e descida do pulo emerge naturalmente desse laço, sem precisar calcular nenhuma
trajetória de antemão.
2. Colisão por retângulos (AABB) — game.js
function rectsOverlap(a, b) {
return (
a.x < b.x + b.width &&
a.x + a.width > b.x &&
a.y < b.y + b.height &&
a.y + a.height > b.y
);
}
Técnica Axis-Aligned Bounding Box: dois retângulos colidem se há sobreposição no eixo X e no eixo Y ao mesmo tempo — se estiverem separados em qualquer um dos dois eixos, não colidem. É por isso que dá pra desviar pulando: o pulo muda a posição Y bem na hora certa pra "escapar" da sobreposição, mesmo estando na mesma posição X do obstáculo.
3. Uso do Canvas para montar o jogo — game.js
const canvas = document.getElementById('game-canvas');
const ctx = canvas.getContext('2d');
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// nuvens, chao, dino, obstaculos — cada um desenhado na ordem de "fundo pra frente"
}
canvas é só um retângulo em branco no HTML, sem nenhum desenho embutido. ctx (contexto de desenho) é
o objeto obtido a partir dele que efetivamente sabe desenhar — retângulos (fillRect), imagens
(drawImage), linhas (stroke). O jogo inteiro é uma sequência de "fotografias" desenhadas do zero a
cada quadro: clearRect apaga o desenho anterior, e cada elemento é redesenhado na ordem certa (fundo
primeiro, personagem por último), sempre nas posições recém-calculadas por update(). É a repetição
disso ~60 vezes por segundo, via requestAnimationFrame, que cria a sensação de movimento contínuo a
partir de imagens estáticas.
@supabase/supabase-js) — banco de dados real, em uso atualmenteapi/[...path].js reexportando o app Express)Projeto entregue para a disciplina de Desenvolvimento de Software para a Web em 2026b