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
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
"Thoughts on Flash" web platformunu kurtarmış olabilir
Oyun çok temiz görünüyor
high_impact bir "kütüphane" değil, bir "framework"
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
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ı
3000 lisans sahibinden biri olarak Impact'in geri dönüşünü görmek beni sevindiriyor
Harika bir oyun motoruna benziyor