임의 / 일반 범주 노드로 변경 가능하고 다양한 jtree를 작성하려면 어떻게해야합니까?


12

참고 : 여기에 코딩 도움이 필요하지 않습니다 Programmers. 이유가 있습니다. Java에 대한 이해가 아닌 프로그램 계획 / 작성 기술을 향상시키고 싶습니다 .

나는이 LARP 게임에 대해 나열된 기술을 기반으로 임의 분류 시스템을 가지고 나무, 만드는 방법을 알아 내려고 노력하고있어 여기를 . 저의 이전 시도는 기술이 범주인지 여부에 대한 바보였습니다. 코드를 작성하는 것은 지저분했습니다. 내 나무를 그려 내 '잎'만 기술인 것을 알았고 다른 사람을 범주로 표시했습니다.

내가 추구하는 것은 Model과 View를 분리하려고 시도하는 트리를 만들고 임의의 부모에 임의의 자식 노드 유형을 추가 (편집 / 렌더링)하는 방법입니다.

위의 링크에서 다양한 기술을 나열한 트리

NB 이곳의 모든 것은 재산처럼 보이는 곳에서도 기술로 구입합니다. 최종 사용자는 이것을 구매 기술 (종이 atm에서하는 기술)로 간주하므로 모두 같은 페이지에 제시해야합니다.

나무에 대한 설명 : 나무는 하드 코딩 된 최상위 레벨 카테고리 ( 무기, 물리 및 정신, 의료 등) 로 '태어났습니다' . 이를 통해 사용자는 기술을 추가 할 수 있어야합니다. 궁극적으로 그들은 '한 손 검 전문화'추가 할 기술 ( 하지 예를 들어 항목). 이렇게하려면 ' Weapons선택됨 '을 선택한 상태에서 이상적으로 클릭 한 다음 One-handed해당 하위에 나타나는 콤보 박스 노드에서 선택한 다음 추가를 다시 클릭 하고 표시 되는 해당 하위 노드 의 텍스트 필드에 이름을 입력하십시오 . 그런 다음 추가를 다시 클릭하여 해당 리프의 '레벨'또는 '계층'을 추가 / 지정하십시오. 첫 번째 실력, 전문화 (예 : 전문성).

물론 다른 기술을 사고 싶다면 잎과 완전히 다른 경로입니다. 무기 예제와 마찬가지로 트리 아래로 같은 레벨에 콤보 상자가 필요하지 않으며 그 뒤에 다른 논리가 필요할 수도 있습니다. 이것이 내가 프로그래밍을하는 것만으로도 내 머리를 깎는 데 어려움을 겪고있는 것입니다. 어떻게 클래스의 집합을하고 있지 함께에서 이러한 사항을 추가하는 순서를 지정하지만, 여전히 그들에게 모두 적합 있습니다.

코드에서 이런 종류의 트리를 설명하기위한 좋은 시스템은 무엇입니까? 내가 본 다른 모든 JTree 예제에는 예측 가능한 패턴이 있으며 내 예제 는 그렇지 않습니다 . 이 모든 것을 '리터럴'로 코딩하고 싶지 않고 하위 노드의 유형 (콤보 상자, 텍스트 필드 등)에 대한 상위 목록이 어떤 부모에 허용되어야합니다. 추상 클래스를 사용해야합니까? 인터페이스?

위에 나열되지 않은 다른 기술을 추가하여 다르게 동작 할 때 이러한 종류의 개체 클러스터를 어떻게 확장 할 수 있습니까?

이 경우 되지 사용하는 것이 시스템, 이런 종류의 작업을 수행하는 방법을 사용하기위한 좋은 방법은 무엇입니까?

머리 속 기어가 돌고 있습니다 :

나는 항상해야합니다 :

  • 부모 확인
  • 부모를 기반으로 옵션 제공

이 공통점 skill때문에 기술과 범주에 대한 일반적인 방법을 정의 / 개요하는 일종의 추상 / 인터페이스 클래스가 필요하다고 생각하기 시작했습니다 . 나는 규칙과 옵션을 데이터베이스에 넣고 거기에서 읽을 수 있습니다. 문제는 지금 추상 또는 인터페이스 방법과 구현 방법 사이에 있다고 생각합니다.


