2015-01-07 2 views
1

그래서 내 게임에서 주문을 구현하는 방법을 알아내는 데 어려움을 겪고 있습니다. 문제는 (텔레포트, 텔레 키네시스, 사격 통제 등) 다른 주문을 많이 추가하고 싶다는 것입니다. 이 좋은 듯 시작시게임에서 많은 주문을 만드는 데 문제가 있습니다.

Spell -> Passive ->Speed 
       ->Flying 

     -> Active ->Teleportation 
        Telekinesis 

하지만 주문을 많이 구현 시작했을 때 그것은 혼란스러워하기 시작했다 : 나는 시도 우선처럼 큰 클래스 계층 구조를 만들고 있었다.

다른 솔루션을 검색 한 결과 엔티티 구성 요소 기반 시스템이 발견되었습니다. 하지만 좋은 해결책이 될 것이라고는 생각하지 않습니다. 이 문제에 대한 다른 접근 방식에 대해 알고 계신 분도 있습니까?

답변

3

를 보내 당신은 Strategy Design Pattern 같은 것을 사용하고 어디 ApplySpell()으로 이러한 방법을 정의하는 인터페이스를 가지고있는 경우 어쩌면 Name 속성과 콘크리트 철자가 인터페이스를 구현 했습니까?

그런 식으로 각 문자에 대해 할당 된 마법을 반복하고 Name 속성을 사용하여 이름을 가져올 수 있습니다 (어쩌면 UI 등으로 나열 할 수도 있음) 또는 사전에 저장할 수도 있습니다 여기서 주문의 이름은 열쇠이고, 실제 철자 구현은 값입니다.

당신이 할 수있는 일은 사용자가 주문을 선택하면 ApplySpell()으로 전화를 걸고 실제 주문이 무엇인지 나타내는 것은 해당 주문을 나타내는 클래스에 위임 된 것입니다.

이렇게하면 모든 장면이 뒤에서 이루어지기 때문에 어떤 주문을 불러야할지 걱정할 필요가 없습니다.

+0

나는 당신의 솔루션에 동의하지만 C#은 자바가 아니며 "string SpellName {get;}"이 더 적합하다고 생각합니다. – Orace

+0

그건 그렇고, 우리는 Spell 인터페이스에 있으므로 "SpellName"은 중복됩니다. 마지막으로 "string Name {get;}"으로 충분합니다. – Orace

+0

@Orace : 나는 당신이 의미하는 것을보고 완전히 동의합니다. 수정 됨. – npinti

0

각 종류의 마법에 대해 여러 개의 클래스를 만드는 대신 하나의 Magic 클래스에서 모든 클래스를 감싸기 시작하고 트리거별로 처리하십시오.

switch(castID) { 
default: 
    break; 
case 1: //air strike 
    Spell AirStrike = new Spell('AirStrike'); 
    break; 
case 2: 
    ... 
} 

그리고는 맞춤법에 대한 클래스를 가지고 각각 PARAMS에 따라 거기에 주문 처리

1

상속은 좋아하지만, 속성에 대해 당신은 속성으로 인터페이스 또는 기본 클래스를 사용할 수 있습니다

순간 이동을 위해 다음
class SpellBase 
{ 
    public string Name { get; protected set; } // all spells have to have name 
    public virtual void Animate() { ... } // abstract? 
    ... 
} 

class TeleportationSpell: SpellBase, IEffect 
{ 
    ... // set name, override Animate() and implement IAreaEffect (as OnSelfEffect() for teleport) 
} 

interface IEffect 
{ 
    public EffectBase Effect {get; set;} 
    ... 
} 

class EffectBase { ... } 

class OnSelfEffect: EffectBase { ... } 
class OnTargetEffect: EffectBase { ... } 
class OnSelfAndTargetEffect: EffectBase { ... } 

인터페이스 계층 구조 덜 가지가 만들 것입니다,하지만 더 필요합니다 구현할 코드 (일반적인 코드를 메서드로 옮기고 호출 할 수 있으므로 실제로는 문제가되지 않습니다.)

1

Entity-Component Approch는 문제를 해결하는 좋은 방법입니다. :) 당신은 그것을 이해하는데 더 많은 시간을 투자해야합니다.

항상 "is"또는 "have"관계를 결정해야합니다. "is is"는 상속을 의미하고 "have"는 구성을 의미합니다.

EntityComponents의 모든 점은 모든 게임 개체 특성을 구성 요소 클래스에 넣은 다음이 구성 요소를 함께 넣는 것입니다. 구현에 따라 코드 변경 없이도 모든 속성 조합을 만들 수 있습니다. 코드에서 통신 물건을 넣을 자리가 몇 군데 있기 때문에 멀티 플레이어 게임을 만드는 것도 쉽습니다.

반대편에는 많은 수업이 있고 모든 것이 매우 분리되어 있습니다. 일반적으로 이것이 플러스이며 OO 개발자로서 우리가 원하는 것입니다. 하지만 새로운 기술자가 아닌 개발자 나 개발자에게는 읽기가 끔찍할 수 있습니다.

그래서 엔티티 구성 요소 접근 방식을 선택하는 것이 좋습니다. 게임이 앞으로 확장되기 쉽기 때문입니다.

관련 문제