Kendi ürünümüz · Carrom

Gerçek carrom, fiziğini kendimizin yazdığı.

Carrom, ahşap bir tahtada kesin disk fiziğiyle oynanan, önce telefon düşünülerek yapılmış bir tahta oyunudur. Bangladeş, Hindistan ve Pakistan'da oynanan 29 Game ve Tal Gach dahil beş oyun türü; çevrimiçi 1'e 1 ve 2'ye 2, botlar ve sırayla oynama sunar. Tek bir TypeScript kod tabanı web, Android ve iOS'ta çalışır; çevrimiçi oyun ise kendi gerçek zamanlı sunucumuzda çalışır.

Web'de, App Store'da (iPhone ve iPad) ve Google Play'de (Android) yayında.

  • Web (PWA)
  • Android
  • iOS
  • iPadOS
her biri kendi kural motoruna sahip oyun türü
5
tarayıcı motorları arasında bit düzeyinde aynı vuruş
4.320
otomatik test: 396 birim ve 150 tarayıcı testi; her tarayıcı testi üç ekran boyutunda çalışır
540+
yavaşlatılmış Fast 3G'de ilk yükleme
≤ 3 sn

Uygulamanın içi

Mağaza sayfalarında göründükleri gibi, yayındaki uygulamadan gerçek ekranlar.

Oyuncular neler alıyor

  • Beş oyun türü

    Klasik, 29 Game (29'a ilk ulaşan), Tal Gach (19 taşlık kuleyi kırın, 170'e ilk ulaşan), Disc Pool ve Serbest; ayrıca günlük bir meydan okuma ve bir öğretici.

  • Çevrimiçi 1'e 1 ve 2'ye 2

    Puana göre Hızlı Eşleşme, boş koltukları dolduran botlar, özel odalar, uygulamayı açan meydan okuma bağlantıları, açık odalar lobisi, rövanş, ifadeler, 20 saniyelik sıra sayacı ve her oyun türü için bir Elo puanı.

  • Botlar ve sırayla oynama

    4 zorlukta (Kolay'dan Uzman'a) ve 4 kişilikte (dengeli, saldırgan, savunmacı, hileli vuruşçu) botlar; her birinin kendi adı ve bayrağı var; ayrıca tek cihazda 2 veya 4 oyuncu için sırayla oynama.

  • Sizinle gelen ilerleme

    Jetonlar, animasyonlu tahtalar, vurucular ve taş setlerinden oluşan bir mağaza, başarılar, istatistikler ve günlük seriler. Her cihazda saklamak için Google veya Apple ile giriş yapın.

  • İşletmeci araçları

    Yönetim panelimiz canlı oyunları ve oyuncuları gösterir, moderasyonu yürütür, herhangi bir oyuncunun jetonlarını ona bir mesajla ayarlar; reklamları, zorunlu güncellemeleri, değerlendirme istemlerini, eşleştirme anahtarlarını ve hatta görünümü uygulama sürümü çıkarmadan değiştirir.

  • Tek kod tabanından her yerde

    Web, Android, iPhone ve iPad tek kod tabanından; ayrıca web uygulaması olarak kurulabilir. Oda bağlantıları uygulama kuruluysa uygulamayı, değilse web oyununu açar.

Sıfırdan yapıldı

Her katman bize ait; oyunun kurallarından üzerinde çalıştığı sunucuya kadar.

  1. Oyun istemcisi

    Sıkı TypeScript, Vite ve Canvas 2D; oyun motoru ve arayüz framework'ü yok. Dönen tahtalar ve Tal Gach kulesi önizlemeleri saf CSS 3D'dir.

    • TypeScript
    • Vite
    • Canvas 2D
    • CSS 3D
  2. Kendi fizik motorumuz

    Kare hızından bağımsız, sabit 1/120 sn adımlı olay güdümlü disk fiziği: cep ağızları, ancak yeterli kısmı deliğin üstündeyken düşen taş, cepten çıkan taşlar ve dağılan bir kule. Genel amaçlı bir fizik kütüphanesinin yerini aldı.

    • Deterministic
    • Seeded randomness
    • Headless tests
  3. Gerçek zamanlı arka uç

    MongoDB üzerinde kendi Node sunucumuz; küçük bir JSON-over-WebSocket protokolü konuşur: al, ayarla, karşılaştır-ve-ayarla, izle ve varlık. Firebase Realtime Database'in değerlendireceği güvenlik kuralları dosyasının aynısını değerlendirir.

    • Node.js
    • MongoDB
    • WebSocket
    • esbuild
  4. Uygulamalar ve giriş

    Android ve iOS için Capacitor uygulamaları. Google ve Apple girişi Firebase Auth üzerinden yürür ve sunucumuz her belirteci kendisi denetler. Reklamlar AdMob'dan gelir, gerçek parayla satın alma yoktur.

    • Capacitor
    • Firebase Auth
    • AdMob
    • App Links

Operasyon

Sunucuları kendimiz işletiyoruz

Arada oyun arka uç servisi yok: kendi sunucumuz, kendi dağıtımlarımız, kendi izlememiz.

  • Kendi Linux sunucumuz: nginx, Cloudflare arkasında Let’s Encrypt TLS ile oyunu sunar
  • WebSocket, uygulama yapılandırması ve sağlık kontrolleri systemd altındaki Node servisine yönlendirilir
  • Yönetim paneli kendi servisi olarak çalışır ve yalnızca makinenin kendisinde yanıt veren bir işletmeci API'sini çağırır
  • Tek komutla dağıtım: derle, zaman damgalı bir sürüm yükle, geç, yeniden başlat, sağlık kontrolü yap; anında geri alma için son 5 sürüm saklanır
  • Bangladeş'ten Cloudflare üzerinden yaklaşık 210 ms ortanca gidiş-dönüş (lansmanda ölçüldü)
  • Google Play ve App Store Connect için betikli uygulama derlemeleri
  • Oda davetleri için Android App Links ve iOS universal links