데이터 에서 SkillComponents 대한 추상 클래스를 해시 한 다음 기본 클래스를 확장하여 개별 사례를 지정하기 시작했습니다. 트리는 단순히 데이터를보고 적절하게 그립니다. 작동하면 대답하겠습니다.
Pureferret

질문 : 인생은 증분 될 수있는 "레벨"속성을 가진 기술입니다. 이것이 인생에 고유 한가? 아니면 다른 기술도 레벨에 따라 증가 할 수 있는가? "Specializable"과 같은 여러 인터페이스와 함께 트리를 구축하기 위해 추상 "Skill"또는 "Category"또는 "SkillNode"클래스와 같은 솔루션에서 추상 클래스와 여러 인터페이스의 조합을 상상할 수 있습니다. "또는"Levelable ", 트리 구조에 필요하지 않은 다양한 기능을 혼합합니다. 재미로 댓글을 달기 만하면 원하는 것을 찾을 수 있습니다.
David Kaczynski

질문에 jTree를 지정하십시오. 텍스트 필드와 콤보 상자를 노드로 표시하는 방법에 대해 묻고 있습니까, 아니면 Java 이외의 디자인을 찾고 있습니까?
psr

@DavidKaczynski 당신은 머리에 못을 쳤다. 그런 종류의 일을 최대한 빨리 시작하겠습니다.
Pureferret

@psr 나는 클래스의 체계화 된 패턴 ( '디자인 패턴'일 필요는 없음)이 있는지 확인하려고 노력하고 있습니다. DavidKaczynski는 이에 매우 가깝습니다.
Pureferret

답변:


3

간단한 가변 JTree 예제

여기에 이미지 설명을 입력하십시오

코드 (위의 이미지를 만들기 위해 Java 7을 준수하고 테스트 함) :

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;

public class SimpleTree extends JFrame {
    public static void main(String[] args) {
        new SimpleTree();
    }

    public SimpleTree() {
        super("Mutable Varied JTree");
        Container content = getContentPane();
        N root = new N("Root");

        N weapons = new N("Weapons").add(
            new N("One-handed").add(
                new N("Sword").add("Proficiency", "Specialization"), 
                new N("Mace").add("Proficiency")),
            new N("Bow").add("Proficiency"));
        root.add(weapons);

        N phys = new N("Physical & Mental").add(
            new N("Life"),
            new N("Strength").add(
                "Double", "Triple", "Quadruple"));

        root.add(phys);
        N med = new N("Medical");
        med.add(new N("Bind Wounds"));
        med.add(new N("Set Broken Bones"));
        root.add(med);

        JTree tree = new JTree(root);
        content.add(new JScrollPane(tree), BorderLayout.CENTER);
        setSize(275, 300);
        setVisible(true);
    }

    private class N extends DefaultMutableTreeNode {
        public N(String s) { super(s); }
        public N add(String... strs) {
            for (String s : strs) {
                super.add(new N(s));
            }
            return this;
        }
        public N add(N... ns) {
            for (N n : ns) {
                super.add(n);
            }
            return this;
        }
    }
}

이 JTree 튜토리얼에 대한 특별한 감사

업데이트 : 가능한 솔루션에 대한 토론

프레임 하단의 버튼을 사용하여 노드를 추가 / 제거 / 삭제 하는 동적 트리 만들기에 대한 자습서 가 있습니다.

콤보 박스 등의 경우 적절한 스윙 클래스의 객체를 가져 와서 java.swing.tree.MutableTreeNode를 구현하는 JComboBox와 같은 객체로 만들고 싶습니다. Java Swing Tutorial에는 컨트롤 목록이 있습니다 .

사용자가 추가하려는 노드 종류를 선택하고 노드를 편집 할 수 있도록 사용자 인터페이스 요소를 만들어야합니다. 콤보 상자를 추가하면 상자에서 사용할 수있는 선택 항목을 정의 할 수 있어야합니다.

