Basit bir blok tabanlı bulmaca oyunu üzerinde çalışıyorum.
Oyun, oyun alanında hemen hemen hareketli bloklardan oluşuyor, bu yüzden önemsiz bir fizik simülasyonu. Benim uygulama, ancak, bence ideal olmaktan uzak ve bana nasıl daha iyi yapmak için herhangi bir işaret verebilir misiniz merak ediyorum.
Kodu iki alana ayırdım: Oyun mantığı ve UI, birçok bulmaca oyununda yaptığım gibi:
- Oyun mantığı oyunun genel kurallarından sorumludur (örneğin satrançtaki resmi kural sistemi)
- Kullanıcı arayüzü oyun alanını ve taşlarını (örn. Satranç tahtası ve taş parçaları) görüntüler ve animasyonlardan (örn. Satranç taşlarının hareketli hareketi) sorumludur.
Oyun mantığı, oyun durumunu mantıksal bir ızgara olarak temsil eder; burada her birim bir hücrenin ızgaradaki genişliği / yüksekliğidir. Böylece, genişlik 6 bir ızgara için, genişlik 2 bir bloğu sınırla çarpışana kadar dört kez taşıyabilirsiniz.
Kullanıcı arabirimi bu ızgarayı alır ve mantıksal boyutları piksel boyutlarına dönüştürerek çizer (yani, sabit ile çarpar). Ancak, oyunun neredeyse hiç oyun mantığı olmadığından, oyun mantığı katmanım [1] çarpışma algılaması dışında yapacak fazla bir şey yok. Şöyle çalışır:
- Oyuncu bir parçayı sürüklemeye başlar
- Kullanıcı arabirimi, oyunun mantığını o parçanın yasal hareket alanı için sorar ve oynatıcının bu alanda sürüklemesini sağlar
- Oyuncu bir parçayı bırakıyor
- Kullanıcı arabirimi parçayı ızgaraya bağlar (böylece geçerli bir mantıksal konumda olur)
- UI oyun mantığına yeni mantıksal pozisyonu söyler (mutator yöntemleri ile kaçınmak istiyorum)
Bundan pek memnun değilim:
- Oyun mantığı katmanım için birim testleri yazıyorum, ancak kullanıcı arayüzü değil ve tüm zor kodun kullanıcı arayüzünde olduğu ortaya çıktı: Parçanın başkalarıyla veya sınırla çarpışmasını durdurmak ve ızgaraya yapıştırmak.
- Kullanıcı arayüzünün oyun mantığına yeni durum hakkında bilgi
movePieceLeft()
vermesini sevmiyorum, diğer oyunlarda olduğu gibi bir yöntem ya da bunun gibi bir şey demeyi tercih ederim, ama bu yaklaşımdan uzak durmadım, çünkü oyun mantığı, kullanıcı arayüzünde mümkün olan sürükleme ve yakalama hakkında hiçbir şey bilmiyor.
Sanırım yapılacak en iyi şey oyun mantığı katmanımdan kurtulmak ve bunun yerine bir fizik katmanı uygulamak olacaktır. Bununla ilgili birkaç sorum var:
- Böyle bir fizik katmanı yaygın mıdır yoksa oyun mantığı katmanının bunu yapması daha mı tipiktir?
- Izgara ve parça sürükleme koduna yapışmak kullanıcı arayüzüne mi yoksa fizik katmanına mı ait?
- Böyle bir fizik katmanı tipik olarak piksel boyutları veya oyun mantık katmanım gibi bir tür mantıksal birim ile çalışır mı?
- Bir kez oyunun kod tabanında olay tabanlı çarpışma algılama gördüm, yani, oyuncu sadece parçayı sürükleyecekti, UI bunu itaatkar bir şekilde işleyecek ve fizik sistemini bilgilendirecek ve fizik sistemi bir onCollision () yöntemini çağıracaktı bir çarpışma algılandığında parça üzerinde. Daha yaygın olan nedir? Bu yaklaşım mı yoksa önce yasal hareket alanını mı istiyorsun?
[1] katman , muhtemelen ne demek istediğim için doğru kelime değil, ancak alt sistem aşırı şişmiş ve sınıf yanlış yönlendiriyor, çünkü her katman birkaç sınıftan oluşabilir.