Java 게임과 같은 RPG에서 항목을 어떻게 정의 할 수 있습니까?


21

Java에서 RPG 유형의 게임을 우연히 작업하고 있지만 모든 항목에 대해 다른 클래스를 만들지 않고 다양한 일을 할 수있는 항목을 얻는 방법을 알아내는 데 어려움을 겪고 있습니다.

예를 들어, 나무를 자르고 몬스터를 공격 할 수있는 도끼를 어떻게 만들 수 있습니까?

도마 또는 무기 클래스를 연장하면 다른 클래스를 확장 할 수 없습니다.

도마와 무기가 인터페이스라면 단검이 괴물을 공격하고 다른 도끼가 나무를자를 수있을 때 중복 코드가 많이 생깁니다.

단일 Item 클래스를 사용하고 파일에서 항목과 해당 기능을로드하는 방법이 있기를 바랍니다. 가능하다면 어떻게 할 수 있습니까? 그렇지 않다면 게임에 아이템을 넣는 가장 좋은 방법은 무엇입니까?

답변:


15

Gregory Weir의 대답은 여러 역할을 수행하기 위해 항목 인스턴스를 구성하는 방법에 대해 제가 가장 좋아하는 것입니다.

파일에서로드하려면

먼저 YAML을 사용하십시오. YAML은 유용한 데이터 기술 언어입니다. 비교적 빠르게 구문 분석하고, 사람이 읽고 편집 할 수 있으며, 이진 데이터를 지원하며, Java를 포함한 대부분의 프로그래밍 언어에 라이브러리가 존재합니다. 이것은 "파일에서 객체로 데이터를 얻는 방법"을 해결합니다.

둘째, 플라이급 패턴을 사용하십시오 . 해당 파일에서 읽은 대부분의 데이터는 정적입니다. 인스턴스별로 변경되지는 않습니다 ( "도끼는 1d10의 기본 피해를 입히고 나무는 부수지만 돌은 부수 지 않습니다"). 이것은 플레이어가 가진 5 개 축 모두에 해당합니다. YAML 파일에서 실제로 읽은 것은 이러한 플라톤 정의이며 개별 항목 인스턴스는 "내가 끊기 전에 얼마나 많은 스윙을합니까?", "플레이어가 제공 한 나에게 맞춤 이름? "등이 있습니다.

단일 인스턴스에서 인스턴스 간 데이터를 공유함으로써 많은 메모리를 보존하고 지속적인 게임 상태 (저장 게임 또는 플레이어 데이터베이스)없이 항목을 쉽게 업데이트 할 수 있습니다.

따라서 클래스 구조는 다음과 같습니다.

  • class 클래스-항목 당 하나의 인스턴스
    • 자신의 무기 인스턴스
    • 자신의 도구 인스턴스
    • 커스텀 이름 등
  • 무기 클래스-아이템 당 (최대) 하나의 인스턴스
    • Is-a ItemComponent
    • WeaponDef 참조
    • 보너스 마법 부여 레벨 등
  • 도구-항목 당 (최대) 인스턴스 1 개
    • Is-a ItemComponent
    • ToolDef 참조
    • 내구성 등
  • WeaponDef 클래스-무기 종류 당 하나의 인스턴스
    • 파일에서 읽을 때 필드는 일정해야합니다.
    • 기본 피해량, 1 ~ 2 손 등
  • ToolDef 클래스-도구 종류 당 하나의 인스턴스
    • 파일에서 읽을 때 필드는 일정해야합니다.
    • 기본 내구성, 파손될 수있는 물질 등이 있음

18

컴포넌트 (컴포지트 아님) 디자인 패턴은 이러한 목적에 적합합니다. http://gameprogrammingpatterns.com/component.html

기본적으로 Ax는 WeaponComponent와 ToolComponent를 포함하는 Item 클래스의 인스턴스입니다 (아마도). 무기로 사용할 수 있는지 테스트하려면 무기 구성 요소가 부착되어 있는지 확인한 다음 해당 무기 구성 요소 인스턴스와 대화하여 아이템의 무기 정보를 가져옵니다.

물론 파일에서로드하는 것은 별도의 연습입니다.


물론 구성 요소가 있으면 인터페이스를 다시 잘 활용할 수 있습니다. Ax 유형은 IChopper 및 IWeapon을 구현할 수 있지만 구성 요소의 동작을 노출시킬 수 있으므로 필요에 따라 유형과 구현을 재사용하고 구성 요소 테스트를 차단할 수 있습니다. 모든 축의 기능이 같지만 통계가 다른 경우 황금색입니다. 고유 한 능력을 가진 아이템이 필요한 경우 게임 컴포넌트 컬렉션을 구현하고 업데이트 루틴이 어떤 컴포넌트가 존재 하는지를 통해 객체가 무엇을 할 수 있는지 쿼리하도록해야합니다.
CodexArcanum

6
@CodexArcanum : "귀하의 Ax 유형은 IChopper 및 IWeapon을 구현할 수 있지만 구성 요소의 동작을 노출시킬 수 있습니다"-요점은 무엇입니까? 그것은 단지 클래스 계층 구조를 팽창시킵니다. 컴포넌트 패턴의 요점은 Ax 클래스 나 IChopper 인터페이스 나 IWeapon 인터페이스가 필요하지 않으며, 구체적인 Chopper와 Weapon 컴포넌트, 최상위 아이템 만 필요하다는 것입니다.

저는 현재 게임 아이템을위한 컴포넌트 시스템을 개발 중이며 실제로 패턴이 어떻게 사용되는지에 대한 하나의 주요 불만이 있습니다. 무기, 의복 및 소모품의 구성 요소를 고려할 때, 무기 및 의복이 될 수없는 품목 또는 소모품이기도 한 품목의 관점에서 항목이 이론적으로 "손상"될 수 있습니다. 논리적으로 항목은 하나의 "주요 구성 요소"만 될 수 있지만 구성 요소를 제한하면 구성 요소 시스템이 필요하지 않습니다. 따라서 놀라운 시스템을 가진 근본적인 결함 중 하나
Krythic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.