high_impact: Mem-porting engine game JavaScript ke C
Ringkasan
- high_impact adalah engine game kecil untuk game aksi 2D, ditulis dalam C dan dapat dikompilasi untuk Windows, Mac, Linux, serta WASM untuk web
- Terinspirasi dari engine game JavaScript Impact dari tahun 2010, dan tersedia di bawah lisensi MIT
- Kode sumber: GitHub
Sejarah kuno
- Pada April 2010, Steve Jobs mengumumkan melalui surat terbuka berjudul "Thoughts on Flash" bahwa iOS tidak akan mendukung Flash
- Flash adalah plugin browser yang sangat penting di web, dan banyak situs web bergantung pada game serta animasi Flash
- Android memang mendukung Flash, tetapi performanya buruk, dan keputusan Apple menjadi sinyal dimulainya akhir Flash
- Biolab Disaster dikembangkan untuk membuktikan bahwa game web bisa dibuat tanpa Flash dengan menggunakan JavaScript Canvas2D API
Kenapa C?
- C adalah bahasa yang sederhana namun dalam, dan cocok untuk pengembangan game
- Setelah mem-porting decoder JavaScript MPEG1 ke C, mengimplementasikan VR, serta mengembangkan format gambar dan audio, kecintaan terhadap C kembali ditemukan
- Menulis ulang Impact ke dalam C akan menjadi latihan yang menyenangkan
Konsep
- high_impact diimplementasikan dengan kode seminimal mungkin, serta menyediakan pemuatan tile map, pembuatan objek game, pembaruan, dan rendering
- Ia menangani fisika dan deteksi tabrakan, serta mencakup animasi sprite sheet sederhana, rendering teks, efek suara, dan pemutaran musik
- high_impact adalah framework, bukan library, sehingga pengguna perlu menulis business logic sendiri
- Dapat dikompilasi menggunakan backend platform SDL atau Sokol
Entitas
- Semua entitas berbagi struktur
entity_t yang sama dan memiliki properti seperti posisi, kecepatan, ukuran, dan lain-lain
- Struktur entitas dasar dapat diperluas melalui macro
- Setiap tipe entitas harus menyediakan
entity_vtab_t yang berisi function pointer
- Dapat menangani hingga 64k entitas aktif
Deteksi dan penanganan tabrakan
- Tabrakan dengan tile map dihitung untuk menemukan titik tabrakan yang akurat
- Tabrakan antarentitas ditangani secara terpisah, dan setiap entitas mendefinisikan bagaimana ia akan bertabrakan dengan entitas lain
Rendering
- Menyediakan OpenGL dan software renderer
- Semua rendering dilakukan melalui satu pemanggilan fungsi, dan menggunakan texture atlas untuk menggabungkan tekstur
Suara
- Menggunakan SDL2 atau Sokol untuk menangani output suara
- Dapat memuat sejumlah sumber tetap dan memutar sejumlah suara tetap
- Suara dibuang otomatis sehingga bisa digunakan kembali
Manajemen memori
- Mengelola memori menggunakan "hunk", yaitu satu byte array tunggal
- Mengalokasikan memori dengan bump allocator dan temp allocator
- Pembebasan memori ditangani secara otomatis sehingga pengguna tidak perlu memikirkan manajemen memori
Editor level
- Menyertakan editor level Impact asli, "Weltmeister"
- Ditulis dalam JavaScript dan diperbarui dengan menggunakan fitur browser modern
- Menggunakan File System API untuk memuat dan menyimpan file
Game demo
- Dua game, Biolab Disaster dan Drop, di-port ke C untuk memverifikasi kemampuan high_impact
Ekstensibilitas
- high_impact adalah engine game tradisional, sehingga kode khusus game ditulis secara terpisah
- Platform dan renderer dapat diperluas untuk mendukung sistem lain
Ringkasan GN⁺
- high_impact adalah engine game 2D yang ditulis dalam C, dengan fitur yang sederhana namun kuat
- Sebagai penerus engine game JavaScript Impact, ia dapat berjalan di berbagai platform
- Fitur inti yang dibutuhkan untuk pengembangan game, seperti manajemen memori dan deteksi tabrakan, diimplementasikan secara sederhana
- Menyediakan contoh penggunaan nyata melalui editor level dan game demo
- Cocok untuk proyek yang ringan dan sederhana dibandingkan engine besar seperti Unity atau Unreal
1 komentar
Komentar Hacker News
Banyak game web dibuat dengan engine game Impact, dan menjadi dasar untuk judul komersial lintas platform seperti Cross Code, Eliot Quest, dan XType Plus
"Thoughts on Flash" mungkin saja telah menyelamatkan platform web
Gamenya terlihat sangat rapi
high_impact bukan "library", melainkan "framework"
Senang bisa masuk lagi ke akun HN setelah sekian lama dan menemukan kembali Biolab Disaster
Keren melihat penggunaan UNION untuk membuat struktur data entitas polimorfik
Menggabungkan format file lossless QOI dengan 7Zip menghasilkan performa yang lebih baik daripada PNG lossless
Mungkin untuk menghormati daya tahan baterai pemain
Ide yang menarik, open source untuk nilai pembelajaran maksimal, eksekusi yang sempurna, tulisan yang jelas tanpa kesan pamer—kontribusi yang hebat
Sebagai salah satu dari 3000 pemegang lisensi, saya senang melihat kebangkitan Impact
Terlihat seperti game engine yang hebat