
Dalam posting ini, saya akan membagikan bagaimana saya membawa game Flash Frog Fractions ke platform modern. Akibatnya, saya membuat port yang sebagian otomatis di Unity menggunakan Haxe. Postingan ini akan menarik bagi siapa saja yang mencoba meningkatkan basis kode mereka ke Flash. Postingan tersebut akan berisi spoiler tentang struktur Frog Fractions: Game of the Decade Edition dan DLC Hop's Iconic Cap .
Setelah Frog Fractions 2 gagal membuat saya kaya, saya menghabiskan sekitar satu tahun melakukan pekerjaan kontrak dan membuat sketsa / prototipe . Kemudian istri saya hamil, dan saya memutuskan sudah waktunya untuk mencari pekerjaan nyata agar saya dapat menghidupi keluarga saya. Sebelum dimulainya GDC 2018, sayamemposting tweet tentang mencari pekerjaan , berharap menemukan orang yang tepat di konferensi. Saya diwawancarai di beberapa lokasi, tetapi yang terpenting adalah saya bisa mendapatkan dana untuk proyek saya selanjutnya.
Proyeknya seperti ini: sembunyikan game Frog Fractions berikutnya di dalam Frog Fractions 1 dan jual di Steam.
Frog Fractions kira-kira 13k baris kode di Actionscript 3 dan dibuat menggunakan compiler Flex. Saya pikir setelah menambahkan konten remaster baru, volumenya akan tiga kali lipat, menjadi sekitar 40k baris kode. (Dan perkiraan saya ternyata cukup akurat - ternyata kode 28k C # dan 3k baris skrip untuk cutscene / pohon dialog selain dari game aslinya.)
Saya mempertimbangkan beberapa kemungkinan opsi untuk pekerjaan lebih lanjut:
- 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 , .
Saya ingin menekankan di sini bahwa semua pendekatan ini didasarkan pada fakta bahwa Frog Fractions pada dasarnya adalah program yang saya tulis untuk dikompilasi ke SWF. Saya tidak dapat menilai bagaimana solusi saya dapat diterapkan pada game Anda, jika itu adalah garis waktu animasi Flash, interaktivitasnya disediakan oleh skrip.
Saya bertanya-tanya untuk meminta nasihat tentang bagaimana untuk maju, dan yang paling berguna diberikan kepada saya oleh Lars Duset, yang antara lain mengatakan bahwa Haxe memiliki backend C # dan platform targetnya adalah Unity. Dia juga menyarankan saya untuk terlebih dahulu membuat alur kerja dan membuat proyek kecil menggunakannya.
(Catatan untuk saya sendiri: Tambahkan Lars Dusset ke kredit permainan. Saya tidak bisa membayangkan seberapa besar pengaruhnya terhadap proyek sampai saya membaca kembali korespondensi kami.)
Setelah seminggu bereksperimen, saya dapat menjalankan Frog Infarctions (game yang saya tulis untuk jam permainan 0 jam Sosa Sosovski) di editor Unity. Hasilnya memang belum sempurna, tapi cukup memahami kelayakan implementasinya, maka saya mulai mengerjakan proyek utamanya.
Beginilah alur kerja saya berubah. Operasi ini harus dilakukan sekali:
- Gunakan as3hx untuk mengubah kode dari AS3 ke Haxe.
- Jika perlu, bersihkan kode as3hx yang dibuat secara manual.
Setelah itu, lakukan operasi berikut secara berulang:
- Port basis kode Anda ke Haxe untuk menggunakan Unity API, bukan Flash API.
- C#- Haxe Haxe C#. Haxe, UnityEngine.dll, API hx. Assembly-Csharp.dll C#, .
- Unity.
Minggu pertama pekerjaan sangat membosankan, Anda harus membersihkan ekspresi yang ditandai as3hx sebagai tidak konsisten, memperbaiki kesalahan kompilator yang ditambahkannya dan menangani panggilan I / O. Memperbaiki bug di Haxe tidaklah sempurna, jadi ada sekitar 30 kesalahan setiap kali saya mencoba membangun, tidak peduli seberapa keras saya mencoba, jadi saya tidak tahu seberapa dekat dengan penyelesaian sampai semuanya terkompilasi tanpa kesalahan. Juga, menurut saya as3hx adalah penerjemah pencarian dan penggantian, dan bukan transpiler nyata dengan terjemahan ke dan dari AST, karena tampaknya menambahkan kesalahan seperti menempatkan kode di sisi yang salah dari tanda kurung ketika di my kontrol aliran menggunakan gaya tanda kurung tertentu.
Setelah selesai, saya mendapatkan basis kode Haxe yang berhasil dikompilasi ke target C #. Setelah itu, saya tidak pernah menyentuh kode AS3. (Kecuali untuk proses ekspor aset grafis yang dijelaskan di bawah ini.) Pada titik ini, saya memutuskan untuk membuang Haxe dan hanya bekerja di C #, tetapi meskipun keluaran as3hx sangat mirip dengan kode aslinya, dengan tetap mempertahankan gaya brace, urutan kode, dan komentar, keluaran dari Haxe adalah C # jelas tidak dimaksudkan untuk mata manusia. Jadi mulai sekarang, jika saya tidak membuat adegan baru, saya mengedit kode Haxe dan mengkompilasinya di C #.
Pada titik ini, kode telah dikompilasi dan dijalankan di mesin Unity, tetapi tanpa I / O. Langkah selanjutnya adalah membuat ulang semua kode I / O menggunakan Unity API. Ini dan konversi sumber daya memakan waktu sekitar empat bulan, terutama karena ada banyak jenis sumber daya yang berbeda di Fraksi Katak:
- Grafik vektor digambar di editor Flash. Saya merendernya sebagai 4k, memaksa AIR untuk membangun game aslinya, tetapi tidak lebih dari merender bingkai animasi dan menulisnya ke file PNG. Kemudian, dengan menggunakan TexturePacker, saya mengumpulkannya menjadi sprite sheets.
- , 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.

Semua yang ada di remaster kecuali untuk shader layar penuh dan pemutaran video, dan sebagian besar cerita baru dirender menggunakan panggilan Graphics.DrawMesh, bukan sebagai objek dalam grafik adegan Unity. Jadi pertanyaannya adalah, apakah Unity benar-benar cocok untuk proyek ini?
Sementara Craig Tympani dan saya memilih mesin untuk Glittermitten Grove , kami memilih Unity karena dukungan lintas platformnya yang bagus, karena FNAbelum siap, dan karena membuat mesin sendiri adalah cara yang bagus untuk tidak pernah menyelesaikan game. Akhirnya, meskipun saya sedih dengan dukungan 2D yang buruk di Unity, ini memungkinkan kami untuk merilis versi untuk Mac dan Linux hampir tanpa masalah, yang menurut saya merupakan kesuksesan besar. (Agaknya, dukungan 2D di Unity telah meningkat sejak 2015, tetapi saya belum mempelajarinya. Graphics.DrawMesh berfungsi dengan baik untuk saya. Mungkin bahkan FNA sekarang memiliki pipeline pemrosesan resource yang berfungsi!)
Untuk project ini, saya memilih Unity terutama dengan inersia - Saya tidak ingin repot mempelajari mesin baru, karena saya harus melaksanakan proyek penelitian yang dijelaskan di atas; Unity mendukung semua platform yang saya inginkan untuk mentransfer game, termasuk konsol.
Oh, lalu saya membuat game tambahan! Saya mungkin akan membahas proses kreatif ini di posting lain, di sini saya hanya akan menyebutkan bahwa saya menyusun adegan transisi di Haxe dan menulis sisa game baru di C #. Selain itu, saya membuat perubahan signifikan pada menu utama di dalam basis kode Haxe. Oleh karena itu, menurut saya sangat mungkin, setelah porting ke Haxe, untuk terus merilis pembaruan kode dengan melakukan pengembangan di Haxe.
Saya juga melakukan beberapa pengoptimalan pada kode asli. Kode AS3 sengaja ditulis tanpa pertimbangan efisiensi karena saya berusaha menghindari perjuangan untuk "kode tanpa cacat". Misalnya, saya tidak percaya saya bisa lolos dengan mengalokasikan Vector2 untuk heap pada setiap operasi aritmatika! Hasil yang dihasilkan bekerja dengan baik pada komputer tahun 2012, tetapi bagian berkinerja terburuk setelah transpilasi ganda menyebabkan beban yang signifikan, jadi untuk bekerja dengan baik pada PC modern saya harus menulis ulang beberapa kode dalam C # asli.
Perlu juga dicatat bahwa jika saya tidak berencana untuk memperluas ukuran game asli secara signifikan dan hanya mencoba menjaganya dari kematian bersama dengan Flash, maka OpenFL, AIR atau Ruffle mungkin akan menjadi pilihan yang lebih cerdas.
Merilis game itu seperti mengucapkan selamat tinggal padanya. Saya menikmati bekerja di Flash. Pada saat itu, itu adalah cara terbaik untuk menunjukkan game Anda kepada orang-orang dengan sedikit usaha dan sepertinya mereka akan hidup selamanya - SWF dari tahun 90-an masih bekerja dengan sempurna di Flash player terbaru, meskipun beberapa dekade telah berlalu. Menyaksikan dunia mencoba untuk pindah ke HTML5 ketika masih belum siap untuk itu menyiksa. (Dan sejujurnya, segalanya menjadi lebih buruk daripada lebih baik . Saya percaya bahwa browser tidak akan pernah menjadi platform yang dapat dimainkan lagi selama pemilik dua browser paling populer memiliki toko aplikasi telepon mereka sendiri.) Saya membuat remaster sebagian karena ini. bahwa ia ingin menjual game baru, tetapi juga karena keinginan yang tulus untuk mempertahankan bagiannya dalam sejarah game. Terima kasih telah kembali padanya bersamaku!