31 puan yazan GN⁺ 2023-11-26 | 1 yorum | WhatsApp'ta paylaş

Kodlamada Eğlenceyi Yeniden Bulmak: Oyun Geliştirerek Tükenmişliği Aşmak

  • Geliştirici topluluklarında sık görülen bir şikayet: kodlamaya olan tutkunun kaybolması
  • Tükenmişliği aşmak için bir ipucu: kodlamadan yeniden keyif almak adına kendi oyununu yapmak
  • Oyun geliştirerek programlamaya bağlanma üzerine kişisel deneyim paylaşımı
  • Oyun geliştirmek için Go dili ve Ebitengine kütüphanesinin kullanılması öneriliyor

Oyun geliştirmenin temel prensipleri

  • Filmlere benzer şekilde oyunlar, hızlı biçimde art arda gösterilen görüntülerin (frame) toplamıdır
  • Oyunlar görüntüleri gerçek zamanlı üretir ve kullanıcı girdisine göre bir sonraki frame'i değiştirir
  • Oyunlar temelde sonsuz bir döngüdür; görüntü çizme ve mantık güncelleme tekrar eder

Proje kurulumu

  • Go modülü oluşturma ve Ebitengine kütüphanesini ekleme
  • Oyun arayüzünün asgari düzeyde uygulanmasıyla boş bir pencere çalıştırma

Varlık yükleme

  • Programcı çizimleri kullanılması veya ücretsiz varlıklardan yararlanılması öneriliyor
  • embed paketi kullanılarak varlıkların koda yüklenmesi

Görsel çizimi

  • Tüm çizim işlemleri Draw metodu içinde gerçekleştirilir
  • ebiten.Image içindeki DrawImage metodu kullanılarak başka bir görselin üzerine görsel çizilir
  • DrawImageOptions yapısı üzerinden görselin konumu, dönüşü ve ölçeklendirmesi ayarlanır

Oyun mantığı

  • Game yapısı oyun durumunu tutar ve Update metodu ile durumu değiştirir
  • Örnek olarak oyuncunun konumu (X, Y) vektörü olarak tutulur

Hareket

  • Update metodunda oyuncunun konumu güncellenerek hareket uygulanır
  • Klavye girdisine göre oyuncunun konumu değiştirilir

Zamanlayıcı

  • Oyun içinde zamana bağlı mantık değişiklikleri için zamanlayıcı uygulanır
  • Timer yapısı kullanılarak belirli zaman aralıklarında olay tetiklenir

Oyun nesneleri

  • Oyuncu gibi oyun nesneleri kapsüllenerek yönetilir
  • Her nesnenin kendi Update ve Draw metodları vardır

Nesne oluşturma

  • Meteor nesneleri oluşturulur ve ekranın kenarlarından spawn edilir
  • Game yapısı meteor nesnelerini takip eder

Mermi ateşleme

  • Mermi ateşleme mantığı ve cooldown zamanlayıcısı uygulanır
  • Player mermi oluşturur ve Game bunları takip eder

Çarpışma algılama

  • Çarpışma algılaması için Rect yapısı ve Collider() metodu uygulanır
  • Oyunun Update kısmında nesneler arasındaki çarpışmalar kontrol edilir

GN⁺'un görüşü

Bu yazıdaki en önemli nokta, geliştiricilerin tükenmişliği aşmasına ve kodlamaya olan tutkusunu yeniden kazanmasına yardımcı olacak bir yol önermesidir. Oyun geliştirme, yaratıcı ve eğlenceli projeler üzerinden kodlama becerilerini pratik etme ve aynı anda yeni bir dil ya da kütüphane öğrenme fırsatı sunar. Bu yazı, geliştiricilere kodlamayı yeniden bir hobi olarak keyifle yaşayabilmeleri için ilham verirken, Go dili ve Ebitengine kütüphanesiyle oyun geliştirmeye yönelik temel yaklaşımı anlatarak ilgi uyandırıyor.

