จะออกแบบคลาสโจมตีในเกม RPG ได้อย่างไร?


37

ฉันอยู่ในช่วงการวางแผนของเกมสไตล์ RPG ขนาดเล็ก

ตัวละครจะมีชุดของคุณลักษณะเช่นความแข็งแกร่งความคล่องตัว ฯลฯ ซึ่งแสดงเป็นจำนวนเต็ม ตัวละครจะมีชุดของการโจมตีที่แสดงว่าเป็นระดับการโจมตี

ในการโจมตีแต่ละครั้งฉันต้องการให้มันสร้างความเสียหายตามคุณลักษณะของตัวละครเช่น: การโจมตี "ดาบเฉือน" จะทำ 10 dmg + ค่าของความแข็งแกร่งของตัวละคร

วิธีที่ฉันคิดว่าจะทำเช่นนี้คือมีคลาสการโจมตีที่เป็นนามธรรมซึ่งมีวิธีการโจมตีแบบนามธรรมและสำหรับการโจมตีแต่ละครั้งฉันจะสร้างคลาสหนึ่งที่ใช้วิธีการโจมตี

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

ฉันเห็นว่าสิ่งนี้จะทำให้ฝันร้ายรักษา

ใครบ้างมีความคิดว่าฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?

สิ่งที่ฉันคิดว่าเป็นปัญหาหลักคือวิธีการป้อนแอตทริบิวต์ที่ถูกต้องตามการโจมตี

คำตอบ:


34

คุณควรไปที่การออกแบบที่ขับเคลื่อนด้วยข้อมูลที่นี่

สร้างคลาสการโจมตีทั่วไปที่มีพารามิเตอร์ที่คุณต้องการใช้งาน - ความเสียหายพื้นฐานซึ่งสถิติส่งผลกระทบต่อความเสียหายชุดของเอฟเฟกต์สถานะที่เป็นไปได้ ... สิ่งที่ต้องการ:

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.
  }
}

จากนั้นทำการโจมตีของคุณในไฟล์เช่นไฟล์ XML และโหลดข้อมูลจากที่นั่น:

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

คุณสามารถขยายค่านี้เพื่อดึงค่าจากสถานะต่างๆเช่น Fireball ซึ่งคำนวณความเสียหายจากทั้ง Intellect และ Fire stat:

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

หากคุณไม่ต้องการใช้สูตรความเสียหายพื้นฐานเดียวกันสำหรับทุกสิ่ง (เช่นคำนวณความเสียหายเวทย์มนตร์แตกต่างจากความเสียหายทางกายภาพ) สร้างคลาสย่อยของการโจมตีสำหรับแต่ละสูตรที่คุณต้องการและแทนที่การโจมตีและระบุประเภทที่คุณต้องการในไฟล์ XML ของคุณ


1
+1 แต่ฉันจะแทนที่ GetStatValue ด้วยตารางการค้นหาของการเรียงลำดับบางอย่างเพื่อหลีกเลี่ยงการรักษาคำสั่งสวิตช์นั้น

