RPG'mdeki Java oyununu nasıl oynayabilirim?


21

Java'da RPG türü bir oyun üzerinde rasgele çalışıyorum ancak her öğe için farklı bir sınıf oluşturmadan birçok farklı şeyi yapabilen öğelere nasıl sahip olabileceğimi bulmakta güçlük çekiyorum.

Örnek olarak, ağaçları kesebilecek ve canavarlara saldıracak bir Balta nasıl oluşturabilirim?

Eğer doğrama veya silah sınıfını uzatırsam, diğer sınıfı da genişletemem.

Kıyma ve silahın bir ara yüz olması durumunda, bir hançer de canavarlara saldırabildiği ve farklı bir baltanın ağaçları kesebileceği zaman çoğaltılmış kodum olacak.

Tek bir Item sınıfına sahip olmanın ve öğeleri ve onların yeteneklerini bir dosyadan yüklemenin bir yolu olduğunu umuyorum. Mümkünse nasıl yapılabilir? Öyleyse, bir oyunda eşyalara sahip olmanın en iyi yolu nedir?

Yanıtlar:


15

Gregory Weir'in cevabı, çoklu roller üstlenebilmek için öğe örneklerinin nasıl yapılandırılacağı konusundaki favorim.

Bir dosyadan yüklemek için:

İlk önce, YAML'ı kullanın. YAML özellikli bir veri tanımlama dilidir; nispeten hızlı bir şekilde ayrıştırılabilir, insanlar tarafından okunup düzenlenebilir, ikili verileri destekler ve Java da dahil olmak üzere çoğu programlama dili için kütüphaneler bulunur. Bu, "dosyalardaki verileri nesnelere nasıl alırım?" Çözer.

İkincisi, flyweight şablonunu kullanın . Bu dosyalardan okuduğunuz verilerin çoğu statiktir. Örneğin değişmeyecek ("balta 1d10 taban hasarı veriyor ve ahşabı kırıyor ama taşı değil" - bir oyuncunun sahip olduğu beş eksenin tamamı için geçerli). Gerçekten de YAML dosyalarından okuduğunuz şey bu platonik tanım ve her bir kalem örneğinizde "Kaç kırılmadan önce ne kadar salıncak salladım" gibi örnek başına verilerle birlikte istenmeyen (ve sabit) referanslar var. bana özel bir isim mi? "vb.

Çapraz örnek verilerini tek bir nesnede paylaşarak, çok fazla hafıza alanını korursunuz ve oyunların devam etmeden devam etmesini kolaylaştırabilirsiniz (oyunları veya oyuncu veritabanını kaydetme).

Yani sınıf yapınız şuna benziyor:

  • class Öğe - Öğe başına bir örnek
    • Bir Silah örneği sahibi
    • A sahibi örneği
    • Özel bir isim vb. Var.
  • sınıf Silah - (en fazla) öğe başına bir örnek
    • Öğe Bir Bileşen mi
    • Weapon-Def anlamına gelir
    • -Bir bonus bonusu seviyesi, vs.
  • class Tool - (Bir taneye kadar) öğe başına bir örnek
    • Öğe Bir Bileşen mi
    • ToolDef'i ifade eder
    • Bir dayanıklılık vb.
  • sınıf WeaponDef - Her silah çeşidine bir örnek
    • Bir dosyadan okuyun, alanlar sabit olmalıdır.
    • Hasar hasarı, 1 veya 2 el, vb.
  • sınıf ToolDef - Her tür alet için bir örnek
    • Bir dosyadan okuyun, alanlar sabit olmalıdır.
    • Sağlam bir dayanıma sahiptir, kırabileceği malzemeler vb.

18

Bileşen (Kompozit değil) tasarım deseni bu amaç için mükemmeldir: http://gameprogrammingpatterns.com/component.html

Temel olarak, bir Balta, bir WeaponComponent ve bir ToolComponent (belki) içeren Item sınıfının bir örneği olacaktır. Bir şeyin silah olarak kullanılıp kullanılamayacağını test etmek için, bir Silah Bileşeni ekli olup olmadığını kontrol edin ve ardından öğenin silah bilgisini almak için bu Silah Bileşeni örneğiyle konuşun.

Elbette bir dosyadan yükleme ayrı bir alıştırmadır.


Ve tabii ki, bileşenlere sahip olduğunuzda arayüzleri tekrar iyi bir şekilde kullanabilirsiniz. Ax türünüz IChopper ve IWeapon özelliğini uygulayabilir ancak daha sonra hem türü hem de uygulamayı gerektiği gibi yeniden kullanmanıza ve bileşenler için testi kesmenize izin vererek bileşenin davranışını ortaya çıkarabilir. Tüm eksenler aynı yeteneklere ancak farklı istatistiklere sahipse, o zaman altınsınız. Eşsiz yeteneklere sahip öğelere ihtiyacınız varsa, bir oyun-bileşeni koleksiyonu uygulamanız gerekebilir ve güncelleme yordamlarınızın hangi bileşenler üzerinde yapabileceklerini sorgulamaları için nesneleri sorgulamanız gerekebilir.
CodexArcanum

6
@CodexArcanum: "Ax türünüz IChopper ve IWeapon uygulayabilir ancak daha sonra bileşenin davranışını gösterebilir" - Bunun amacı nedir? Sadece sınıf hiyerarşinizi çözüyor. Bileşen modelinin amacı, bir Ax sınıfına veya bir IChopper arayüzüne veya bir IWeapon arayüzüne, sadece somut Chopper ve Silah bileşenlerine ve bir üst seviye Öğeye ihtiyacınız olmamasıdır.

Şu anda oyun eşyaları için bir bileşen sistemi üzerinde çalışıyorum ve bu desenin nasıl kullanıldığı ile ilgili gerçekten tek bir şikayetim var. Silah, Kıyafet ve Sarf Malzemelerinin bileşenleri göz önüne alındığında, bir madde hem Silah hem de Kıyafet olamayan eşyalar veya aynı zamanda Tüketilebilir Kıyafetler açısından teorik olarak "bozulabilir". Mantıksal olarak, bir öğe yalnızca bir "Ana Bileşen" olabilir, ancak bileşenleri kısıtlayarak birlikte bir bileşen sistemine olan gereksinimi ortadan kaldırıyorsunuz. Böylece, aksi takdirde şaşırtıcı bir sistem ile temel kusurlarından biri
Krythic
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.