
Neste post, vou compartilhar como trouxe meu jogo em Flash Frog Fractions para a plataforma moderna. Como resultado, criei uma porta parcialmente automatizada no Unity usando Haxe. A postagem será do interesse de qualquer pessoa que esteja tentando atualizar sua base de código para Flash. O post conterá spoilers sobre a estrutura de Frog Fractions: Game of the Decade Edition e seu DLC Hop's Iconic Cap .
Depois que Frog Fractions 2 não me deixou rico, passei cerca de um ano fazendo contrato de trabalho e esboçando / prototipando . Então minha esposa engravidou e eu decidi que era hora de encontrar um emprego de verdade para poder sustentar minha família. Antes do início do GDC 2018, eupostou um tweet sobre a procura de emprego , na esperança de encontrar as pessoas certas na conferência. Fui entrevistado em várias localidades, mas o mais importante é que consegui financiamento para meu próximo projeto.
O projeto era assim: ocultar o próximo jogo Frog Fractions dentro de Frog Fractions 1 e vendê-lo no Steam.
Frog Fractions tem cerca de 13k linhas de código no Actionscript 3 e é construído usando o compilador Flex. Concluí que, depois de adicionar novo conteúdo de remasterização, o volume triplicaria, para cerca de 40 mil linhas de código. (E minha estimativa acabou sendo bastante precisa - resultou em 28k código C # e 3k linhas de cenas de script / árvores de diálogo além do jogo original.)
Considerei várias opções possíveis para trabalhos futuros:
- AS3 Adobe AIR. , :
- Frog Fractions 640x480. . 2012 , , 2020 Steam .
- Flex , 10k , . 40k ? ( , , .)
- Flash . AIR 2020 ? (, ! .)
- , - . , Scaleform (The Banner Saga, Road Not Taken), , Scaleform - 2020 . (, 2018 Autodesk Scaleform, — UI.)
- Flash VM -. Flash , . Ruffle. , ?
- C#/Unity. .
- : Flash, , Unity. , «-» . , , , Unity, Windows. ( , , , TCP- . Flash , , Unity, .)
- Haxe OpenFL. as3hx AS3 Haxe, OpenFL Flash API. OpenFL , .
Quero enfatizar aqui que todas essas abordagens foram baseadas no fato de que Frog Fractions era essencialmente um programa que escrevi para compilar em SWF. Não posso julgar como minha solução se aplica ao seu jogo, se é uma linha do tempo de animação em Flash, cuja interatividade é fornecida por scripts.
Pedi conselhos sobre como seguir em frente, e o mais útil me foi dado por Lars Dusset, que entre outras coisas disse que o Haxe tem um back-end C # e sua plataforma de destino poderia ser o Unity. Ele também me aconselhou a primeiro criar um fluxo de trabalho e transferir um pequeno projeto usando-o.
(Nota para mim mesmo: adicione Lars Doucet aos créditos do jogo. Eu não conseguia imaginar o impacto que ele teve no projeto até reler nossa correspondência.)
Depois de uma semana de experimentos, consegui rodar Frog Infarctions (um jogo que escrevi para Sosa Sosovski's 0-hour game jam ) no editor Unity. O resultado não foi perfeito, mas foi o suficiente para entender a viabilidade de implantação, então comecei a trabalhar no projeto principal.
É assim que meu fluxo de trabalho acabou. Essas operações devem ser realizadas uma vez:
- Use as3hx para converter o código de AS3 para Haxe.
- Se necessário, limpe manualmente o código as3hx gerado.
Depois disso, execute iterativamente as seguintes operações:
- Transfira sua base de código para Haxe para usar a API Unity em vez da API Flash.
- C#- Haxe Haxe C#. Haxe, UnityEngine.dll, API hx. Assembly-Csharp.dll C#, .
- Unity.
A primeira semana de trabalho foi muito tediosa, você teve que limpar as expressões que o as3hx marcou como inconsistentes, corrigir os erros do compilador adicionado e lidar com as chamadas de I / O. Consertar bugs no Haxe não é perfeito, então ocorriam cerca de 30 erros toda vez que eu tentava construir, não importa o quanto eu tentasse, então eu não tinha ideia de quão perto da conclusão até que tudo compilasse sem erros. Além disso, parece-me que as3hx é um tradutor de busca e substituição, e não um transpiler real com tradução de e para AST, porque parece adicionar erros, como colocar o código do lado errado dos parênteses quando em meu o controle de fluxo usa um estilo de chave específico.
Feito isso, obtive uma base de código Haxe que é compilada com êxito para um destino C #. Depois disso, nunca mais toquei no código AS3. (Exceto para o processo de exportação de ativos gráficos descrito abaixo.) Neste ponto, decidi abandonar Haxe e trabalhar apenas em C #, mas embora a saída de as3hx seja bastante semelhante ao código original, enquanto mantém o estilo de chave, ordem de código e comentários, a saída de Haxe é C # obviamente não se destina ao olho humano. A partir de agora, se não criei novas cenas, editei o código Haxe e compilei em C #.
Neste ponto, o código foi compilado e executado no mecanismo Unity, mas sem E / S. A próxima etapa foi recriar todo o código de E / S usando a API Unity. Isso e a conversão de recursos levaram cerca de quatro meses, principalmente porque existem muitos tipos de recursos diferentes em Frog Fractions:
- Gráficos vetoriais desenhados no editor Flash. Eu renderizei como 4k, forçando o AIR a construir o jogo original, mas não fazendo nada mais do que renderizar os quadros da animação e gravá-los em arquivos PNG. Então, usando um TexturePacker, eu os montei em folhas de sprite.
- , Flash Shape API. Flash , , Photoshop . . Unity . , , 9-slices, .
- SVG, OpenClipArt.org. , , .
- , Flickr. preserve details Photoshop, , 4k- , .
- . , . , 4k. , , — !
- . Flash- , Marching-Cubes . 4k, , . , .
- , .
- . 2015 Unboxing Story Unity API . 2018 . !
- . .wav .
- MP3 64kbps mono, , , Amazon S3, , OST.

Tudo na remasterização, exceto para os shaders de tela inteira e reprodução de vídeo, e a maior parte da nova história é renderizada usando chamadas Graphics.DrawMesh, não como objetos no gráfico de cena do Unity. Portanto, a questão é: o Unity é realmente a opção certa para este projeto?
Enquanto Craig Tympani e eu estávamos escolhendo o motor para Glittermitten Grove , optamos pelo Unity por causa de seu bom suporte multiplataforma, porque FNAnão está pronto ainda, e porque construir seu próprio motor é uma ótima maneira de nunca terminar um jogo. No final das contas, enquanto eu estava triste com o pobre suporte 2D no Unity, isso nos permitiu lançar versões para Mac e Linux quase sem problemas, o que na minha opinião é um grande sucesso. (Presumivelmente, o suporte 2D no Unity melhorou desde 2015, mas eu não o estudei. Graphics.DrawMesh funciona bem para mim. Talvez até FNA agora tenha um pipeline de processamento de recursos em funcionamento!)
Para este projeto, escolhi o Unity principalmente por inércia - Não quis me preocupar em estudar um novo motor, pois tive que implementar o projeto de pesquisa descrito acima; O Unity suporta todas as plataformas para as quais eu queria portar o jogo, incluindo consoles.
Ah, e então criei um jogo adicional! Provavelmente falarei sobre esse processo criativo em outro post, aqui mencionarei apenas que montei uma cena de transição em Haxe e escrevi o resto do novo jogo em C #. Além disso, fiz alterações significativas no menu principal dentro da base de código Haxe. Portanto, parece-me que é bem possível, após portar para o Haxe, continuar liberando atualizações de código fazendo o desenvolvimento no Haxe.
Também fiz algumas otimizações no código original. O código AS3 foi escrito deliberadamente sem eficiência em mente porque eu estava tentando evitar o esforço de um "código perfeito". Por exemplo, eu não conseguia acreditar que conseguiria alocar um Vector2 para o heap em cada operação aritmética! O resultado resultante funcionou bem em computadores de 2012, mas as partes de pior desempenho após a transpilação dupla causaram sobrecarga significativa, portanto, para funcionar bem em PCs modernos, tive que reescrever parte do código em C # nativo.
Também vale a pena notar que se eu não tivesse planejado expandir significativamente o tamanho do jogo original e estivesse apenas tentando evitar que morresse junto com o Flash, então OpenFL, AIR ou Ruffle seriam provavelmente uma escolha mais inteligente.
Liberar o jogo foi como dizer adeus a ela. Gostei de trabalhar em Flash. Na época, era a melhor maneira de mostrar seus jogos para as pessoas com o mínimo de esforço e parecia que eles viveriam para sempre - o SWF dos anos 90 ainda funciona perfeitamente no Flash player mais recente, embora décadas tenham se passado. Ver o mundo tentar mudar para o HTML5 quando ele claramente não estava pronto para isso foi doloroso. (E, francamente, as coisas pioram em vez de melhorar . Acredito que o navegador nunca será uma plataforma jogável novamente, desde que os proprietários dos dois navegadores mais populares tenham suas próprias lojas de aplicativos para telefone.) Criei um remasterizado em parte por causa disso. que ele queria vender um novo jogo, mas também por um desejo sincero de manter sua parte na história do jogo. Obrigado por voltar para ela comigo!