1
ปัญหาของวิธีนี้คือคุณสามารถโจมตีด้วยข้อมูลทั่วไปเท่านั้นคุณไม่สามารถมีสิ่งใดที่ใช้ตรรกะพิเศษ คุณจะจบลงด้วยชุดของไอเท็มทั่วไปมาก ๆ (เมื่อคุณเข้าร่วม warcraft
Iain

2
@Iain: นั่นแก้ไขได้อย่างง่ายดายเพียงแค่เพิ่มข้อมูลเพิ่มเติมเพื่ออนุญาต ตัวอย่างเช่นคุณอาจมีคลาสย่อย SpecialAttack ซึ่งทำสิ่งต่าง ๆ ได้มากขึ้นหรือคำนวณความเสียหายในวิธีที่ต่างออกไปโดยสิ้นเชิง มันเป็นเรื่องของการระบุพฤติกรรมที่คุณต้องการแล้วแสดงว่าเป็นข้อมูล
Michael Madsen

2
@Iain: นอกเหนือจากการเพิ่มเขตข้อมูลเพิ่มเติมคุณยังสามารถแก้ไขได้โดยเขตข้อมูลบางส่วนเป็นนิพจน์หรือบล็อครหัสใน Lua การใช้ส่วนประกอบมุมฉากได้ดีก็ให้ผลลัพธ์ที่น่าสนใจมาก

1
+1 สำหรับแนวคิดทั่วไปในการขับเคลื่อนข้อมูล ฉันไม่เห็นด้วยกับการแนะนำ xml มีรูปแบบที่ดีกว่าคือ - yaml, json หรือไฟล์. lua ธรรมดาหากคุณฝัง Lua
egarcia


2

ฉันจะมีคลาสอาวุธที่มีวิธีการโจมตีที่คุณแทนที่ด้วยพฤติกรรมที่คุณต้องการ จากนั้นคุณสามารถจัดการกับลักษณะของอาวุธในเกมในสินค้าคงคลังปริมาณการขายและอื่น ๆ ในระดับเดียวกัน


6
-1, ไม่เพียง แต่เป็นแบบไม่ใช้ข้อมูลเท่านั้น แต่ยังมีลำดับชั้นลึกมากกว่าแบบอิงส่วนประกอบ มันเป็นทางออกที่เลวร้ายที่สุด

4
เพียงเพราะวิธีนี้ไม่ได้ขับเคลื่อนด้วยข้อมูลไม่ได้ทำให้มันเป็นตัวเลือกที่ไม่ดีและลำดับชั้นจะไม่เป็นเช่นนั้น มันง่าย แต่ก็ยังทรงพลัง (UnrealEngine เป็นตัวอย่างที่สมบูรณ์แบบของสิ่งนี้) หากทำอย่างถูกต้อง (เช่นไม่มีค่าฮาร์ดโค้ด) แน่นอนว่ามันมีข้อเสียของมัน แต่ยิ่งไปกว่านั้นรอบการพัฒนาของระบบที่ขับเคลื่อนด้วยข้อมูลฉันแน่ใจว่ามันมีข้อเสีย ฉันคิดว่าการออกแบบ OOP ขั้นพื้นฐานของคุณยังคงเป็นโซลูชันที่ถูกต้องในเรื่องนี้และหากเขาต้องการแก้ไขค่าเริ่มต้นได้อย่างรวดเร็วก็สามารถนำไปใช้กับระบบลำดับชั้นได้อย่างง่ายดาย
Dalin Seivewright

6
ไม่ใช่ทุกสิ่งที่จะต้องขับเคลื่อนด้วยข้อมูล - มันขึ้นอยู่กับขนาดของเกม มันอาจจะหยิ่งผยองที่จะคิดว่าคำตอบของฉันคือ "ผิด" แต่ขอบคุณสำหรับความซื่อสัตย์ของคุณ ฉันคิดว่านี่เป็นเพียงการปะทะกันของสไตล์ระหว่างสิ่งที่เหมาะกับฉันการสร้างเกม Flash ทุกวันและการพัฒนารูปแบบดั้งเดิมของคุณ ฉันสามารถบอกคุณได้ว่าวิธีการของฉันนั้นเร็วกว่าที่จะนำไปใช้และคุณมีการตรวจสอบเวลาคอมไพล์ที่ดีขึ้น ความคิดเห็นของคุณอีกครั้ง Lua สมมติว่าผู้ถามกำลังทำงานบนแพลตฟอร์มที่จะสนับสนุนสิ่งนั้น
Iain

2
ในฐานะที่เป็นเกมสวมบทบาทมันอาจจะเป็นไปไม่ได้เลยที่จะใช้ทุกอย่างเช่นนั้น
Vaughan Hilts

1

ฉันใหม่จริง ๆ นี้ แต่วิธีฉันจะทำคือการสร้างคลาสจู่โจมทั่วไป

เมื่ออินสแตนซ์ของตัวละครตัวหนึ่งต้องการโจมตีอินสแตนซ์ของตัวละครอื่นมันจะสร้างอินสแตนซ์ของคลาสการโจมตีที่เต็มไปด้วยข้อมูลที่จำเป็นและ ID ของตัวละครที่สร้างขึ้น การปรับจากเฟืองจะถูกนำไปใช้กับวัตถุจู่โจมโดยใช้ข้อมูลที่สามารถป้อนในเอกสาร xml หรือคล้ายกัน

อินสแตนซ์ของคลาสนี้จะถูกห่อในคลาสอื่นเพื่อให้ hooks สำหรับสภาพแวดล้อมเพื่อกำหนดช่วงหรือคล้ายกัน หากการโจมตีนั้นถูกต้องอินสแตนซ์การโจมตีจะถูกส่งผ่านไปยังตัวละครที่ถูกโจมตีใครจะใช้เอฟเฟกต์

หวังว่ามันสมเหตุสมผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.