데이터를 저장하려면 기본 데이터 모델이 필요합니다. 모든 Java 객체에 기본으로 제공되는 기본 직렬화 체계를 사용할 수 있지만 프로토 타입 전용입니다. 프로그램 코드를 변경하면 중단됩니다. JDBC 또는 JPA와 함께 데이터베이스를 사용하거나 JSON 또는 XML과 같은 것을 스토리지 형식으로 사용하여 고유 한 직렬화 루틴을 작성하거나 직렬화를 처리하는 라이브러리를 사용해야합니다.

업데이트 : 프로젝트 개요가있는 제안 솔루션

가장 간단한 해결책은 데이터베이스를 잊어 버리고 데이터의 XML 표현을 먼저 찾은 다음 XML 파일을 편집하고 특수한 콤보 상자없이 JTree로 결과를 표시하는 것입니다. 이것이 Chibueze Opata가 그의 대답으로 제안한 것이라고 생각합니다. 이 트리의 일부 XML 표현은 다음과 같습니다.

<folder name="Physical &amp; Mental">
    <int name="Life">12</int>
    <drop-down name="Strength">
        <option name="Single" />
        <option name="Double" />
        <option name="Triple" />
        <option name="Quadruple" />
    </drop-down>
</folder>
<folder name="Medical">
    <text name="Bind Wounds" />
    <text name="Set Broken Bones" />
</folder>

다음은 몇 가지 잠재적 인 이정표입니다.

  • XML 또는 JSON 데이터 형식을 구성한 다음 해당 형식의 파일을 읽고 콤보 상자없이 폴더와 파일없이 JTree로 표시하는 프로그램을 작성하십시오.
  • JTree 디스플레이에 스윙 컨트롤 추가
  • 동일한 파일을 작성하도록 프로그램을 확장하십시오
  • 사용자가 GUI를 사용하여 노드를 추가 및 편집 할 수 있도록 사용자 인터페이스 작성

각 마일스톤이 끝날 때마다 프로그램 백업을 저장하십시오. 다른 머신에 설치된 소스 제어 시스템이 이상적입니다. 코드 공유가 마음에 들지 않고 소스 컨트롤이있는 서버를 설정하지 않으려는 경우 github 또는 sourceforge 또는 기타 공개 소스 컨트롤을 사용할 수 있습니다.

이러한 솔루션 중 하나는 많은 작업이며 초보자 프로젝트보다 훨씬 큽니다. LARP를 플레이하는 것보다 Java Swing 및 XML 또는 JSON을 배우는 데 훨씬 더 많은 시간을 할애한다는 것을 의미하기 때문에 기존 도구로 수행하는 옵션을 먼저 살펴 보았습니다. 그러나 무엇이든 배우는 가장 좋은 방법은 배우려는 동기가 가장 큰 방법입니다. 따라서 이것은 당신에게 완벽한 프로젝트 일 수 있습니다.

도움이 되길 바랍니다.


안녕, 나는 단지 내 전화에있어서 이것을 완전히 검토 할 수는 없지만 내가 겪고있는 것처럼 보이지만 내 질문에 따르면 다양한 유형의 노드를 교환 할 수 있어야합니다. 그래도 트랙에 +1!
Pureferret

1
"DefaultMutableTreeNode는 노드의 부모와 자식을 검사하고 수정하는 작업을 제공합니다." docs.oracle.com/javase/7/docs/api/javax/swing/tree/…
GlenPeterson

글렌, 이것에 대한 나의 문제는 이것이 하나의 잠재적 인 나무를 나타내지 만, 이것은 캐릭터의 기술을 나타내지 않을 수도 있다는 것입니다. 텍스트 필드에 무기 유형을 입력하고 드롭 다운 콤보 상자에서 일부 옵션을 선택할 수 있어야합니다. 이런 의미에서 변경이 가능 하며 임의의 자식을 허용 합니다. 여기에는 하나의 하위 노드 유형 인 N이 있습니다. 더구나, 나는 실제로 코드를 따르지 않습니다 (예를 들어 좋은 예입니다), 이런 종류의 물건 / 나무 / 데이터 모델에 대한 일반적인 디자인 패턴 .
Pureferret

