RPG 게임에서 공격 클래스를 디자인하는 방법은 무엇입니까?


37

나는 작은 RPG 스타일 게임의 계획 단계에 있습니다.

캐릭터는 강도, 민첩성 등의 속성 집합을 가지며 정수로 표시됩니다. 캐릭터는 또한 공격 클래스로 표현 된 일련의 공격을가집니다.

각 공격마다 캐릭터 속성에 따라 피해를 입히고 싶습니다. 예를 들어, 공격 "검 슬래시"는 10dmg + 문자 강도 값을 수행합니다.

내가 생각한 방식은 추상 Attack 클래스가있는 추상 Attack 클래스를 사용하는 것입니다. 각 공격마다 Attack 메서드를 구현하는 클래스 하나를 만듭니다.

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>

지능과 화염 통계로 피해를 계산하는 화염 구와 같은 여러 능력치에서 값을 가져 오기 위해 이것을 확장 할 수도 있습니다.

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

모든 것에 동일한 기본 피해 공식을 사용하지 않으려면 (예 : 물리적 피해와 다르게 마법 피해를 계산) 필요한 각 공식에 대해 Attack의 서브 클래스를 작성하고 Attack을 대체하고 XML 파일에서 원하는 유형을 지정하십시오.


1
+1이지만 GetStatValue를 해당 스위치 문을 유지하지 않기 위해 일종의 조회 테이블로 바꿉니다.

1
이 방법의 문제점은 일반적인 데이터 중심 공격 만 가질 수 있다는 것입니다. 특별한 논리를 사용하는 것은 가질 수 없습니다. 당신은 매우 일반적인 아이템 세트로 끝날 것입니다 (워크 래프트에서 얻을 때
Iain

2
@Iain : 단순히이를 위해 더 많은 데이터를 추가함으로써 매우 쉽게 해결됩니다. 예를 들어, 더 많은 일을하거나 전혀 다른 방식으로 피해를 계산하는 SpecialAttack 하위 클래스가있을 수 있습니다. 필요한 동작을 식별 한 다음이를 데이터로 표현하면됩니다.
Michael Madsen

2
@Iain : 더 많은 필드를 추가하는 것 외에도 Lua와 같은 일부 데이터 필드는 표현식 또는 코드 블록 인 일부 데이터 필드로 해결할 수 있습니다. 직교 성분을 잘 사용하면 더욱 흥미로운 결과를 얻을 수 있습니다.

1
데이터 중심이라는 일반적인 아이디어는 +1입니다. xml 제안에 동의하지 않습니다. Lua를 임베드하는 경우 yaml, json 또는 일반 .lua 파일 형식이 더 좋습니다.
egarcia


2

원하는 행동으로 재정의하는 공격 방법이있는 무기 클래스가 있습니다. 그런 다음 게임에서 무기가 어떻게 보이는지, 인벤토리에서, 같은 클래스에서 팔리는 양 등을 처리 할 수 ​​있습니다.


6
-1, 이것은 데이터 중심 일뿐만 아니라 구성 요소 중심이 아니라 깊은 계층 구조입니다. 최악의 해결책입니다.

4
이 특정 방법이 데이터 중심이 아니기 때문에 나쁜 선택이 아니며 계층 구조가 그렇게 심하지 않을 것입니다. 올바르게 수행되면 (단, 하드 코딩 된 값이 없음) 간단하지만 여전히 강력합니다 (UnrealEngine은 이에 대한 완벽한 예입니다). 물론 단점이 있지만 데이터 기반 시스템의 개발주기가 더 짧아짐에 따라 단점이 있음을 확신합니다. 기본 OOP 디자인은 여전히 ​​유효한 솔루션이라고 생각하며 기본값을 즉시 편집하려는 경우 계층 시스템 위에서 쉽게 구현할 수 있습니다.
Dalin Seivewright

6
모든 것이 데이터 중심 일 필요는 없습니다. 게임의 규모에 따라 다릅니다. 내 대답이 "잘못되었다"고 생각하는 것은 다소 거만하지만 정직하게 감사합니다. 나는 이것이 나에게 맞는 것, 매일 플래시 게임을 만드는 것, 그리고 더 전통적인 개발 모델 사이의 충돌 스타일이라고 생각한다. 내 접근 방식이 구현 속도가 훨씬 빠르며 컴파일 타임 검사가 더 좋다는 것을 알 수 있습니다. 귀하의 의견 다시. Lua는 그 asker가이를 지원하는 플랫폼에서 작업하고 있다고 가정합니다.
Iain

2
롤 플레잉 게임이기 때문에 아마도 모든 항목을 구현하는 것은 비현실적 일 것입니다.
Vaughan Hilts

1

나는 이것에 익숙하지 않지만, 일반적인 방법은 일반적인 공격 클래스를 만드는 것입니다.

한 캐릭터 인스턴스가 다른 캐릭터 인스턴스를 공격하려고하면 필요한 데이터로 채워진 공격 클래스의 인스턴스와 해당 인스턴스를 생성 한 캐릭터의 ID가 생성됩니다. 그런 다음 xml 문서 또는 이와 유사한 형식으로 입력 할 수있는 데이터를 사용하여 기어 조정이 공격 객체에 적용됩니다.

그런 다음이 클래스 인스턴스는 다른 클래스 내에 랩핑되어 환경이 범위 또는 이와 유사한 것을 결정하기위한 후크를 제공합니다. 공격이 유효한 경우 공격 인스턴스는 공격중인 캐릭터에게 전달되며 누가 해당 효과를 적용합니까?

이해가 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.