GlamUp Girls — Mobil Giydirme Oyunu (Flutter)

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

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

14 manken, 1.000'den fazla kıyafet, aksesuar, saç ve makyaj seçeneği ve dört evcil hayvan paketiyle Google Play ve App Store'da yayında olan bir giydirme oyunu. Flutter istemcide satın almalar Firebase Cloud Functions üzerinden sunucuda doğrulanıyor; yerleşim kusurları göz kararıyla değil, ölçülerek kapatıldı. Nisan 2026'da başladı; PEGI 3 sınıfında, çocuk kategorisi kurallarıyla.

GlamUp Girls — Mobil Giydirme Oyunu

Google Play ve App Store'da yayında · Türkçe, İngilizce ve Arapça · Bağımsız olarak geliştirildi ve yayımlandı

GlamUp Girls, mankenini seçip makyajını yaptığın, saçını ve kıyafetini belirleyip podyuma çıkardığın bir giydirme oyunu. 14 manken, 1.000'den fazla kıyafet, aksesuar, saç ve makyaj seçeneği, dört evcil hayvan paketi ve haftalık/aylık yarışmalar var. Eğitim turunda kısa sesli anlatım (TTS) da var. İlk commit 7 Nisan 2026. Google Play'de yayında. App Store'da (iPhone ve iPad) 12 Eylül 2026'dan beri yayında. 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 9 Eylül 2026'da depodan ölçüldü, tahmin değil.


Oyunda Ne Var

  • 👗 14 manken ve 1.095 ayrı seçenek: 817 kıyafet ve aksesuar, 78 saç modeli, 200 makyaj stili (iki mankenin paylaştığı sprite bir kez sayıldı; Zarif, Glam'ın parçalarının bir bölümünü küratörlü olarak paylaşıyor; taban vücut sprite'ları sayının dışında)
  • 🐾 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 ve eğitim turunda sesli anlatım (TTS); yeni diller aşamalı olarak geliyor
  • 🛡️ Satın alma girişlerinde ebeveyn kapısı; reklam tarafında çocuğa yönelik muamele ve G içerik derecesi

Oyunun İçinden

Zamanın geçtiği beş ekran.

GlamUp Girls — Ana ekran
Ana ekran
GlamUp Girls — Manken seçimi
Manken seçimi
GlamUp Girls — Evcil hayvanlar
Evcil hayvanlar
GlamUp Girls — Podyum
Podyum
GlamUp Girls — Skorlama
Skorlama

Üç Yeni Karakter

Zarif personası, Kıyafet Stüdyosu'ndaki Örtü sekmesiyle küratörlü tesettür gardırobu
Zarif
İkon personası, artı beden kadın karakter
İkon
Rahat Tarz personası, artı beden erkek karakter
Rahat Tarz

Zarif, Kıyafet Stüdyosu'ndaki Örtü sekmesiyle küratörlü bir tesettür gardırobu kullanıyor: Glam paketinden seçilmiş 109 parça, bunların 85'i Glam'ın kendi listesiyle ortak. İkon artı beden kadın, Rahat Tarz artı beden erkek. Üçü de ilk kurulumda açık; indirilecek ek paketin arkasında değiller.

Yapılan İş

İstemci Flutter ile yazıldı: 21 Eylül 2026 itibarıyla lib/ altında 451 Dart dosyası ve 180.738 satır. İş mantığı doğrudan lib/services kökündeki 104 servis dosyası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: 19 callable fonksiyon, 3.313 satırlık bir index.js ve satın alma doğrulaması için 945 satırlık ayrı bir modül.

Öne Çıkan Sonuçlar

✅ 25 asset paketinde 18.622 normalize webp sprite; renk varyantı sayıları elle değil, asset taramasından üretilen 1.418 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

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

✅ 607 test dosyasında 5.433 test tanımı (kaynak sayımı, 21 Eylül 2026), Firestore/Functions tarafında 47 emülatör test dosyası

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

İçerik Hattı

Katalog 14 mankenin her biri için ayrı listelerle modellenmiş; 1.095 seçenek tanımının arkasında 25 asset paketi ve 18.622 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.418 (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.608 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.

Yerelleştirme

Arayüz metni 17 ad alanına bölünmüş 51 ARB dosyasında tutuluyor: İngilizce 7.568, Türkçe 7.569, Arapça 7.596 anahtar satırı. Dosyalar arası pariteyi ve Arapça sayfaya sızan İngilizce metni 28 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, sessizce yanlış tarafa çizen EdgeInsets.only, fromLTRB, Positioned ve TextAlign kullanımlarını sayıp simetrik olanları hariç tutuyor.

Sesli anlatım dil başına 32 kısa replik: 24 rehberli tur, 8 tepki; hepsi metinden sese (TTS) üretildi. 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

21 Eylül 2026 itibarıyla 607 test dosyasında 5.433 test tanımı; Firestore ve Cloud Functions tarafında 47 emülatör test dosyası. Bunlara adı *_guard_test.dart olan 24 regresyon bekçisi ekleniyor: bir bölümü diskteki kaynağı tarayıp bir kod desenini CI'da kilitliyor, bir bölümü davranış üzerinden bekliyor. Taşma matrisi 44 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.

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, yerelleştirme 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ı451 Dart dosyası, 180.738 satır, 104 servis dosyası (lib/services kökü)
Gardırop14 manken, 1.095 seçenek + 193 evcil hayvan parçası
Sprite havuzu25 paket, 18.622 webp, 1.418 varyant girdisi
Yerelleştirme51 ARB, 17 ad alanı, 3 dil, dil başına 32 sesli replik (TTS)
Test607 dosya, 5.433 test tanımı (kaynak sayımı, 21 Eylül 2026), 47 emülatör test dosyası, 24 bekçi
Sunucu19 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.

Bu projeyi puanlayın