2010-07-24 4 views
6

저는 게임 프로젝트를 취미로 쓰고 있습니다. 내 게임 오브젝트 및 다양한 애니메이션을 구성하는 최선의 방법에 대한 건축 전문가의 조언을 찾고 있습니다.애니메이션 아키텍처 패턴

예를 들어, 저는 Wizard라는 클래스와 Dragon이라는 클래스 을 가지고 있습니다. 마법사에는 상태에 따라 적어도 10 개의 서로 다른 애니메이션이 있고 드래곤에는 과 동일한 애니메이션이 있습니다.

그래서 제 질문은 이것이다 : 확장하는 것이 효율적이되도록 개체의 이러한 종류의 조직 및 쉽게하기위한 표준 패턴이 있습니다 ( 애니메이션과 새로운 객체의 새로운 추가가 용이해야한다 즉)?

앞으로 나아갈 방법에 대한 다양한 아이디어가 있지만, 은 게임 아키텍처의 중요한 부분 인 이므로이 문제를 해결하고 싶지 않습니다. 작은 게임에서이 작업을 쉽게 수행 할 수 있지만, 이 커지면서 관리하기 어려운 복잡성을 두려워합니다.

+0

기존 오픈 소스 게임에서 아이디어를 훔칩니다. –

+0

std :: map - 내부 상태 대 애니메이션 저장 및 외부 저장소의 모든 열린 형식 용. – W55tKQbuRu28Q4xv

답변

1

이러한 모든 엔티티가 수행 할 수 있어야하는 것을 정의하는 "Character"와 같은 인터페이스를 사용하는 것이 좋습니다. 그런 다음 드래곤과 마법사 클래스는 구현에 불과합니다.

또 다른 경로는 확장 된 기본 클래스를 사용하여 개체의 계층 구조를 추출하고 확장 된 기본 클래스를 식별하여 대규모 프로젝트와 관련된 "계층 적 무분별한 확산"을 제어하는 ​​것입니다.

0

아니요, 표준 패턴이 없습니다.

내 충고는 모든 것을위한 하나의 공통 "기본 클래스"인터페이스를 찾으려는 초보자 객체 지향 설계의 함정을 피하는 것입니다. 귀하의 드래곤은 마법사와 크게 다르며 귀여운 코드 추상화를 제외하고는 두 인터페이스를 병합하여 얻는 것이 없습니다. 코드 상속은 상속이 코드 재사용을위한 도구가 아니라는 것을 기억하십시오.

가장 간단한 방법은 각 개체가 이미 설명한대로 자체 내부 상태를 유지하고 해당 상태를 그릴 수있게하는 것입니다. 이것은 올드 스쿨 스위치 명세서 이 동일한 효과에 대해 다형성을 사용하는 것보다 더 명확한 곳입니다. 예 : 스위치 문은 거의 정확하게 다형성 메서드 호출이 수행 될지 때문에

class Dragon { 
enum State { asleep, flying, breathing_fire }; 
public: 
void draw() { /* old-school switch */ 
    switch (cur_state){ 
    case asleep: draw_asleep(); 
    case flying: draw_flying(); 
    case breathing_fire: draw_breathing_fire(); 
    } 
    } 
private: 
    void draw_asleep(); 
    void draw_flying(); 
    void draw_breathing_fire(); 
}; 

숙련 된 C++ 개발자, (그들이해야 등) 위의 코드에서 말하다 것이다 - 런타임 파견. (또는 더 많은 암호 : 메서드 주소 표). 개인적 견해는이 특정 유형의 클래스, 즉 상태 시스템을 캡슐화하는 단일 공용 인터페이스의 경우 switch 문이 상태 시스템을 만들기 때문에 더 명확하고 유지 관리가 가능하다는 것입니다 명시 적으로 점프. 나는 이것이 이고 일반적으로 나쁜 C++ 디자인이라는 것도 분명하다고 생각합니다.

이 디자인의 마찰은 상태 시스템과 단일 공용 인터페이스 사이의 구분선으로 인해 발생합니다. 수면 용은 분명히 날으는 드래곤과 같지 않습니다. 사실 공통점이 거의 없습니다. 그러나 더 높은 수준의 디자인은 두 사람이 같은 드래곤이라고 말합니다. 이 얼마나 엉망 이냐! 각 상태에 대해 서로 다른 Dragon 객체를 만드십니까? 아니, 그것은 국가의 개념을 호출자에게 노출시킬 것이기 때문이다. 각 주마다 서로 다른 내부 도우미 객체를 만들고 그 객체에 파견합니까? 아마도,하지만 그것은 지저분 해집니다. 위의 접근 방식은 둘 사이의 타협점입니다.switch 문을 추악함을 격리시키는 것으로 생각하십시오. 공용 인터페이스는 비공개 인터페이스와 마찬가지로 깨끗합니다. switch 문에만 더러운 엉망이 들어 있습니다. 이 방법을 고려하고 다른 제안도 고려하십시오.

마지막으로, 간단한 래퍼 템플릿 또는 펑 충분합니다 당신의 마법사와 드래곤을 그릴 :

struct Draw { 
    template <class S> 
    void operator()(S& s) { s.draw(); } 
}; 

요점은 당신이 그들 모두를 지원해서 두 개의 서로 다른 클래스를 병합 할 필요가 없다는 것입니다 동일한 논리 연산.