Çözdüğümüz zor sorunlar

Oyuncuların hiç görmediği kısımlar, ölçtüğümüz sayılarla.

  1. Her telefonda aynı fizik

    Sorun
    Çevrimiçi bir oyunda her telefon rakibin vuruşunu kendisi simüle eder. İki cihaz bir sayıyı bile farklı hesaplarsa tahtaları birbirinden ayrışırdı; bu yüzden fizik her yerde birebir aynı olmak zorundaydı.
    Ne yaptık
    Simülasyon yalnızca her JavaScript motorunda kesin olan işlemleri kullanır; karekök tabanlı kendi hypot, log, acos, sin ve cos fonksiyonlarımızla. Tüm rastgelelik tohumludur ve çekirdek hiçbir zaman saati okumaz.

    Sonuç Chromium ve WebKit motorlarında 4.320 vuruş denetlendi: her tahta bit düzeyinde aynı.

  2. Bulunan ve çevrelenen bir senkron kaybı

    Sorun
    Farklı uygulama sürümlerindeki, fiziği hafifçe farklı oyuncular birbiriyle eşleştiriliyordu ve tahtaları birbirini tutmuyordu.
    Ne yaptık
    Artık bir protokol sürümü eşleştirmeyi ve odaları denetliyor; fizik, sürüm yükselmeden değişirse bir fizik parmak izi testi derlemeyi başarısız kılıyor.

    Sonuç Yalnızca aynı fiziğe sahip oyuncular aynı tahtayı paylaşır.

  3. Adil kırılan bir kule

    Sorun
    Tal Gach'ta açılış vuruşu 19 taşlık üst üste dizili bir kuleye çarpar. Gerçek oyun gibi hissettirmeli ve iki oyuncuya da adil olmalı.
    Ne yaptık
    %70 hız veya üzerindeki bir vuruş alttaki bir ya da iki taşı dışarı atar ve kuleyi ayakta bırakır; daha yumuşak vuruşlar kuleyi devirir. Rastgelelik tohumludur, bu yüzden her cihaz aynı kırılmayı görür.

    Sonuç Güçlü vuruşlar alttaki taşları %90 oranında temizler; her ekranda aynı.

  4. Mac'lerde ses

    Sorun
    Apple-silicon Mac'lerde çalışan iPad uygulaması ne AAC ne de Opus sesini çözebiliyordu.
    Ne yaptık
    Uygulama seslerin ve müziğin 16 bit WAV kopyalarını taşır ve oyun bunları kendisi çözer.

    Sonuç Mac'ler dahil her cihazda aynı ses.

  5. Oyuna dokunmadan bir sağlayıcıdan ayrılmak

    Sorun
    Çevrimiçi oyun Firebase Realtime Database üzerinde başladı ve oyunu yeniden yazmadan oyun verilerini kendi sunucumuza almak istedik.
    Ne yaptık
    Her çevrimiçi özellik tek bir veritabanı arayüzüyle konuşur. Sunucumuz aynı kurallar dosyasını aynı anlambilimle uygular ve tam maçlardan ve 180'den fazla izinli ya da reddedilen yazmadan oluşan tek bir denetim paketi iki arka uca karşı da çalışır.

    Sonuç Oyun verileri artık kendi sunucumuzda duruyor ve arka uç değiştirmek iki ayarlık bir derleme anahtarıdır.

  6. İlk vuruşa kadar hızlı

    Sorun
    Gündelik bir oyunun oyuncuyu kazanmak için saniyeleri vardır, üstelik çoğu zaman yavaş bir mobil bağlantıda.
    Ne yaptık
    İndirilecek motor ya da framework yok, ilk dokunuştan önce ses yok ve yavaşlatılmış bir bağlantıda üretim derlemesini çalıştıran bir performans testi.

    Sonuç Yavaşlatılmış Fast 3G'de ilk yükleme 3 sn veya daha kısa.

Demo değil, ürün gibi test edildi

  • 396 birim testi ve 150 tarayıcı testi; her biri telefon, tablet ve masaüstü boyutunda ekran görüntüsü temelleriyle çalışır (400'den fazla çalıştırma)
  • Bota karşı bot denge çalıştırmaları ve bir maymun testi
  • Veritabanı kurallarına karşı tam çevrimiçi maçlar oynayan bir emülatör paketi
  • Deterministik fizik sayesinde birim testlerinde başsız simüle edilen vuruşlar

Teknoloji

  • TypeScript
  • Vite
  • Canvas 2D
  • Node.js
  • MongoDB
  • WebSocket
  • Capacitor
  • Firebase Auth
  • AdMob
  • Vitest
  • Playwright
  • nginx
  • Cloudflare
  • systemd

GPScom: gpscom.gr'nin eksiksiz yeniden tasarımı

Tüm çalışmalarımız

Bir oyunu ya da gerçek zamanlı bir uygulamayı bu şekilde kurdurmak ister misiniz?

Oyunları ve gerçek zamanlı platformları baştan sona tasarlıyor, geliştiriyor ve işletiyoruz: uygulamalar, sunucular, mağazalar ve operasyon.