5 poin oleh GN⁺ 2024-08-05 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-08-05
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

    • Cross Code adalah game yang luar biasa, dan penggunaan teknologi web di dalamnya terasa mengesankan
    • Saya pikir engine ini mungkin telah berkontribusi pada performa tinggi di perangkat keras Nintendo Switch
  • "Thoughts on Flash" mungkin saja telah menyelamatkan platform web

    • Mungkin ada rasa frustrasi terhadap Adobe yang menyerah dalam mendukung platform MacOS
    • Versi Mac selalu tertinggal dibanding versi Windows
    • Jobs mungkin berpikir bahwa Adobe tidak akan ada tanpa Apple
  • Gamenya terlihat sangat rapi

  • high_impact bukan "library", melainkan "framework"

    • Logika bisnis harus ditulis di dalam framework
    • Framework sering digambarkan secara negatif sebagai "library" yang tidak cocok dipadukan dengan hal lain
    • Menyenangkan mendengar penyebutan yang positif
  • 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

    • Saya masih menyukai bahasa C, dan itu adalah bahasa pertama yang saya pelajari
    • C adalah bahasa yang ringkas, tetapi bisa digali sangat dalam
    • Gamenya memberi nuansa seperti Commander Keen, dan saya menyukai franchise itu
  • 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

    • Rasanya istimewa hanya dengan melihat hal seperti ini
  • Sebagai salah satu dari 3000 pemegang lisensi, saya senang melihat kebangkitan Impact

    • Saya penasaran apakah ini cocok dipadukan dengan Zig
  • Terlihat seperti game engine yang hebat

    • Saya penasaran mengapa artikel itu menyebut umurnya hampir habis
    • Saya penasaran apakah ada engine baru yang lebih baik