1
자, 사람들은 개요처럼 나무를 만들 수있는 프로그램을 원합니다. Microsoft Word에는 이미 아웃 라인보기가 있습니다. OpenOffice / LibreOffice Write에는 비슷한 기능이 있습니다. 그 밖에 무엇이 필요합니까?
GlenPeterson

1
나는 내 모든 질문으로 사람들을 잘못된 길로 문지르는 것을 알고 사과합니다. 그러나 문제를 이해하려면 그렇게해야합니다. 귀하의 질문에 대한 답변 일 수도 있고 적어도 스스로 답변하는 방법에 대한 지침으로 위의 솔루션 끝 (큰 "업데이트"제목 아래)을 업데이트했습니다. 도움이 되길 바랍니다.
GlenPeterson

2

JTree가 해결하려는 문제에 대한 올바른 표현이라고 생각하지 않습니다. 귀하의 웹 사이트를 살펴본 결과 목록이 표시됩니다. 이것은 훌륭한 시작이지만, 당신이 가지고있는 기본 데이터 디자인이 있다고 생각하지만 보이지는 않습니다.

삶과 힘은 나에게 성격 속성처럼 보입니다. Double, Triple 및 Quadruple은 Strength 속성의 값처럼 보입니다. 그런 다음 기술이 무기와 의료로 나뉩니다. 나는 무기를 소유물 (사고, 찾거나 떨어 뜨릴 수있는)로 생각하며, 그 기술이 주어진 무기로 효과적 일 수 있다고 생각합니다. 그러나 내가 보는 방식으로, 무기와 약에는 기술이 없습니다. 사실, 나는 캐릭터가 데이터 디자인의 중심 인물이라고 강력하게 생각합니다.

지금까지 디자인에서 눈에 띄는 세 가지 데이터 객체가 있습니다.

Character:
    Life (a value: e.g. 12)
    Strength (a value: e.g. double, triple, quadruple)
    Skills (list or set of weapon-skills, healing-skills)
    Possessions (list of weapons, armor and other possessions)
    WornArmor (maybe only wear one you possess at a time?)
    WieldedWeapon (one or two of your posessions)

Skill:
    Skill-Type (healing, manufacture, or weapon)
    RelevantWeapon (for this skill)

Weapon:
    IsOneHanded (boolean)
    IsBow (boolean)

이제 캐릭터는 무기와 기술을 가질 수 있지만, 실제로 좋은 공격을하려면 사용하는 무기에 특정한 기술이 필요합니다. 어쨌든 여기에는 일대 다 관계가 있습니다 (한 캐릭터가 많은 기술을 가질 수 있음). 하지만 아직 나무가 보이지 않습니다.

종이를 들고 첫 페이지에 캐릭터를 페이지 중앙에 놓고 그 주변에 5-10 개의 가장 중요한 게임 세계 개체를 나열하십시오. 나무, 텍스트 필드 또는 콤보 상자를 생각하지 않고 다른 개체의 속성 인 데이터 (예 : 생명과 힘이 캐릭터의 불가분의 일부 임)와 개체 간의 가장 중요한 관계가 무엇인지 파악하십시오. 개체 사이에 선을 그려 관계를 나타냅니다. 그런 다음 1 : 1, 1 : 1 및 많은 관계를 파악하고 레이블을 지정하십시오. "Has-a"및 "is-a"및 다른 종류의 관계도있을 수 있습니다.

WeaponSkill vs. HealingSkill vs. ManufactureSkill에 대해 별도의 표현이 필요하다고 결정할 수 있습니다. 또는 기술 유형이 어떤 필드인지 결정하는 필드와 함께 하나의 기술 테이블 (위의 예에서는)에 속할 정도로 유사하다고 결정할 수 있습니다.

