Oyun Yapımı: Mobil Casual, Giydirme & Tarayıcı Oyunları
Fiyat aralığı: 1.000.000 – 2.150.000 ₺
(11 değerlendirme) 1510 görüntülenme
Oyunu bir yazılım ürünü gibi ele alıyorum: içerik hattı varlık taramasından üretiliyor, skor 0-100 aralığına normalize ediliyor, satın alma istemciye sorulmadan sunucuda platform imzasıyla doğrulanıyor. Çok dilli yayında RTL yerleşim ve seslendirme baştan hesaba katılıyor; çocuk kategorisinde satın alma kapısı ile reklam onayı ayrı mekanizmalar olarak kuruluyor.
HİZMET 6: Oyun Yapımı: Mobil Casual, Giydirme & Tarayıcı Oyunları
Bir oyunun maliyeti kod satırıyla değil, oynanabilir hâle gelene kadar biriken kararlarla belirlenir: kaç varyant çizilecek, skor neye göre verilecek, satın alma sunucuda mı doğrulanacak, çocuk kullanıcı varsa hangi ekran hangi kapının arkasında duracak. Bunların hiçbiri motor seçmekle çözülmez. Ben oyunu bir yazılım ürünü gibi ele alıyorum: içerik hattı, skor matematiği, sunucu doğrulaması ve yayın uyumu tek bir mühendislik problemi olarak kuruluyor.
Bu kalem tek fiyatla anlatılamıyor, bu yüzden aralık olarak veriliyor. Basit bir tarayıcı oyunu ile çok dilli, mağazada yayınlanan, satın alma doğrulaması ve çocuk uyumu gereken bir yapım arasında kat kat fark var. Aşağıdaki sayıların hepsi yayınlanmış kendi oyunumdan ve sitemde çalışan oyun hub'ından ölçüldü.
Yapım Hattı – Yüksek Seviye Akış
| Tasarım Döngü, ilerleme, başarısızlıksız mekanik |
İçerik Hattı Varyant üretimi, paketleme, normalize etme |
İstemci Sahne, animasyon, yerel-öncelikli kalıcılık |
Sunucu Skor, satın alma doğrulama, sıralama |
Yayın Mağaza uyumu, yaş sınıfı, ölçüm |
Neden Bu Hizmet?
Casual oyun yapımında en sık görülen hata, işin görselden ibaret sanılmasıdır. Oysa oyunu ayakta tutan şey görünmeyen taraftır: varyantların elle sayılmadan üretilmesi, skorun tutarlı olması, satın almanın istemciye sorulmaması, ve mağazanın çocuk politikalarına uyulması. Bunlar sonradan eklenmez; sonradan eklenmeye çalışıldığında yeniden yazılır.
| Geleneksel Yaklaşım | Benim Yaklaşımım |
|---|---|
| Varyant sayıları koda elle yazılır | Varlık taramasından üretilir; içerik büyüdükçe liste kendiliğinden güncellenir |
| Skor "hissiyata göre" ayarlanır | Kategori başına puan tavanı kodda sabittir, 0-100 aralığına normalize edilir |
| Satın alma istemcinin beyanına göre verilir | Fiş sunucuda platform imzasıyla doğrulanır, tekrar kullanılamaz |
| Yerelleştirme yayından sonra düşünülür | Metin ad alanlarına bölünür; RTL ve seslendirme baştan hesaba katılır |
| Ekran taşmaları cihazda elle denenir | Her ekran cihaz genişlikleri matrisinde otomatik açılır; yeni ekran testi kırar |
| Çocuk uyumu bir onay kutusudur | Satın alma kapısı ile reklam onayı ayrı mekanizmalardır; ikisi karıştırılmaz |
Mimari Yaklaşımım
1) İçerik Hattını Otomatikleştirmek
Giydirme oyununda içerik hızla büyür: her manken, her kategori, her renk varyantı çarpan etkisi yaratır. Bu sayılar koda elle yazılırsa ilk içerik güncellemesinde yanlışa döner. Bu yüzden varyant tabloları varlık taramasından üretilip koda gömülür — sayı bir insanın hatırladığı değil, diskteki dosyaların ölçüsüdür.
Sprite tarafı da normalize edilir: tek biçime çevrilmiş, paketlere bölünmüş bir kütüphane hem yükleme süresini hem de paket boyutunu öngörülebilir kılar.
2) Skoru Matematiğe Bağlamak
Bir kombin skoru "güzel göründü" ile verilemez; oyuncunun ilerlemeyi anlaması için kuralın tutarlı olması gerekir. Skorlama ayrı bir katmandır: serbest modda dört kategoriden, yarışma modunda tema uyumu eklenerek beş kategoriden puan toplanır ve sonuç 0-100 aralığına normalize edilir. Üzerine kademeli bir nadirlik çarpanı biner.
Bu ayrım önemli: iki modun kategori sayısı farklı olduğu için ham puanlar doğrudan karşılaştırılamaz. Normalizasyon olmadan yarışma sıralaması sessizce bozulur.
3) Satın Almayı Sunucuda Doğrulamak
İstemci "satın aldım" diyorsa bu bir beyandır. Doğrulama sunucuda, platformun kendi imzasıyla yapılır; doğrulanan işlem atomik bir kayıtla yazıldığı için aynı fiş ikinci kez ya da başka bir hesapta kullanılamaz.
Hata durumları ayrıştırılır: gerçekten geçersiz bir fiş ile yapılandırma hatası engellenir, geçici ağ ya da sunucu hatasında ise oyuncu mağdur edilmez. Bu ayrım yapılmazsa ya sahtekârlık geçer ya da parasını ödeyen oyuncu ürününü alamaz.
4) Yayın Uyumunu Baştan Kurmak
Çocuk kategorisinde yayın yapan bir oyunda satın alma ve reklam ayrı mekanizmalardır. Satın alma girişi, dışına dokunarak kapatılamayan bir ebeveyn doğrulamasının arkasındadır: rastgele üretilen bir toplama sorusu, yanlış cevapta yeni soru, geçen doğrulama kısa süre önbellekli.
Reklam tarafında ise koruma farklıdır: reklam bileşeni başlatılmadan önce onay akışı çalışır ve istekler çocuğa yönelik muamele bayrağıyla gönderilir. Bu ikisini aynı kapının arkasında sanmak, denetimde en sık düşülen hatadır.
Sağladığım Çözümler
| Çözüm Alanı | Ne Sağlıyorum? |
|---|---|
| Mobil casual yapım | Flutter + Flame ile istemci, yerel-öncelikli kalıcılık, bulut senkronu |
| İçerik hattı | Varlık taramasından varyant üretimi, paketleme, normalize edilmiş sprite kütüphanesi |
| Skor ve ilerleme | Kategori bazlı puanlama, normalize sonuç, nadirlik çarpanı, sıralama |
| Sunucu tarafı | Satın alma doğrulama, sıralama kovaları, tekrar kullanım koruması |
| Yerelleştirme | Çok dilli metin, RTL yerleşim, dil başına seslendirme hattı |
| Tarayıcı oyunları | Bağımlılıksız JavaScript, ağır hesabın Web Worker'a taşınması, üyeliksiz sıralama |
Yayınlanmış Oyunumdan Ölçülen Sayılar
Aşağıdakiler teklif metni için üretilmiş tahminler değil; mağazada yayınlanmış kendi oyunumun ve sitemde çalışan oyun hub'ının kodundan ölçülmüş değerlerdir.
| Bileşen | Ölçü | Ne Anlama Geliyor? |
|---|---|---|
| İstemci kod tabanı | 395 dosya / 154.978 satır | 79 servis ve 10 durum sınıfına bölünmüş; kalıcılık yerel-öncelikli, bulut senkronu ayrı katmanda |
| Gardırop içeriği | 918 parça / 11 manken | 14 kategoriye bölünmüş; 4 evcil hayvan paketi 193 parça daha ekliyor |
| Varlık kütüphanesi | 14.081 sprite / 23 paket | Renk varyantı sayıları elle yazılmıyor; taramadan üretilen 1.134 girdi koda gömülüyor |
| Skorlama motoru | 15 dosya / 1.583 satır | Serbest modda 4×25, yarışmada 5×20 puan; 0-100'e normalize, üstüne 5 kademeli nadirlik çarpanı |
| Sunucu tarafı | 15 fonksiyon / 2.770 satır | Satın alma platform imzasıyla doğrulanıyor; 629 satırlık doğrulayıcı, atomik kayıt tekrarı engelliyor |
| Yerelleştirme | 51 dosya / 17 ad alanı | Üç dil; anahtar sayıları 6.342 / 6.333 / 6.567 — Arapça dahil, RTL yerleşimiyle |
| Seslendirme | 90 dosya / dil başına 30 | 22 rehberli tur ve 8 tepki hattı; her dil sabitlenmiş tek bir sese bağlı |
| Test ve cihaz matrisi | 3.857 test / 420 dosya | 43 ekranın tamamı 13 cihaz genişliğinde açılıyor; deftere girmemiş yeni ekran testi kırıyor |
| Tarayıcı oyunları | 8 oyun / 6.950 satır | Sıfır dış bağımlılık, motor yok; ağır hesap iki Web Worker'a taşındı |
Fiyat Neden Aralık?
Bu kalemde tek bir rakam vermek dürüst olmazdı. Alt uç, tek dilli ve mağaza dışı bir yapımı; üst uç ise çok dilli, seslendirmeli, satın alma doğrulaması ve çocuk uyumu gereken bir mağaza yapımını karşılar. Aradaki farkı üreten kalemler şunlardır:
| Kapsam Kalemi | Maliyeti Neden Değiştirir? |
|---|---|
| Varyant sayısı | Sanat maliyeti çarpan etkisiyle büyür; manken × kategori × renk doğrudan bütçeye yansır |
| Dil sayısı ve RTL | Sağdan sola yerleşim bir çeviri işi değil, arayüz mühendisliğidir; her ekran yeniden doğrulanır |
| Seslendirme | Dil başına replik üretimi, ses tutarlılığı ve dosya yönetimi ayrı bir hat gerektirir |
| Satın alma ve sunucu | Platform imzası doğrulama, tekrar koruması ve hata ayrımı bağımsız bir bileşendir |
| Çocuk kategorisi uyumu | Ebeveyn kapısı, reklam onayı ve mağaza politikası denetimi ek tasarım ve test yükü getirir |
Kullandığım Teknolojiler
Flutter ve Flame, Dart, yerel-öncelikli kalıcılık ve bulut senkronu, sunucusuz fonksiyonlar, StoreKit ve Play Developer API ile satın alma doğrulama, ARB tabanlı yerelleştirme, nöral seslendirme hattı, bağımlılıksız JavaScript ve Web Worker, otomatik ekran taşma matrisi.
Bilerek Yapmadıklarım
| Karar | Gerekçe |
|---|---|
| Tarayıcı oyunlarında motor kullanılmaz | Bu ölçekte motor, yükleme süresi ve bağımlılık yüzeyi getirir; karşılığında bir şey kazandırmaz |
| Sıralama için üyelik istenmez | Kimlik yerel bir tanımlayıcıdır; toplanmayan veri sızmaz |
| Başarısızlık mekaniği kurulmaz | Küçük yaş grubunda kaybetme döngüsü oyunu bırakma sebebidir; ilerleme cezasız tasarlanır |
| Reklam ile satın alma aynı kapıya bağlanmaz | İkisi farklı mevzuata tabidir; tek kapı sanmak denetimde en sık düşülen hatadır |
Proje Çıktıları
| Teslimat | Açıklama |
|---|---|
| Oynanabilir yapı | Ana döngü, ilerleme ve kalıcılık çalışır hâlde; cihazda test edilebilir sürüm |
| İçerik hattı | Varlık taramasından varyant üretimi; içerik büyüdüğünde elle bakım gerektirmez |
| Sunucu bileşeni | Skor, sıralama ve satın alma doğrulama uçları; tekrar kullanım koruması |
| Yayın paketi | Mağaza görselleri, yaş sınıflandırması, gizlilik formu ve politika uyum kontrolü |
| Test altyapısı | Ekran taşma matrisi ve sunucu testleri; yeni ekran eklendiğinde kapsam kendiliğinden zorlanır |
Kime Uygun?
Bir oyun fikrini mağazada yayınlanabilir bir ürüne çevirmek isteyen; mevcut oyununda skor tutarsızlığı ya da satın alma sahteciliği yaşayan; çok dilli yayına çıkmak isteyip RTL tarafında zorlanan; çocuk kategorisinde yayın yapacağı için politika uyumundan emin olması gereken; ya da sitesine gerçek oynanan hafif oyunlar eklemek isteyen ekipler için uygundur.
Neden Ben?
Yukarıdaki sayıların hepsi yayınlanmış kendi oyunumdan ölçüldü — varyant sayısı da, skor tavanları da, test sayısı da. Oyunu yalnız yazmadım; mağaza sürecinden, çocuk politikası denetiminden ve üç dilli yayından da geçirdim. Anlattığım her mekanizmanın çalışan bir karşılığı var.
Bunun bir yan faydası şu: hangi kararın maliyeti nereden çıkardığını tahminle değil, yaşayarak biliyorum. Fiyat aralığının alt ve üst ucunu ayıran kalemleri yukarıda tek tek yazmamın sebebi de bu.
Sonuç
Oyun yapımı görsel bir iş değil, kararların biriktiği bir mühendislik işidir. İçerik hattı otomatik değilse ilk güncellemede bozulur; skor normalize değilse sıralama sessizce yanlışlar; satın alma sunucuda doğrulanmıyorsa gelir sızar. Amaç oynanabilir bir yapı çıkarmak değil, büyüdüğünde ayakta kalan bir yapı çıkarmak.