GlamUp Girls — Mobil Giydirme Oyunu (Flutter + Flame, TR/EN/AR)

Kendi ürünüm — bağımsız yayın

(73 değerlendirme) 8482 görüntülenme

11 manken, 918 gardırop parçası ve dört evcil hayvan paketiyle Google Play'de yayında olan bir giydirme oyunu: Flutter + Flame istemci, Firebase Cloud Functions üzerinde sunucu tarafı satın alma doğrulaması, üç dil ve Arapça sağdan sola yerleşimde göz kararıyla değil ölçülerek kapatılmış kusurlar. Nisan 2026'da başladı, 20 Ağustos 2026'da Play'de üretime çıktı; PEGI 3 sınıfında, çocuk kategorisi kurallarıyla.

Yapım değeri: 2.650.000 ₺ Potansiyel değer: 36.000.000 ₺

GlamUp Girls — Mobil Giydirme Oyunu

GlamUp Girls, mankenini seçip makyajını yaptığın, saçını ve kıyafetini belirleyip podyuma çıkardığın bir giydirme oyunu. 11 manken, 918 gardırop parçası, dört evcil hayvan paketi ve haftalık/aylık yarışmalar var; Türkçe, İngilizce ve Arapça konuşuyor, her dilde seslendirmesi var. İlk commit 7 Nisan 2026, Google Play'de üretime çıkış 20 Ağustos 2026. PEGI 3 sınıfında, Gündelik kategorisinde ve Play'in aile politikasına tabi.

Bu sayfada oyunu anlatmaktan çok nasıl yapıldığını anlatmak istiyorum. Casual bir oyunda görünen kısım (çizimler, animasyon) işin küçük parçası; asıl zaman içerik hattına, skor matematiğine, satın almanın sunucuda doğrulanmasına ve çocuk kategorisinin kurallarına gidiyor. Aşağıdaki sayıların hepsi depodan ölçüldü, tahmin değil.


Oyunda Ne Var

  • 👗 11 manken; her biri 15 kategoriye bölünmüş toplam 918 gardırop parçası
  • 🐾 4 evcil hayvan paketi (kedi, köpek, pony, unicorn), 193 parça
  • 🌟 Podyum skoru: serbest look 4 kategori, yarışma modu 5 kategori, 0-100 ölçeği
  • 🏆 Haftalık ve aylık yarışmalar, nadir parça koleksiyonu
  • 🌍 TR / EN / AR arayüz, Arapça sağdan sola yerleşim, her dilde seslendirme
  • 🛡️ Satın alma girişlerinde ebeveyn kapısı; reklam tarafında çocuğa yönelik muamele ve G içerik derecesi

Yapılan İş

İstemci Flutter + Flame ile yazıldı: lib/ altında 398 Dart dosyası ve 155.283 satır. İş mantığı 81 servis sınıfına, ekran durumu lib/store altındaki 10 sınıfa ayrılmış durumda. Kalıcılık, kullanıcı kimliğine kapsanmış SharedPreferences üzerinde yerel-öncelikli çalışıyor; bulut senkronu ayrı bir katmanda duruyor ki çevrimdışı oyun bozulmasın. Sunucu tarafı Firebase Cloud Functions: 15 callable fonksiyon, 2.770 satırlık bir index.js ve satın alma doğrulaması için 629 satırlık ayrı bir modül.

Öne Çıkan Sonuçlar

✅ 23 asset paketinde 14.081 normalize webp sprite; renk varyantı sayıları elle değil, asset taramasından üretilen 1.134 girdilik tabloyla koda giriyor

✅ Satın alma istemciye sorulmuyor: iOS'ta StoreKit 2 JWS imzası, Android'de Play Developer API ile sunucuda doğrulama; aynı fiş ikinci kez geçmiyor

✅ 43 ekranın tamamı 320-1024 dp arasında 13 cihaz genişliğinde taşma testinden geçiyor

424 test dosyasında 3.883 test vakası, Firestore/Functions tarafında 27 emülatör testi

✅ Arapça ekranda noktalama kayması ölçülerek kapatıldı (36,1 px); 261 satırlık bekçi testi regresyonu kilitliyor

İçerik Hattı

Gardırop 11 manken × 15 kategori şeklinde modellenmiş; 918 parça tanımının arkasında 23 asset paketi ve 14.081 normalize edilmiş webp sprite var. En çok zaman alan kısım renk varyantlarıydı. Başta sayıyı elle yazıyordum. Bir pakete parça eklendiğinde tablo eskiyor, oyun yanlış varyant sayısı gösteriyordu. Şimdi asset taraması 1.134 (paket, önek) girdisini üretip doğrudan koda gömüyor. Tablo eskiyemiyor, çünkü elle tutulan bir tablo artık yok.

Kombin Skorlama

Skorlama 15 dosyalık ayrı bir modül, 1.583 satır; altısı analizör. Serbest look dört kategoriden 25'er puan alıyor; yarışma modunda Tema Uyumu eklenip beş kategori 20'şer puanla 0-100'e normalize ediliyor. Üzerine beş kademeli nadirlik çarpanı biniyor: Common ×1,00'dan Legendary ×1,25'e. Bu sabitler yorum satırında değil kodda; bir tasarım kararı değiştiğinde tek yerden değişiyor.

Üç Dil ve Sağdan Sola Yerleşim

Arayüz metni 17 ad alanına bölünmüş 51 ARB dosyasında tutuluyor: İngilizce 6.342, Türkçe 6.333, Arapça 6.567 anahtar satırı. Dosyalar arası pariteyi ve Arapça sayfaya sızan İngilizce metni 27 ayrı i18n testi kontrol ediyor.