지금까지의 시도에 만족하지 않는다는 것은 좋은 표시입니다. 하나를 선택하기 전에 많은 가능성을 기꺼이 고려하고 있다는 의미입니다. 더 많은 스케치를 고려할수록 최종 디자인이 더 좋아집니다. 결국 가장 좋은 것이 데이터 다이어그램이됩니다. 이것이 잘 정립되면 "콤보 상자"또는 "텍스트 필드"에 대한 생각으로 되돌아 갈 수 있지만 UI 결정은 끝까지 남겨 둡니다.

JTree를 보지 않고 데이터 구조, 데이터베이스 디자인 및 데이터 모델링 주제를 살펴 보는 것이 좋습니다. 편집-> David Kaczynski가 제안한대로 더 나은 엔티티 관계 매핑 다이어그램! <-EDIT 만약 당신이 데이터 디자인을 올바르게한다면, Java와 UI는 명백하고 자연스럽게 그것으로부터 흘러 나올 것입니다. 그러나 당신이 잘못하면 Java-kung-fu 또는 UI-beauty가 그것을 고칠 것입니다.

행운을 빕니다!


2

객체 모델에 중점을 둘 것입니다.

원하는 유연성을 위해 클래스를 지식 (아마도 "정의"가 더 나은 단어 임) 계층과 트랜잭션 계층으로 분리하려고합니다. "계층"이란 말은 머리에서 논리적으로 분리한다는 의미입니다. 지식 레이어에는 트리 레이아웃 방법에 대한 정의가 포함되어 있으며 트리의 데이터는 게임 디자이너가 제공하며 데이터 레이어는 특정 캐릭터에 대한 특정 선택을 저장합니다.

수학적으로 깨끗한 모델이 아닌 멋진 게임을 만들려고하기 때문에 지식 수준이 약간 지저분 해집니다.

지금까지 가지고있는 것을 정리하려고하면 SkillDefinition 클래스에 SkillDefinition 유형의 Parent 속성이 있다고 생각합니다. 또한 몇 가지 경우를 다루기 위해 SkillDefinition의 서브 클래스 (데이터베이스의 DEF_SkillType 테이블에 항목이 될 수 있음)가 있습니다.

"무기", "물리 및 정신"및 "의료"는 제목 (및 자녀 기술)에 지나지 않습니다.

"한손", "강도"및 "바인드 상처"에는 연관된 콤보 상자가있는 것 같습니다 (데이터베이스의 DEF_Skill에 대한 외래 키가있는 DEF_SkillChoice 테이블과 같은 의미). 소드와 보우는 사용자 정의 문자열 인 것 같습니다 (따라서 지식 수준에는 관련 테이블이 없지만 데이터는 트랜잭션 계층에 저장됩니다).

"생명"에는 이와 관련된 정수가있는 것 같습니다. 정수를 증가시키는 방법에 대한 암시 적 동작이 있기 때문에 정수를 사용하는 미래의 특성과이 클래스를 공유하지 못할 수도 있습니다. 어쨌든 현재 자체 클래스가 필요합니다.

"소드", "활", "강도"및 "바인드 상처"는 모두 트리에서 그 아래에 진보적 인 기술 수준이있는 것으로 보입니다. "Sword"와 "Bow"의 경우, 해당 레벨은 실제로 부모 기술과 관련이 있습니다. 규칙적인 합법적 인 값 모음 (DEF_Skill에 대한 외래 키가있는 DEF_SkillLevel 테이블)이있는 ProgressiveSkillDefinition 클래스가 필요하다고 생각합니다. 지식 수준에서는 모델링중인 규칙이 명확하지 않습니다. 모든 무기에 대해 "무기"레코드에 대한 외래 키가있는 "숙련"및 "전문화"레코드가있는 DEF_SkillLevel 테이블이있을 수 있습니다.

여기에는 지식 수준에서 알고있는 내용이 포함됩니다. 거래 수준 (아마도 "문자 수준"이 더 나은 이름일까요?)은 적절한 지식 수준을 가리 킵니다. 예를 들어, 실제로 보유하고있는 기술 모음을 보유한 Skills 객체가있는 Character 객체가 있습니다.

