O desenvolvedor do jogo VVVVVV em homenagem a sua década tornou o código fonte aberto


Hoje é o 10º aniversário do lançamento do VVVVVV!

Embora, talvez, amanhã, estritamente falando, o jogo tenha sido disponibilizado às 3 da manhã GMT em 11 de janeiro de 2010, após um longo dia de eliminação de todos os erros que encontrei, criando montagens de última hora e tentando fazer upload lento de tudo para o servidor por uma Internet extremamente não confiável. um composto que estava constantemente quebrando. Mas eu sempre vivo com o lema " amanhã ele não veio até você acordar ", então considero a data real de lançamento em 10 de janeiro <3

Oh meu Deus, dez anos.

VVVVVV foi um jogo tão importante para mim que nem sei por onde começar. Eu queria marcar essa data de uma maneira especial, então hoje estou revelando o código fonte do jogo!

[Código-fonte VVVVVV no github]

O repositório contém duas versões - a de desktop , portada por Simon Roth para C ++ em 2011 , e a mais recente, atualizada e suportada por Ethan Lee , bem como a versão móvel escrita em Actionscript para Adobe AIR, com base na versão flash original do jogo v1.0 .

Quero dizer muito obrigado a Ethan Lee , que me ajudou muito, inclusive na preparação do repositório para a comunidade e na organização do anúncio no AGDQ (olá, corredores de velocidade!)! Obrigado Ethan!


Uma breve visão geral do código fonte


Aqui será lógico fazer a pergunta: “O que é interessante no código fonte do VVVVVV?” .

Eu acho que mesmo uma rápida olhada no código fonte, você pode entender rapidamente que tecnicamente o jogo VVVVVV não está muito bem pensado! Mesmo para os padrões de desenvolvedores independentes, o código é bastante caótico.

Notas / explicações potencialmente interessantes de por que tudo parece exatamente como é:

  • A versão C ++ tem um monte de coisas estranhas que só se tornam lógicas se você se lembrar de que o jogo foi criado primeiro em um flash e depois transportado diretamente com todas as suas falhas. Por exemplo, provavelmente meu pior hábito de programação é declarar variáveis ​​temporárias como i, j e k como membros de cada classe para que elas não precisem ser declaradas dentro de funções (o que é chato por um motivo chato). Isso levou ao aparecimento de vários erros desagradáveis e difíceis de capturar, para dizer o mínimo. Em particular, algumas funções de cálculo de colisões de entidades têm uma variável comum i . Portanto, loops infinitos são possíveis.
  • Se você está procurando textos de jogos, a maioria deles (mas não todos) está nas classes Scripts.cpp e TerminalScripts.cpp . Em essência, essas funções carregam dados em um analisador de script muito simples que controla a lógica da cena. Um fato engraçado: há muitos anos, os modders fizeram a engenharia reversa desse " script interno " para fazer coisas incríveis com níveis caseiros, cuja existência eu nem podia imaginar.
  • Em algum momento do processo de desenvolvimento, decidi que dividir o código em entrada, lógica e renderização era um bom hábito, e levei isso a sério. A parte principal do código crítico do jogo está em três arquivos - input.ccp , logic.cpp e nomeado incorretamente titlerender.cpp . Cada estado do jogo é empacotado nesses três arquivos com nomes de funções como teleporterrender e towerlogic . Há um monte de copiar e colar.
  • Todos os níveis são codificados nas enormes matrizes geradas no meu próprio editor de arquivos, que exporta os níveis para o código-fonte a partir do qual eu posso ler. Foi assim que trabalhei ao criar um jogo em flash em 2009 - o acesso a recursos de dados externos era uma tarefa difícil, então era mais lógico compilá-los no próprio jogo. Todos os arquivos realmente grandes (por exemplo, Spacestation2.cpp, Finalclass.cpp e assim por diante) foram criados dessa maneira. Para garantir a integridade, carreguei o código do editor aqui , mas, para ser sincero, ele não é particularmente aplicável agora (exige que Allegro e Mingw compilem). Para mudar o esquema dos últimos níveis, escrevi uma ferramenta semelhante!
  • Quando escrevi o código, não entendi realmente como as classes estáticas funcionam e por que o uso delas é uma boa ideia. Parece que li em algum lugar que classes estáticas e variáveis ​​globais são ruins em flash, então tentei evitá-las completamente. Qual é o resultado? Literalmente, todas as funções do jogo passam pelos seguintes argumentos: “Gráficos e dwgfx, Jogo e jogo, classe de mapa e mapa, classe de entidade e obj, UtilityClass e ajuda” .
  • De fato, não há objetos temporários no VVVVVV e, durante a primeira inicialização do jogo, ele preenche todas as suas matrizes de entidades (e a maioria das outras matrizes de dados) com centenas de entidades vazias. Faz isso porque li em algum lugar que a exclusão de objetos em um flash causa uma frenagem estranha, porque o coletor de lixo entra e deixa tudo mais lento, e isso é até certo ponto verdadeiro. Continuei a aderir a esse estranho hábito em novos projetos até recentemente - em Dicey Dungeons, finalmente o abandonei.
  • E mais uma coisa: junto com o analisador de cenas, eu tinha outra maneira de controlar a lógica do jogo durante a passagem - uma máquina monolítica de estados finitos, que no final do projeto estava completamente fora de controle! Ele pode ser encontrado em Game :: updatestate , e eu recomendo a leitura, mesmo que você não queira ler nenhum outro código. Ele gerencia aspectos como o início de cenas complexas, os pontos nos quais os teleportadores enviam teleporte, os tempos de animação de conclusão de nível e muitas outras coisas que eu queria inserir rapidamente no jogo. Os estados são numerados e o maior é 4099 (existem números não utilizados). Ao desenvolver o jogo, havia um bloco de notas ao meu lado, no qual estavam escritos os números mais importantes: o número 1.000 iniciou a seleção do “trinket brilhante”, o número 3.040 iniciou a conclusão de um nível específico, o número 3.500 iniciou o final do jogo. Esse sistema estúpido causou um ótimo jogo de velocidade em 50,2 segundos na categoria qualquer% .

