Pular para os jogos
Hadukis

Blog

Por que nossos fortes desabavam sozinhos

· 4 min de leitura

Um jogo de demolição com física tem uma promessa que vem antes de qualquer outra: a coisa que você está prestes a derrubar está de pé. Nas primeiras versões de ScaleSling, alguns fortes tremiam quando a fase carregava, e alguns simplesmente tombavam enquanto o jogador ainda estava alinhando o primeiro tiro.

É muito fácil culpar o motor de física por isso e começar a mexer em atrito e densidade até a tremedeira parar. Quase fizemos isso. Nenhuma das causas acabou sendo o motor.

Vinte e quatro pares de blocos, nascidos um dentro do outro

Cada fase é uma lista de blocos com posição e tamanho, e cada um desses números foi digitado à mão. Uma tábua de 42 pixels de largura colocada a 32 pixels da vizinha se sobrepõe a ela em dez. Na tela, dez pixels de sobreposição são invisíveis — os sprites só parecem estar encostados.

Dois corpos rígidos não podem ocupar o mesmo espaço. Logo no primeiro passo da simulação, o motor os encontra sobrepostos e os empurra para longe um do outro, com força. Esse empurrão era o que o jogador via como um tremor, e numa pilha alta bastava para derrubar tudo.

Um script que lê todas as fases encontrou 24 pares sobrepostos em 16 das 24 fases, com sobreposições de 3 a 11 pixels. Um segundo script separa cada par ao longo do eixo em que eles se sobrepõem menos (que é quase sempre o eixo em que o autor da fase queria que eles se encontrassem), metade da distância para cada um, em algumas passadas, para que corrigir um par não crie outro. Ele não mexe nos blocos girados, porque a área real ocupada por uma tábua inclinada não é a sua largura e altura.

Uma cerca sem um poste

Cinco fases compartilhavam uma cerca que tinha sido copiada de uma para a outra: uma viga de 130 pixels apoiada num único poste. O centro de massa dela ficava 39 pixels além do apoio. Ela tombava, toda vez, e caía 48 pixels antes de alguém encostar nela.

A primeira ideia foi deslizar a viga de volta para cima do poste. Tentamos, e isso empurrou a viga para dentro de uma viga mais longa ao lado, o que é pior. A viga não era longa demais; faltava à cerca o poste da ponta de lá. Acrescentá-lo corrigiu as cinco fases de uma vez.

Como sabemos que está corrigido

Jogar as fases e achar que pareciam boas não bastava. Agora existe uma verificação de estabilidade que carrega cada fase no motor de física real, não dispara nada, espera quatro segundos simulados e mede quanto cada bloco se moveu.

Antes das correções, seis fases desabavam sozinhas e o pior bloco se movia 48 pixels. Depois delas, nenhuma desaba, e o maior movimento em qualquer lugar é de 10 pixels — a acomodação normal de uma pilha encontrando o repouso. A verificação roda sem navegador, então roda toda vez que uma fase muda.

O bloco que saiu com metade da altura a mais

Uma das causas nem estava nos dados das fases. Uma tábua pedida com 26 por 88 pixels chegava ao mundo com 26 por 131. Um troll com raio de colisão de 27 tinha raio de 20.

O framework em que o jogo é construído escala o corpo físico de um objeto junto com a imagem. Declarar o corpo no tamanho certo e depois redimensionar o sprite para caber escalava o corpo uma segunda vez, pela razão entre o arquivo de imagem e o tamanho pedido. Nada imprimia um erro. As torres simplesmente ficavam vinte pixels acima do chão, e os tiros atravessavam coisas que pareciam sólidas.

A correção é dimensionar a imagem primeiro e depois substituir o corpo por um exato. O único jeito que encontramos de achar o problema foi medir os corpos diretamente em vez de ler o código, que parecia correto — e é assim que todo tipo novo de objeto é verificado agora.

Mais uma armadilha: as estrelas

Cada fase dá três estrelas com 95% do total de pontos do tabuleiro. Essa meta é gravada no arquivo da fase quando a fase é gerada, não calculada quando o jogo começa.

Quando os dirigíveis foram tirados de seis fases, cada uma perdeu 900 pontos de coisas para destruir — mas a meta de três estrelas continuava contando com eles. Seis fases que podiam ser completadas com perfeição viraram fases que não podiam, e a mudança parecia só um objeto apagado. Agora, qualquer edição no que está no tabuleiro de uma fase recalcula as estrelas dela na mesma mudança.

A lição geral

Uma estrutura caindo parece um problema de física, então convida a correções de física: mais atrito, blocos mais pesados, uma simulação mais lenta. Cada uma delas teria escondido os defeitos reais e deixado o jogo pior de acertar. As causas estavam nos dados (coordenadas digitadas, uma cerca copiada, um número desatualizado), e o que as encontrou foi medir, não ajustar.

Os fortes de ScaleSling agora ficam de pé até você derrubá-los. Tente derrubar um.