따라서 캐릭터는 부모가 "검"기술이고 유형이 Skill_Level 인 "숙련"기술을 갖게됩니다. 데이터베이스에서 TRANS_SkillDefinition 레코드에는 트랜잭션 "소드"스킬 레코드에 대한 외래 키와 이름이 "Proficiency"인 지식 레벨 DEF_SkillLevel 레코드가 있습니다.

숙련 스킬은 Skill_UserNamed 유형의 "검"스킬의 상위 오브젝트를 갖습니다. "소드"(사용자 이름)에 대해 특별히 정의 된 것이 없기 때문에 데이터베이스에는 지식 수준에 대한 외래 키가 없습니다. 그러나 또한 부모 트랜잭션 레코드에 대한 외래 키가 있으므로 더 많은 정보를 사용할 수 있습니다.

"칼"스킬 개체는 사용자가 "한손"범주에 "칼"을 넣기로 선택했기 때문에 "한손"의 부모 개체를 갖습니다. SkillCategory 유형의 개체입니다. 데이터베이스에는 레코드 "한손"에 대한 DEF_SkillChoice 테이블에 대한 외래 키가 있으며이 기술에 대한 모든 추가 데이터가 지식 수준에 저장되므로 트랜잭션 부모가 없습니다.

새로운 캐릭터를위한 초기 트리를 구성 할 때는 지식 수준 만 쿼리하면됩니다. 캐릭터에 대한 선택을하려면 트랜잭션 레벨이 필요합니다.

객체 모델을 트리로 변환하고 다시 변환하는 코드가 필요합니다. 지식 계층의 각 유형에는 해당 유형에 적합한 데이터를 가져 오는 관련 컨트롤 집합이 트리에있을 것입니다.

나중에 SkillCategory 레코드에서 각 선택에 대한 클래스를 원할 수 있습니다 ( "전문화"와 관련된 동작이있는 경우 코드는 어딘가로 이동해야 함).이 트리에는 아직 필요하지 않으며이 디자인은 호환됩니다. 그것으로. 지식 수준 정보를 사용하여 올바른 개체를 작성하는 팩토리가 있어야합니다.


이것이 확실하지 않거나 질문에 대답하지 않는 경우 알려주십시오. 그것은 큰 주제이고 어느 시점에서 나는 멈춰야했다.
psr

이것은 실제로 내가 원하는 것, 에뮬레이션하는 시스템의 코드에 자연스러운 느낌 및 작동하는 것에 가장 가까운 답입니다. 지금 내 기술은 모두 추상 SkillComponent (AbSkillComponent, 추상 클래스에 대한 좋은 명명 규칙을 찾을 수 없으므로)에서 파생되며 드롭 다운 상자와 UserNamed 부분을 수행하는 RootSkillComponent, SkillComponent 및 일부 인터페이스가 있습니다. 이것이 데이터베이스와 관련이있는 방법, 지금 당장 내놓고있는 것에 대해 추가해 주셔서 감사하지만 생각할 가치가 있습니다. 이 답변은 매우 좋으며 신선한 공기를 마셔야합니다.
Pureferret

@Pureferret-그때와 같이 대답을 남길 것 같아요-당신이 무엇을 찾고 있는지 확신하지 못했습니다.
psr

1

결국 우리는 항상 계층 구조를 관리하는 것으로 끝납니다. 프로그램의 클래스 계층 구조 또는 프로그램 자체가 "내부 세계"(GUI, DB 연결, 데이터 바인딩 비즈니스 논리 등)에 연결되는 다른 모듈로 구축 된 것입니다. . 그러나 이것은 철학입니다. 귀하의 경우 어떻게 작동해야합니까?

이 트리에는 노드가 있으며 각 항목은 "객체 인스턴스"입니다. 그들의 행동 (당신이 그것들을 넣을 수있는 곳, 허용되는 자식 노드 목록 등)은 "클래스"와 같은 일부 집합에 공통적입니다. 예, 이것은 프로그램 코드와 같습니다. Java 리플렉션을 충분히 알고 있다면 POJO 클래스와 상속 계층 구조를 사용하여 IoC 컨테이너 또는 팩토리 메커니즘을 사용하여 실제 인스턴스를 빌드 할 수 있습니다. 그러나 나는 당신이 그것을 원하지 않는다고 생각합니다. 왜냐하면 그것은 언어 해킹이기 때문입니다.

