Geliştirici Notları: ÇizBil
Giriş ve Mimari Yaklaşım
Paira ÇizBil, tamamen web tarayıcıları üzerinde koordine edilen, merkezi bir veritabanı (Database) veya oyun sunucusu barındırmayan, P2P (Peer-to-Peer) bağlantı mimarisine sahip çok oyunculu bir çizim ve kelime tahmin oyunudur. Gartic.io tarzı bu eğlenceli oyun, arkadaş gruplarının herhangi bir indirme veya kayıt işlemi yapmadan doğrudan web tarayıcıları üzerinden gerçek zamanlı olarak yarışabilmesini sağlar.
Tüm oyun durumu (state) yönetimi, sunucusuz mimarinin getirdiği sınırlamaları aşmak ve pürüzsüz bir oyun akışı sunmak adına tarayıcı düzeyinde koordine edilen Host-Client yapısıyla yönetilmektedir.
P2P Ağ Topolojisi ve Oda Keşfi
Geleneksel istemci-sunucu yapısı yerine, oyunda WebRTC (Web Real-Time Communication) protokolü üzerinde yükselen bir Host-Client (Kurucu-Katılımcı) ağ topolojisi kullanılır:
- Host (Kurucu Node): Oyunu başlatan kullanıcı yerel tarayıcısında sunucu (Host) rolünü üstlenir.
CizBilGameEnginenesnesini yöneterek sürelerin takibinden, soru/kelime havuzunun yönetiminden, çizim izinlerinden, cevapların toplanmasından ve anlık liderlik sıralamasının dağıtılmasından sorumludur. - Clients (Katılımcı Peer'lar): 6 haneli benzersiz oda kodunu girerek odaya bağlanan oyuncular, doğrudan Host ile peer-to-peer
RTCDataChannelbağlantısı kurarlar. Katılımcıların kendi aralarında doğrudan veri kanalı açmasına gerek kalmaz; tüm bilgi akışı Host üzerinden senkronize edilir. - Sinyalleşme (Signaling): Oyuncuların birbirlerini internet üzerinde bulup IP ve port bilgilerini (ICE Adayları) değiş tokuş edebilmesi için bir WebRTC aracı sinyalleşme sunucusu (PeerJS) kullanılır. Bağlantı kurulduktan sonra bu aracı sunucu tamamen devre dışı kalır ve veri akışı doğrudan cihazlar arasında akar.
Gerçek Zamanlı Veri Senkronizasyonu (Data Synchronization)
ÇizBil'de oyun akışının sorunsuz ilerlemesi ve çizim yollarının akıcı bir şekilde aktarılması için birçok kritik veri paketinin milisaniye düzeyinde senkronize edilmesi gerekir. Bu süreç, RTCDataChannel üzerinden iletilen şu paket tipleriyle koordine edilir:
- DRAW_EVENT: Çizen kişinin (currentDrawer) tuval üzerindeki çizim yolları (fırça hareketleri, X ve Y koordinatları, renk, fırça kalınlığı vb.)
AdvancedDrawingBoardtarafından yakalanır ve doğrudan WebRTC veri kanalı üzerinden gecikmesiz olarak gönderilir. - CLEAR_CANVAS & UNDO_CANVAS: Çizen kişinin tuvali temizleme (clear) veya son çizimi geri alma (undo) işlemleri tüm istemcilerde yerel olarak (
clearCanvasLocal,undoCanvasLocal) yürütülür. - GUESS: Diğer oyuncuların kelime tahminleri Host'a gönderilir. Host,
FuzzyMatcherkütüphanesini kullanarak tahminin doğru olup olmadığını (küçük-büyük harf duyarlılığı olmadan) kontrol eder. Tahminin doğru olması durumunda tüm istemcilere doğru bildiğine dairCHAT_EVENTpaketi gönderilir ve puanlar güncellenir. - CHOOSE_WORD: Sıra çizen kişiye geldiğinde sunulan iki kelimeden (choices) birini seçmesi ve oyun turunun resmi olarak başlaması bu eylemle yönetilir.
- SYNC & SYNC_TIME: Host, oyun durumunu (players, currentDrawer, scores vb.) istemcilere yayınlar. Güvenlik ve haksız rekabeti önlemek amacıyla, çizen dışındaki oyuncuların durum paketlerindeki
currentWordkelimesi sansürlenerek (örn._ _ _) gönderilir.
Oda Mantığı ve Oturum Yönetimi
Oyun odaları, PeerJS altyapısı tarafından atanan 6 karakterli benzersiz bir Oda Kodu (Peer ID) ile yönetilir:
- Bağlantı Kurulumu: Katılımcı oda kodunu girdiğinde SDP (Session Description Protocol) ve ICE Candidate alışverişi başlar ve güvenli bir veri kanalı açılır.
- Kelime Havuzu Yönetimi: Host, oyun ayarlarında seçilen kelimeleri (
cizbil_words.jsdosyasındaki havuzdan) belleğe yükler. Oyun sırasında kelimelerin sırası Host tarafından kontrol edilir ve dağıtılır. - Hata Toleransı (Resilience): Bağlantı kesintileri veya bir oyuncunun oyundan düşmesi durumunda, Host'un
removePlayermekanizması tetiklenir. Çizen kişinin ayrılması durumunda tur otomatik olarak atlanırken (checkWinOrNextRound), tahmincilerin ayrılması halinde de kalan oyunculara göre turun sonlanıp sonlanmayacağı (checkAllGuessed) anlık olarak değerlendirilir.
E-E-A-T & Güvenlik
Uygulama tamamen istemci tarafında (Client-Side) çalıştığı için kullanıcıların kişisel verileri, IP adresleri veya oyun içi yazışmaları herhangi bir uzak sunucuda veya veritabanında depolanmaz. Tüm veri transferleri WebRTC'nin doğası gereği uçtan uca şifreli (End-to-End Encrypted - DTLS/SRTP) kanallar üzerinden doğrudan cihazlar arasında gerçekleşir. Bu yaklaşım hem maksimum hız ve sıfır sunucu maliyeti sağlar, hem de veri gizliliğini en üst düzeyde korur.
Bu teknik dokümantasyon, tarayıcı tabanlı eş zamanlı oyun geliştirme meraklıları ve platformun altyapısını merak eden geliştiriciler için Ahmet Efe Yaşar tarafından hazırlanmıştır.