Não sabe o que dizer sobre isso? Eu era jovem e era mais interessante para mim criar algo na tela do que implementá-lo corretamente. Provavelmente o melhor no código-fonte VVVVVV - tornou-se uma prova de que você mesmo pode criar algo, mesmo que não seja um programador muito bom.

Olhando para trás depois de todos esses anos, acho muito engraçado que, na maioria das vezes, tudo isso tenha sido uma cópia-pasta múltipla das mesmas partes com valores alterados. Por esse motivo, dez anos depois, o código é quase impossível de manter, mas enquanto eu estava no ponto mais alto, pude executar iterações muito rápidas e adicionar novos elementos. Na última década, desenvolvi melhores hábitos e, definitivamente, cresci muito como programador, mas agora parece que trabalho mais devagar por causa disso.


Festa surpresa de aniversário!


Enquanto eu me preparava para publicar o artigo, Sergio Kornaga anunciou um game jam em homenagem à década de VVVVVV!

10º aniversário de VVVVVV eVVVVVVent!

Estou muito feliz com isso, haha, e adoro os gloriosos naufrágios de trem, que realizavam atolamentos regulares do Klik of the Month, dos quais participava constantemente na época do desenvolvimento do VVVVVV. Parece ser perfeito para essa geléia!

Estou realmente ansioso para ver, depois do fim do congestionamento, o que as pessoas criarão e escreverei uma grande postagem no meu blog resumindo no estilo de postagens antigas sobre os níveis de usuários VVVVVV que uma vez escrevi <3

Mesmo antes de lançar o código-fonte do jogo, abri acesso gratuito a ferramentas para criar e concluir níveis de VVVVVV na versão de 2014 do Make and Play ! Você pode baixá-lo aqui! Se você estiver interessado em criar níveis no editor VVVVVV, poderá começar com este tópico ! Boa sorte



Um pouco de sentimentalismo


Eu já falei sobre como o VVVVVV evoca em mim - pouco antes do primeiro aniversário, escrevi o que experimentei quando o jogo saiu e como o sucesso dele mudou minha vida . No quinto aniversário, escrevi que o VVVVVV me parecia ser um projeto que acontece apenas uma vez na vida e que nada chegava perto nem antes nem depois.

Dez anos depois, ainda me sinto da mesma maneira. Estou incrivelmente orgulhoso VVVVVV e grato por tudo. Quero agradecer a todos que me ajudaram ao longo do caminho - Magnus por sua incrível trilha sonora, Ethan e Simon por todo o trabalho que disponibilizou o jogo para o público em geral, Bennett pelos nomes das salas, Stephen por ajudar a criar a montagem para Mac no dia do lançamento. Este jogo é especial para mim, obrigado a todos que o jogaram e me apoiaram por dez anos. Isso significa muito para mim. <3

Source: https://habr.com/ru/post/pt483518/


All Articles