먼저 항목의 동작을 설명하는 "클래스"개체를 만듭니다. 여기에는 클래스 식별자, "필드"이름 및 허용되는 유형 및 항목 수 등이 포함됩니다. 예 : "루트"클래스는 "플레이어 속성"이며 "물리적 / 정신", "의료", "무기"필드가 있습니다. 이 유형은 "최종"입니다. 현재 다른 플레이어 유형을 원하지 않습니다. 힌트 : 나중에 "비인간 몬스터"를 처리하기 위해 동일한 도구를 사용하여 할 수 있습니다 ... :-)

"의료"필드는

  • "단일": 플레이어는 여러 "의료"정보를 가질 수 없습니다
  • 하위 유형은 고정되어 있으며 여기서 "의료"유형의 객체 만 사용할 수 있습니다
  • 필수 : 플레이어를 만들 때 "의료"필드가 있어야합니다

반대로 무기 회원은 필요하지 않으며 플레이어에 첫 번째 무기를 추가 할 때 생성해야합니다. 즉, "객체"(현재 플레이어)를 "편집"하고 새 항목을 추가 할 수있게하려면 인스턴스의 실제 속성 (현재 무기가 포함되지 않음)으로 선택을 제한해서는 안됩니다. "), 클래스 정의의 모든 필드를 표시하고 처음 사용할 때 새 필드 (자식 노드)를 느리게 만듭니다. 이것은 확장 가능한 환경을 만듭니다. 나중에, 여러 명의 플레이어와 함께 "Friends"필드를 추가 할 수 있습니다.

실제 "클래스"로 프로세스를 따르십시오. 무기 종류 (도검, 단검, 활 등)를 분리하고 탄약을 처리하는 것이 좋습니다 (플레이어는 활이 없지만 화살을 수집 할 수 있음을 알고 있지만 특정 무기는 탄약을 요구하거나 감소 시키며, 그중 일부는 발견 될 수 있고, 다른 무기는 잃어 버릴 수 있습니다 ...) "무기"클래스 아래 : 조사하기가 더 쉽고 플레이어가 해당 아이템 만 가지고 있거나 사용할 수 있는지 보여줍니다 ( 기술이 있습니다). 반면에 게임을 개발함에 따라 나중에이 구조를 바꿀 것입니다.

게임을 시작할 때 초기화 할 수있는 전 세계적으로 사용 가능한 "클래스 스토어"를 만들고 누군가가 자신의 이름을 언급 할 때 클래스 정의를 제공하십시오. 이 경우 클래스 def 객체는 변경할 수 없어야합니다.

"개체"가 더 쉽다 : 클래스 정의에 대한 참조와 필드에 대한 일반 액세스를 포함하는 동일한 루트 클래스에서 파생 될 수있다. 아마도 HashMap을 사용하여 필드 이름으로 식별 된 해당 하위를 포함 할 수 있습니다. 이러한 필드 중 일부는 단일 객체를 포함하고 다른 일부는 객체 세트를 포함합니다. 물론 이러한 인스턴스는 변경 가능합니다.

이제 인터페이스입니다. 먼저, JTree tutorial ...을 확인 해야합니다. 이제 분명합니다. 각 "객체"는 DefaultMutableTreeNode로 표시 될 수 있으며, 노드의 "userObject"는 객체 여야합니다 (해당 노드의 toString ()이 노드의 레이블로 표시되지만 사용자 정의 셀 포맷터를 작성할 수 있습니다). 노드를 열 때마다 객체의 필드를 탐색하고 부모 아래에 하위 노드를 작성하거나 (동적으로 수행하려는 경우) JTree를 표시 할 때 전체 트리를 탐색하고 TreeNode 구조를 빌드하십시오 (힌트 : TreeNode 매개 변수가있는 JTree 구성자입니다).

