Bir RPG oyununda saldırı sınıfı nasıl tasarlanır?


37

Küçük bir RPG tarzı oyunun planlama aşamasındayım.

Karakter, tamsayı olarak temsil edilen kuvvet, çeviklik vb. Gibi bir takım özelliklere sahip olacaktır. Karakter ayrıca bir saldırı sınıfı olarak temsil edilen bir dizi saldırıya sahip olacak.

Her saldırıda karakter özelliklerine göre hasar vermesini istiyorum, örneğin: "kılıç eğik çizgi" saldırısı 10 dmg + karakter gücünün değerini alacaktır.

Bunu yapmayı düşündüğüm yöntem, soyut bir Saldırı yöntemi olan soyut bir saldırı sınıfına sahip olmak ve her saldırı için Saldırı yöntemini uygulayan bir sınıf oluşturuyorum.

public class SwordSlash:Attack
{
    public void Attack(Character attacker, Character defender)
    {
        defender.DoDamage(10 + attacker.Strength);
    }
}

Bunun sürdürülmesinin bir kabusa dönüşeceğini görüyorum.

Bunu daha iyi bir şekilde nasıl başarabileceğime dair bir fikri olan var mı?

Asıl sorun, saldırıya göre doğru özelliğin nasıl girileceğidir.

Yanıtlar:


34

Muhtemelen burada veri odaklı bir tasarıma gitmelisin.

Çalışmak istediğiniz parametreleri içeren genel bir Attack sınıfı hazırlayın - baz hasarı, istatistikler hasarı etkiler, bir takım potansiyel durum etkileri ... bunun gibi şeyler:

public enum AttackStat
{
  Strength,
  Agility,
  Intellect
  // etc.
}

public class Attack
{    
  private int baseDamage;
  private AttackStat stat;
  private double damageMultiplier;
  // ...and so on

  public void Attack(Character attacker, Character defender)
  {
    defender.DoDamage(baseDamage + attacker.GetStatValue(stat) * damageMultiplier);
  }    
}

// Put a method on Character to fetch the appropriate value given an AttackStat:
public int GetStatValue(AttackStat s)
{
  switch(s)
  {
    case AttackStat.Strength:
      return strength;
    case AttackStat.Agility:
      return agility;
    // etc.
  }
}

Ardından, saldırılarınızı bir dosyaya, örneğin bir XML dosyasına yerleştirin ve verileri oradan yükleyin:

<Attacks>
  <Attack name="Sword Slash" damage="10" stat="Strength" multiplier="1" />
  <!-- More attacks here -->
</Attacks>

Bunu, birden fazla istatistikten, yani hasarın hem Akıl hem de Ateş statüsünden hesaplandığı bir Ateş Topu gibi değerler elde etmek için bile genişletebilirsiniz:

<Attack name="Fireball" damage="20">
  <StatModifier stat="Intellect" multiplier="0.4" />
  <StatModifier stat="Fire" multiplier="0.8" />
</Attack>

Her şey için aynı temel hasar formülünü kullanmak istemiyorsanız (örneğin, sihirli hasarı fiziksel hasardan farklı şekilde hesaplayın), ihtiyacınız olan her formül için Attack alt sınıfları oluşturun ve Attack'i geçersiz kılın ve XML dosyanızda istediğiniz türü belirtin.


1
+1, ancak bu switch ifadesini korumaktan kaçınmak için GetStatValue'yu bir tür arama tablosuyla bile değiştiririm.

1
Bu yöntemle ilgili sorun, yalnızca genel veriye dayalı saldırılara sahip olmanız olabilir - özel mantık kullanan hiçbir şeye sahip olamazsınız. Çok genel bir eşya seti ile biteceksin (warcraft'a girince
Iain

2
@Iain: Buna izin vermek için daha fazla veri ekleyerek bu kolayca çözülebilir. Örneğin, daha fazla şey yapan veya hasarı tamamen farklı bir şekilde hesaplayan bir SpecialAttack alt sınıfına sahip olabilirsiniz. Bu sadece ihtiyacınız olan davranışı belirleme ve sonra bunu veri olarak ifade etme meselesidir.
Michael Madsen,

2
@Iain: Sadece daha fazla alan eklemeye ek olarak, örneğin Lua'daki ifadeler veya kod blokları gibi bazı veri alanlarını da çözebilirsiniz. Ortogonal bileşenlerin iyi kullanılması da daha ilginç sonuçlar verir.

1
Veri odaklı olma fikri için +1. Xml önermekle aynı fikirde değilim. Orada daha iyi biçimler var - yaa, json ya da Lua'yı gömdüyseniz düz bir .lua dosyası.
egarcia


2

İstediğiniz davranışla geçersiz kıldığınız bir saldırı yöntemine sahip bir silah sınıfım olacaktı. Daha sonra silahın oyunda, envanterde, aynı sınıfta vb. İçin ne kadar sattığını da görebilirsiniz.


6
-1, sadece bu veri odaklı değil, bileşen odaklı değil de derin hiyerarşi. Mümkün olan en kötü çözüm.

4
Sırf bu özel veriye dayalı değil çünkü kötü bir seçim yapmaz ve hiyerarşi zaten o kadar derin olmazdı. Basit fakat yine de güçlüdür (UnrealEngine bunun için mükemmel bir örnektir), doğru yapıldığında (yani kodlanmış değerler yok). Tabii ki olumsuz yönleri var, fakat veri güdümlü bir sistemin gelişim döngüsünün aşağısında, olumsuz yönlerinin gösterildiğinden eminim. Temel OOP tasarımınızın bu konuda hala geçerli bir çözüm olduğunu düşünüyorum ve varsayılan değerlerin hızlı bir şekilde düzenlenmesini istiyorsa, bir hiyerarşi sisteminin üstüne de kolayca uygulanabilir.
Dalin Seivewright 17:10

6
Her şey veriye dayalı olmak zorunda değil - oyunun ölçeğine bağlı. Cevabımın "yanlış" olduğunu düşünmek muhtemelen biraz kibirli, ama dürüstlüğün için teşekkür ederim. Bunun sadece benim için işe yarayan, her gün Flash oyunları yapan ve daha geleneksel gelişim modeliniz arasındaki tarz çatışması olduğunu düşünüyorum. Size yaklaşımımın uygulanmasının çok daha hızlı olduğunu ve derleme zamanı kontrolünün daha iyi olduğunu söyleyebilirim. Yorumunuz yeniden. Lua, askerin bunu destekleyecek bir platform üzerinde çalıştığını varsayar.
Iain

2
Bir RPG oyunu olmak, muhtemelen böyle her öğeyi uygulamak için oldukça pratik değildir.
Vaughan Hilts

1

Bu konuda gerçekten yeniyim, ancak yapma biçimim genel bir saldırı sınıfı oluşturmak.

Bir karakter örneği başka bir karakter örneğine saldırmak istediğinde, gerekli verilerle dolu saldırı sınıfının bir örneğini ve onu oluşturan karakterin kimliğini oluşturur. Teçhizattan yapılan ayarlamalar, xml belgesine girilebilecek veriler kullanılarak veya benzeri bir şey kullanılarak saldırı nesnesine uygulanır.

Bu sınıf örneği daha sonra çevrenin menzili veya benzerini belirlemesi için kancalar sağlamak üzere başka bir sınıfa sarılır. Saldırı geçerliyse, saldırı örneği, saldırıya uğrayan karaktere geçecek ve etkileri kim uygulayacak.

Umarım mantıklı geldi.

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.