2014-09-29 3 views
1

나는 작은 게임 엔진을 쓰고 있습니다. 메인 메뉴와 메인 게임에서 옵션 메뉴를 분리하는 방법으로 위에서 언급 한 모든 것이 자신의 상태 인 상태 시스템을 만드는 방법을 생각했습니다. 엔진 main-loop는 현재 상태에서 tick() 메소드를 호출합니다. 그러나 이제 엔진은 상태 간 상호 작용, 상태 전환시기 등을 전혀 알지 못합니다. 이 문제를 해결하기 위해 다음을 구현했습니다. tick() - 상태 메서드는 템플릿 유형을 반환합니다 : commandset. 엔진은 tick() - 메서드의 반환 값을 처리하기 위해 Event Handler를 가져옵니다. 은 다음과 같습니다서클 의존성 해결

template<class StateHandler, typename FeedbackType> 
    void Engine<StateHandler, FeedbackType>::run() 
    { 
     run = true; 
     clock.restart(); 

     while (run) 
     { 
      sf::Time elapsed = clock.restart(); 
      Win->clear(sf::Color::Black); 

      processEvents(); 

      if (!pause) 
      { 
       Handler(currentState->tick(elapsed), *this); 
       if (overlayState != NULL) 
        Handler(overlayState->tick(elapsed), *this); 
      } 

      Win->display(); 
     } 

    } 

그래서, 엔진이 틱의 반환 값에 대한 핸들러를 호출하고 자신을 전달합니다. Handler는 엔진과 상호 작용할 수 있습니다. (Variable Handler는 StateHandler 타입입니다.)

이제 모든 것을 테스트하고 Teststate와 핸들러를 썼을 때 문제가 발생했습니다. 나중에 사용하기 위해 클래스를 핸들러로 사용하려고했지만 간단한 테스트 목적으로 함수를 사용하려고했습니다. 그래서 함수를 작성하고자 할 때, 두 번째 매개 변수 인 엔진을 정의 할 수 없다는 것을 알았습니다. 템플릿 인수는 함수의 유형 (함수에 따라 달라지는 엔진 유형에 따라 다르기 때문에)입니다. 유형 ...).

이제 내 질문 : 어떻게 처리기를 정의 할 수 있습니까? 아니면 전체 아이디어가 쓰레기입니까? (그것은 정말 비극적인데, 나는 그것을 좋아하기 때문에)

+0

을, 당신의 모든 헤더 상단에'의 #pragma once'을 넣어, 그 얼마나 많은 참조 도움이됩니다. – Yann

+0

모든 헤더에 pragma를 한 번 사용합니다. 내가보기 엔, 그건 내 문제와 관련이 없다. – Uzaku

+0

앞으로 선언을 시도해 봤어? – gldraphael

답변

2

기능이 너무 적어서 걱정할 가치가 없습니까?

struct TestHandler { 
    void operator()(const CommandSet& cs, Engine<TestHandler, TestFeedback>& e) { 
    } 
}; 

기능을 원한다면 농구대를 뛰어 넘어야합니다. 심술 궂은 즐거움을 위해, 나는이 작품 만드는 방법 추가 한 : 당신이 종속성 문제가 있다고 알고 있다면

class any_ref { 
public: 
    template <typename T> 
    any_ref(T& ref) 
    : pointer(&ref) 
#if !defined(NDEBUG) 
    , type(&typeid(T)) 
#endif 
    {} 

    template <typename T> 
    T& get() const { 
    assert(typeid(T) == *type); 
    return *static_cast<T*>(pointer); 
    } 

private: 
    void* pointer; 
#if !defined(NDEBUG) 
    const std::type_info* type; 
#endif 
}; 

void TestHandler(const CommandSet& cs, any_ref er) { 
    auto& e = er.get<Engine<void (*)(const CommandSet&, any_ref), TestFeedback>>(); 
} 
+0

당신은 바로 거기에 있지만, 호기심에서, 기능을 가지고 그것을 할 수있는 방법이 있습니까? – Uzaku

+0

예,하지만 사용하기에는 지독히 추악하고 끔찍합니다. 나는 그것을 추가하기 위해 편집 할 것이다. –

+0

@Uzaku 수정 완료. 실제로 컴파일하려고하지는 않았지만 대략 작동해야합니다. –