1 yorum

 
GN⁺ 2023-11-26
Hacker News görüşleri
  • İlk kullanıcı, yeni bir dil veya grafik API’si öğrenirken performans testi için havai fişek ya da basit bir parçacık simülasyonu yazmayı tercih ediyor. 2021’de Go ve Ebitengine ile deneme yaptığında, 60fps’de çok sayıda pikseli hareket ettirebilen etkileyici performans ve kullanım kolaylığından çok etkilenmiş.
  • İkinci kullanıcı, geçen yıl Go ile g3n-engine kullanarak oyun geliştirdiğini söylüyor. Go’yu sevdiği ve öğrenmek istediği için seçmiş; geçmişteki 2D oyun geliştirme deneyiminin ardından 3D çalışmak istediği için de g3n-engine’i tercih etmiş. Oyun yapmak, ücretli işlerden çok daha zorlayıcı ve ödüllendirici bir deneyim; ayrıca öğrenilecek şeyler hiç bitmiyor.
  • Üçüncü kullanıcı, Go için Ebiten API’sinin çok iyi olduğunu ve API tasarımında ilham verici olabileceğini belirtiyor. Ayrıca, Go’yu C++’a dönüştüren özel bir derleyici kullanarak oyun geliştirmede performansı artırdığını, C/C++ API’lerine erişim sağladığını ve WebAssembly’de de iyi performans sunduğunu söylüyor. Bu derleyici, Go kodundan GLSL üretmeye yönelik deneyleri de içeriyor.
  • Dördüncü kullanıcı, Go geliştiricisi olmadığını ama Go ile oyun yapan bir YouTuber/Twitch yayıncısını uzun süredir takip ettiğini söylüyor. Bu yayıncı Go ile küçük bir MMO geliştiriyor ve web sürümünü OpenGL ile WASM kullanarak hazırlıyor. Go’nun çöp toplayıcısının oldukça sağlam olduğunu düşündüğü hâlde, birçok kişinin hâlâ "neden Go ile yapılıyor?" diye sorduğunu belirtiyor.
  • Beşinci kullanıcı, sadece makalenin ilk kısmına yanıt vererek, yazarın anlattığı tükenmişliği yaşıyorsa hobiyi "yeniden fethetmeye" çalışmak yerine ilgi alanlarını geliştirmesini öneriyor. Bunun beynin durağanlaştığına dair bir işaret olabileceğini ve bunun programlamadan farklı bir şey olmak zorunda olmadığını, ama bilgisayar bilimi teorisine daha derin dalmanın zamanı gelmiş olabileceğini söylüyor.
  • Altıncı kullanıcı, birkaç yıldır Ebitengine kullanıcısı olarak memnun kaldığını söylüyor. Ebitengine ile yapılmış oyunların kaynak koduna bakmak isteyenlere awesome-ebitengine listesini öneriyor. Kendi itch.io profilinde listelenen tüm oyunların Ebitengine ile yapıldığını ve hepsinin açık kaynak olduğunu da ekliyor.
  • Yedinci kullanıcı, Ebitengine kullanarak oyun geliştirdiğini ve deneyimin ferahlatıcı geldiğini söylüyor.
  • Sekizinci kullanıcı, Go’nun büyük oyunlar yazmak için uygun bir platform olup olmadığını ve C# kullanmayı haklı çıkaracak kadar yeterli kütüphane ile performans sunup sunmadığını sorguluyor.
  • Dokuzuncu kullanıcı, Go’nun goroutine kavramı nedeniyle oyun yapmak için uygun bir dil olup olmadığını merak ettiğini ve bir gün denemeyi düşündüğünü söylüyor.
  • Son olarak, Ebitengine tabanlı bir oyundan bahsediliyor ve "Sprite bileşeni örneğinin nasıl görünebileceği" cümlesinin yarım kaldığı, bu nedenle düzeltilmesi gerektiği belirtiliyor.