Asıl ders Arapça tarafındaydı. Kullanıcı adı gibi Latin metinler Arapça cümlenin içine girince ünlem ve nokta yanlış tarafa kayıyordu. Bunu göz kararı değil TextPainter ile ölçtüm: ünlem karakteri yalıtımsız x=0,0'da, Unicode FSI/PDI yalıtımıyla x=36,1'de çıkıyordu. Fark ölçüldükten sonra düzeltme küçük kaldı. Yeniden yaşanmasın diye 261 satırlık bir kaynak bekçisi testi, RTL'de sessizce yanlış tarafa çizen EdgeInsets.only, fromLTRB, Positioned ve TextAlign kullanımlarını sayıp simetrik olanları hariç tutuyor.

Seslendirme dil başına 30 replik: 22 rehberli tur, 8 tepki. Türkçe ve İngilizce edge-tts (tr-TR-EmelNeural, en-US-AvaNeural), Arapça Azure Speech (ar-EG-SalmaNeural). Her dil tek bir sese sabitlendi; karakterin sesi ekrandan ekrana değişmiyor.

Sunucu Tarafı ve Satın Alma

Satın alma doğrulaması istemcide değil sunucuda. iOS tarafında StoreKit 2'nin JWS imzası, Android tarafında Play Developer API kullanılıyor; doğrulanan işlem verified_purchases/{transactionId} altında atomik create ile yazıldığı için aynı fiş ne tekrar ne de başka hesapta geçerli. Hatalar üçe ayrılıyor: gerçekten geçersiz fiş ve yapılandırma hatası engelleniyor, geçici ağ veya 5xx durumunda fail-open. Bu son karar tartışmalı görünebilir. Ama ödeme yapmış bir çocuğu sunucu hıçkırığı yüzünden kapıda bırakmaktansa kısa süreli açık bırakmayı tercih ettim.

Çocuk Kategorisi ve Uyum

Uygulama içi satın alma girişleri, dışına dokunarak kapatılamayan bir ebeveyn doğrulama diyaloğunun arkasında: iki terimi de 12-19 arasından rastgele seçilen bir toplama sorusu (cevap 24-38), yanlış cevapta 600 ms sonra yeni soru, geçen doğrulama 15 dakika önbellekte.

Reklam tarafında bu kapı yok; bunu açıkça yazıyorum çünkü ilk taslakta öyle yazmıştım ve kod beni yalanladı. Reklamlar çocuğa yönelik muamele ve G içerik derecesiyle sınırlanıyor; SDK başlatılmadan önce Google UMP onay akışı 8 saniyelik zaman aşımıyla koşuyor.

Test Yüzeyi

424 test dosyasında 3.883 vaka; Firestore ve Cloud Functions tarafında 27 emülatör testi. Bunlara adı *_guard_test.dart olan 11 regresyon bekçisi ekleniyor: altısı diskteki kaynağı tarayıp bir kod desenini CI'da kilitliyor, beşi davranış üzerinden bekliyor. Taşma matrisi 43 ekranı 13 cihaz genişliğinde deniyor; ayrı bir kapsam testi ekran defterini diskteki *_screen.dart listesiyle karşılaştırdığı için deftere yazılmamış yeni ekran CI'ı kırmızıya çeviriyor.

Kartta Gördüğünüz İki Rakam
Bugünkü yapım değeri 2.650.000 ₺: çekirdek yapım, üç dil ve RTL mühendisliği, Arapça seslendirme, çocuk kategorisi uyumu ve sunucu tarafı. Potansiyel değer 36.000.000 ₺: tam kadro ve pazarlama bütçesiyle ulaşılabilecek büyüklük, gelir iddiası değil. İkisi de Ağustos 2026'da yapılan, satıcı sayfalarından çıkan rakamların karşıt doğrulamayla düzeltildiği bir piyasa taramasına dayanıyor.

Karşılaşılan Teknik Zorluklar

  • Renk varyantı sayılarının elle tutulan tabloda eskimesi; tabloyu asset taramasından üretmek çözdü
  • Arapça cümle içindeki Latin metnin noktalamayı kaydırması; ölçüm + FSI/PDI yalıtımı
  • Aynı satın alma fişinin tekrar ya da başka hesapta kullanılması; atomik create ile kapatıldı
  • Çocuk kategorisinde satın alma kapısı ile reklam onayının ayrı mekanizmalar olması gereği
  • Yeni ekranın taşma matrisine eklenmesinin unutulması; kapsam testi bunu CI'da yakalıyor

Neden Değerliydi?

Casual bir giydirme oyunu dışarıdan bakınca küçük bir iş. İçeriden bakınca içerik üretimi, skor matematiği, ödeme güvenliği, üç dil ve çocuk uyumu aynı anda yönetilmesi gereken beş ayrı problem. Bu projede hepsini ölçerek ve testle kilitleyerek kapattım; sonucu mağazada, satın alma akışında ve Arapça ekranda görmek mümkün.

Rakamlarla

Alan Değer
Kod tabanı398 Dart dosyası, 155.283 satır, 81 servis
Gardırop11 manken × 15 kategori, 918 parça + 193 evcil hayvan parçası
Sprite havuzu23 paket, 14.081 webp, 1.134 varyant girdisi
Yerelleştirme51 ARB, 17 ad alanı, 3 dil, dil başına 30 seslendirme
Test424 dosya, 3.883 vaka, 27 emülatör testi, 11 bekçi
Sunucu15 callable fonksiyon, sunucu tarafı satın alma doğrulaması

Sonuç

Play'deki sürüm bu sayfadaki her satırı taşıyor. Bana kalan gözlem şu: giydirme oyununda en pahalı hata çizimde değil, tabloyu elle tutmakta çıkıyor.

https://play.google.com/store/apps/details?id=com.glamupgirls.app

Bu projeyi puanlayın