Giriş ve oyun nesnelerinin kaygılarını nasıl ve nasıl ayırırım?


20

Muhtemelen basit bir klavye ve fare olayları, dokunma olayları veya ivmeölçer girişi olarak bir şey olabilir, bir geliştirici giriş ile uğraşmak zorunda her oyunda. Bu giriş, dolaylı olarak oyundaki nesneleri doğrudan etkiler. Bazen aynı giriş farklı nesneleri etkileyebilir. Şimdi bunun nasıl modelleneceğini düşünüyordum. Gördüğüm gibi iki farklı yaklaşım var.

  • Oyun nesnesinin kendisini halletmesine, olaylara abone olmasına ve kendi yöntemlerini çağırmasına izin verin. Bu, oyun nesnelerinin hangi girdilerin hangi eyleme neden olduğuna karar vermelerine izin verme avantajına sahiptir. Bir dezavantaj, giriş kodunun "çekirdek" oyun nesnesi koduyla karıştırılmasıdır. Ayrıca oyun nesneleri oyunun geri kalanının durumundan habersizdir ve bazen giriş olaylarına göre hareket etmemelidir. Bu doğru görünmüyor.

  • Genel bir giriş denetleyicisinin tüm girdilere dikkat etmesini ve kimin hangi olayla başa çıkacağına karar vermesini sağlayın. Bu, endişeleri daha iyi ayırıyor gibi görünüyor, ancak giriş denetleyici sınıfını oyun nesnelerine sıkıca bağlar. Bir şekilde kimin hangi olayı ve hangi durumda almak istediğini bilmek gerekir. Bu da doğru görünmüyor.

Bununla başa çıkmak için hangi stratejileri kullanıyorsunuz?

Yanıtlar:


7

Giriş nesnelerini 10 nesne sınıfını düzenlemek ve hata ayıklamak zorunda kalmadan hızlı bir şekilde değiştirmek / yükseltmek için giriş olaylarını oyun nesnelerinden ayırmanızı öneririm. Örnekler, yalnızca klavye denetimlerinden fare + klavyeye geçiş yapmak veya yalnızca tuşları yeniden atamaktır.

Tek tek oyun nesnelerine girişi sıkıca bağlamak yerine, oyun nesnesindeki benzersiz giriş sinyali başına yalnızca bir yöntem çağırın ve yürütme yoluna karar vermesine izin verin.

Giriş durumunu takip etmek için bir giriş denetleyicisi kullanın:

Up press event   -> dir = up
Down press event -> dir = down

Giriş durumu her değiştiğinde, oyun nesnelerinin değiştirilmeye hazır olup olmadığını değerlendirin:

set dir  ->  if gamestate != paused && battlemode == false
             ->  character.changeDir(dir);

Giriş denetleyicisi veya diğer oyun nesneleri tarafından çağrılabilecek oyun nesnelerinize genel yöntemleri uygulayın:

changeDir (dir)
setSpeed (walk/run)

7

MVC yaklaşımını öneririm. MVC'de oyun nesneleri sadece oyun sisteminin modellenmesi konusunda endişelenmeli ve move_left gibi üst düzey bir arayüz sağlamalıdır. Ardından girdiyi model çağrılarıyla eşleme konusunda endişe duyan bir denetleyici nesnesine sahip olun. Sadece kontrollerin kolay değiştirilmesine izin vermekle kalmaz, AI için iyi bir arayüz sağlar, sadece başka bir kontrolördür.

İkinci seçeneğinizde, giriş kontrol cihazını, gerçek cihaz dokunuşunu, klavyeyi, hızlandırmayı, başka ne atabileceğinizi ele alan iki parçaya bölerdim, bunları genel bir giriş setine eşlettirin. Ardından, genel girişleri oyuna özel girişlerle eşleyen ikinci bir bölüme sahip olun. Klavyelerin yukarı ok giriş1 ile eşleştiğini ve ardından dokunmatik ekranın üst kısmına dokunarak giriş1 ile eşleştiğini ve şimdi atlamak için giriş 1'i eşleyen ikinci bir parça yazdığınızı söyleyin. Artık herhangi bir IO cihazının yanı sıra saklanan çalma veya AI girişlerini bu genel giriş sistemine eşleyebilir ve modele girdi1'in ne anlama geldiğini yükleyen küçük bir oyuna özgü parçaya sahip olabilirsiniz.


5
Bu sitenin başka yerlerinde MVC'nin neden oyunlar için uygun bir model olmadığı konusunda çok fazla tartışma var; stonemetal'in tanımladığı şey MVC bile değildir, sadece soyutlamadır; ve "MVC Kullan" bir cevap değildir, çünkü MVC tüm mimarlık sınıfının bir tanımıdır ve endişeleri ayırmanın belirli bir yolu değildir (ne de bunu yapmanın tek yolu).

2
MVC ona A) okumak için bir wikipedia makalesi B) çalışmak için gösterilen çözüme nasıl yaklaşılacağı konusunda bir dizi varyasyon C) Modelin yüksek düzeyde bir arayüz ortaya koyduğu yerde nasıl kuracağımı belirtiyorum kontrolör, düşük seviyeli girişi (gerçek veya sentetik) yüksek seviyeli eylemle eşler ve bazı olay sistemleri yerine modeli doğrudan manipüle eder.
stonemetal

1

Oyununuzu ( Model ) olası giriş olaylarının bir listesini tanımlamanızı öneririm ( ortak arayüze sahip numaralar veya nesneler olarak uygulanır). Gibi şeyler MovingRightStarted, MovingRightStopped, FiredWeapon1, Escape, vb ...

Oyun, queuegiriş kodunuzun ( Denetleyici ) giriş olaylarıyla doldurabileceği bir veri yapısı (örneğin a ) tanımlar .

Daha sonra oyununuz, veri girişlerini almak için veri yapısını yoklayabilir.

Bu şekilde, modeli beslemek için farklı tür denetleyiciler takabilirsiniz:

  • Yalnızca klavye
  • Klavye + Fare
  • Oyun kolu
  • Dokunmatik ekran
  • Yapay zeka

Sadece giriş olaylarını modele itmeleri gerekiyor.


Bunu queuesaklamak için bir veri türü seçimi dışında, ne demek istediğini anlıyorum . Nedenini açıklayabilir misiniz?
Robert Massa

Modelden 2 giriş olayı yoklaması arasında, denetleyici birkaç eylem olayını zorlamış olabilir ve kullanıcı giriş sırasını korumak önemlidir. Bu yüzden bir FIFO veri yapısı seçtim. Aslında, girdinin tam olarak ne zaman gerçekleştiğini de belirtmeniz gerekebilir.
Splo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.