트리에서 노드를 선택하면 Object 인스턴스가 있습니다. 클래스별로 적절한 편집기 패널 또는 클래스 정의에 의해 생성 된 일반 패널을 표시 할 수 있습니다 (예 : 필드가있는 탭 패널, 필드 선언에 의한 실제 필드의 편집기 : 적절한 유형의 하위를 작성하는 버튼). 를 사용하면 사용 가능한 클래스 중 하나를 선택할 수 있으며 무기 속성과 같은 해당 인스턴스의 편집기 필드를 선택할 수 있습니다. 구조를 수정 한 후 Tree 자체를 새로 고쳐야합니다. TreeModel 및 해당 fire ... change 함수는 친구입니다.

멋져 보여? 아니면 너무 복잡합니까? 글쎄, 이것은 이야기의 작은 부분입니다. 나는 이야기하지 않았다

  • 클래스 정의 계층 구조 또는 분류 같은 필드에 다른 종류의 칼을 추가하는 것을 지원할 때 그중 하나를 사용하는 것이 좋습니다. 분류 전문가 : 클래스에는 고정 상속 트리가 아닌 여러 범주가있을 수 있습니다. 기술 향상에 XP를 사용할 때 플레이어의 "모든 기술"을 수집하려는 경우 좋은 물건 ... :-)
  • 지속성 지원 : 속성 또는 JSON 파일과 같이 객체 계층을 외부에 저장하는 일반 솔루션을 만들어야합니다. 두뇌를 건강하게 유지하려면 사람이 읽을 수있는 형식 인 이진 직렬화를 사용하지 마십시오.
  • 인스턴스 스토리지 : 게임의 "세계"를 한 곳에 보관하는 것이 좋습니다. 특정 검은 플레이어의 자산이 아니지만 게임 내 세계의 개체 (플레이어가 잃어 버리거나 누군가가 찾을 수있는 등)이므로 트리의 이러한 "개체"는 실제로 개체에 대한 참조입니다. (플레이어의 건강과 같은 다른 사람들은 실제로 속성 일뿐입니다). 두 유형을 분리하고 참조를 해결할 수있는 인스턴스를위한 글로벌 스토리지가 있어야합니다. 게임 상태를 직렬화 할 때도 절약 할 수 있으며 여러 엔티티가 동일한 다른 엔티티를 참조합니다 (예 : 동일한 사원에 대한 여러 플레이어의 "위치").
  • (그리고 실제 두뇌 분쇄기 : 클래스 스토리지와 인스턴스 스토리지의 유사성; 유형 선언은 프로그램 구성 요소, 활성 창, 사용자 세션 등과 같은 방식으로 객체 인스턴스 자체가 될 수 있습니다.) 나 같은 미치광이들.)

어쨌든,이 워밍업 세션을 사용할 수 있기를 바랍니다.


1

나는 당신에게 긴 대답을하지 않을 것이지만, 나는 솔직히 이런 종류의 상황에 직면 해 왔으며 솔직히 기존 데이터 구조를 사용하려고 포기했습니다. XML 노드와 비슷한 새 부모와 자식을 받아 들일 수있는 내 자신의 개체를 만들었습니다.

그러나 귀하의 경우에는 Xml 클래스를 사용하는 것이 도움이 될 것이라고 생각합니다. 그런 다음 각 노드에 대한 속성을 사용하여 클래스가 기술인지 알 수 있으며 콤보 상자 등에서 사용할 노드의 부모와 자식을 쉽게 얻을 수 있습니다.

또한 많은 텍스트 / 문자열을 가지고 있다는 생각에서 벗어나지 말아야한다고 덧붙이고 싶습니다. 게임에는 일반적으로 AI가 포함되고 AI에는 일반적으로 많은 텍스트가 포함됩니다.


이 게임은 프로그램을 통해 재생되는 것이 아니라 단지 지속적인 데이터와 논리를 제공하는 것입니다. 그래도 XML을 살펴볼 것입니다. 감사!
Pureferret
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.