2012-05-10 2 views
4

저는 개인 프로젝트로 매우 간단한 RTS 게임을 만드는 중입니다. 지금까지 약간의 실험 작업을 해왔고 타일, 카메라 및 유닛 이동이 잘 작동하고 있습니다.클래스가 컨테이너에 대한 참조를 유지하는 것이 좋습니까?

그러나 단위 선택 시스템에 기능을 추가하고 싶습니다. 몇 가지 질문이있었습니다. 유닛 목록이 포함 된 Player 클래스가 있지만 Squad 클래스를 만들려고했습니다. 주로 일부 그룹을 만들었고 해당 그룹에 쉽게 액세스 할 수있는 바로 가기를 사용했습니다. 그룹에 유닛을 추가하려면 새로운 유닛에 추가하기 전에 유닛을 현재 그룹에서 제거해야합니다. AddUnit 메서드는 Squad 클래스에 있지만, 유닛을 확인하고 제거하기 위해 내가 추가하는 각각의 새로운 유닛에 대해 다른 모든 유닛을 검색하고 싶지는 않습니다. Unit 클래스 내의 소유자 팀에 대한 참조를 유지하면 어떨까요? 그러면 더 쉽게 제거 될 수 있지만 괜찮습니까? 다른 플레이어에게 유닛을 전송하려는 경우에도 동일한 문제가 발생합니다. 유닛에 플레이어에 대한 참조를 유지할 수 있습니까? 글쎄, 나는 할 수 있다는 것을 알고 있지만 받아 들여질 수 있을까? 대안이 있습니까?

답변

3

네, 그렇습니다. 양방향 참조가있는 것이 좋습니다. 컨테이너에서 아이템으로 그리고 아이템에서 컨테이너로. 항목 (예 : Unit)을 사용하여 작업 할 때 모든 컨테이너에서이 항목을 검색하지 않고도 컨테이너를 가져 오는 것이 훨씬 쉽습니다. 유닛에서 참조를 얻는 것이 더 간단하고, 빠르며, 더 읽기 쉬울 것입니다. 이는 단순히 더 나은 디자인 일뿐입니다.

+1

또 다른 대안은 당신이하려고하는 추상화 수준에 따라 일종의 이벤트 처리기 패턴을 사용하므로'Squad'는 "청취자 제거"를 각 Unit에 등록합니다. '스쿼드 (Squad)'를 바꾸고 자하는 '유닛 (Unit)'은 청취자를 먼저 호출 한 다음 새로운 '스쿼드 (Squad)'에 자신을 추가합니다. –

+0

그렇다면 좋습니다. 그러나, 내가 스쿼드를 제거해야한다면 (스쿼드 목록에서 제거), 스쿼드에 있던 각 유닛은 여전히 ​​그것을 참조 할 것입니다 ... 스쿼드의 각 유닛을 반복적으로 반복해야하고 스쿼드 참조를 다음과 같이 설정해야합니다. 목록에서 제거하기 전에 null을? – Amaranth

+0

@Rob : 예, observer/observable 클래스에 대해 생각했지만 notifyobserver() 메서드가 내 필요에 너무 일반적이라고 생각했습니다. 그러나 필자는 자체적 인 유형의 리스너 인터페이스를 구현할 수 있습니다. – Amaranth

3

언어가 지원하는 경우 약한 참조를 사용하여 컨테이너의 분대를 명시 적으로 null로 설정하지 않아도 컨테이너를 해제 할 수 있어야합니다. 이는 오류가 발생하기 쉽습니다.

+0

나는 정직한 사람들에 대해 몰랐다.나는 체크했고 그것들은 C#에서 사용 가능하므로 아마 그 가능성을 탐색 할 것이다. 고맙습니다. – Amaranth

0

@dantuch는 일반적으로 수용 가능하다고 말하면서 동의하지만, 유닛과 스쿼드 (및 플레이어)의 개념을 어느 정도 타이트하게 묶는 지에 따라이 시점에서 좋은 생각인지 판단 할 수 있습니다.

스쿼드가없는 유닛에 대해 이야기하는 것이 합리적입니까? 아니면 플레이어가 없습니까?

질문에 대한 추가 질문으로 대답하고 있지만 추상적 인 방식으로 모델을 생각해보십시오. 이러한 개념을 단단히 결합하거나 허용되는 경우 관찰자 패턴은 주석에서 언급 한대로.

+0

사실, 제 게임 논리는 유닛이 분대없이 존재할 수 있도록합니다. 전에는 플레이어가 없어도 존재할 수 있었지만 중립 유닛에 대한 다른 플레이어 인스턴스를 만들었습니다. – Amaranth

관련 문제