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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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çãoREADME 전문 보기 ↗
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