5 puan yazan GN⁺ 2024-08-05 | 1 yorum | WhatsApp'ta paylaş

high_impact: JavaScript oyun motorunu C’ye port etmek

Özet

  • high_impact, 2D aksiyon oyunları için küçük bir oyun motoru; C ile yazılmıştır ve Windows, Mac, Linux ile web için WASM olarak derlenebilir
  • 2010’daki JavaScript oyun motoru Impact’ten ilham almıştır ve MIT lisansı ile sunulur
  • Kaynak kodu: GitHub

Antik tarih

  • Nisan 2010’da Steve Jobs, "Thoughts on Flash" adlı açık mektubuyla iOS’ta Flash’ı desteklemeyeceğini duyurdu
  • Flash, web’de son derece önemli bir tarayıcı eklentisiydi ve birçok web sitesi Flash oyunları ile animasyonlara dayanıyordu
  • Android Flash’ı destekliyordu, ancak performansı iyi değildi; Apple’ın kararı da Flash’ın sonunu haber veren bir işaret oldu
  • Flash olmadan da JavaScript Canvas2D API kullanılarak web oyunu yapılabileceğini kanıtlamak için Biolab Disaster geliştirildi

Neden C?

  • C, basit ama derin bir dil ve oyun geliştirme için uygun
  • JavaScript MPEG1 çözücüsünü C’ye port etmek, VR uygulamaları ve görüntü ile ses formatları geliştirmek gibi çalışmalarla C’ye olan sevgisini yeniden keşfetti
  • Impact’i C ile yeniden yazmak eğlenceli bir alıştırma olacaktı

Konsept

  • high_impact, minimum kodla uygulanmıştır; tile map yükleme, oyun nesnesi oluşturma, güncelleme ve çizim işlevleri sunar
  • Fizik ve çarpışma algılamayı işler; basit sprite sheet animasyonu, metin çizimi, ses efektleri ve müzik oynatma özelliklerini içerir
  • high_impact bir kütüphane değil, bir framework’tür; iş mantığını kullanıcının yazması gerekir
  • SDL veya Sokol platform backend’i kullanılarak derlenebilir

Entity’ler

  • Tüm entity’ler aynı entity_t yapısını paylaşır; konum, hız, boyut gibi özelliklere sahiptir
  • Makrolar aracılığıyla temel entity yapısı genişletilebilir
  • Her entity türü, fonksiyon işaretçileri sağlayan bir entity_vtab_t sunmalıdır
  • En fazla 64k aktif entity işlenebilir

Çarpışma algılama ve tepki

  • Tile map ile çarpışma hesaplanarak tam çarpışma noktası bulunur
  • Entity’ler arası çarpışmalar ayrı ele alınır ve her entity diğer entity’lerle nasıl çarpışacağını tanımlar

Render

  • OpenGL ve yazılımsal renderer sunar
  • Tüm render işlemleri tek bir fonksiyon çağrısıyla yapılır ve texture atlas kullanılarak texture’lar birleştirilir

Ses

  • Ses çıkışı SDL2 veya Sokol kullanılarak işlenir
  • Sabit sayıda kaynak yüklenebilir ve sabit sayıda ses çalınabilir
  • Sesler otomatik olarak serbest bırakılır ve yeniden kullanılabilir

Bellek yönetimi

  • Bellek, tek bir byte dizisi olan "hunk" ile yönetilir
  • Bellek ayırmak için bump allocator ve temp allocator kullanılır
  • Bellek serbest bırakma işlemi otomatik yürütülür; bu sayede kullanıcının bellek yönetimiyle uğraşması gerekmez

Seviye editörü

  • Orijinal Impact seviye editörü "Weltmeister" dahildir
  • JavaScript ile yazılmıştır ve modern tarayıcı özellikleri kullanılarak güncellenmiştir
  • Dosya sistemi API’si ile dosya yükleme ve kaydetme yapılır

Demo oyunlar

  • high_impact’in yeteneklerini doğrulamak için Biolab Disaster ve Drop adlı iki oyun C’ye port edildi

Genişletilebilirlik

  • high_impact geleneksel bir oyun motorudur; oyuna özel kod ayrıca yazılır
  • Platform ve renderer, başka sistemleri destekleyecek şekilde genişletilebilir

GN⁺ Özeti

  • high_impact, C ile yazılmış bir 2D oyun motoru ve basit ama güçlü özellikler sunuyor
  • JavaScript oyun motoru Impact’in halefi olarak çeşitli platformlarda çalışabiliyor
  • Bellek yönetimi ve çarpışma algılama gibi oyun geliştirme için gerekli temel işlevleri sade biçimde uyguluyor
  • Seviye editörü ve demo oyunlarla gerçek kullanım örnekleri sunuyor
  • Unity veya Unreal gibi büyük motorlara kıyasla daha hafif ve sade projeler için uygun

1 yorum

 
GN⁺ 2024-08-05
Hacker News görüşleri
  • Birçok web oyunu Impact oyun motoruyla yapıldı ve Cross Code, Eliot Quest, XType Plus gibi ticari çapraz platform oyunlarının temelini oluşturdu

    • Cross Code harika bir oyun; web teknolojilerini kullanması etkileyiciydi
    • Bu motorun Nintendo Switch donanımında yüksek performans elde edilmesine katkı sağlamış olabileceğini düşünüyorum
  • "Thoughts on Flash" web platformunu kurtarmış olabilir

    • Adobe'un MacOS platformu desteğini bırakmasına dair bir hayal kırıklığı varmış gibi görünüyor
    • Mac sürümü her zaman Windows sürümünün gerisinde kalıyordu
    • Jobs, Adobe'un Apple olmadan var olamayacağını düşünmüş olabilir
  • Oyun çok temiz görünüyor

  • high_impact bir "kütüphane" değil, bir "framework"

    • İş mantığını framework'ün içinde yazmanız gerekiyor
    • Framework, diğer şeylerle iyi anlaşmayan "kütüphane" anlamında olumsuz bir şekilde ifade edilirdi
    • Bunun için olumlu bir ifade duymak güzel
  • Uzun zaman sonra HN hesabıma giriş yapıp Biolab Disaster'ı yeniden keşfetmiş olmaktan mutluyum

  • UNION kullanarak çok biçimli varlık veri yapıları oluşturmuş olması etkileyici

    • Hâlâ C dilini seviyorum; öğrendiğim ilk dildi
    • C özlü bir dil ama derinlemesine ustalaşılabiliyor
    • Oyun Commander Keen havası veriyor; o seriyi severdim
  • QOI kayıpsız dosya biçimi ile 7Zip'i birleştirince, kayıpsız PNG'den daha iyi performans veriyor

  • Bunun nedeni oyuncunun pil ömrüne saygı göstermek olabilir

  • Eğlenceli fikir, azami öğrenme değeri için açık kaynak, kusursuz uygulama, gösterişsiz ve net bir anlatım—harika bir katkı

    • Böyle şeyler görebilmek bile bir ayrıcalık gibi hissettiriyor
  • 3000 lisans sahibinden biri olarak Impact'in geri dönüşünü görmek beni sevindiriyor

    • Zig ile iyi anlaşıp anlaşmadığını merak ediyorum
  • Harika bir oyun motoruna benziyor

    • Yazıda neden neredeyse ömrünü tamamlamış gibi bahsedildiğini merak ediyorum
    • Daha iyi yeni motorlar olup olmadığını merak ediyorum