2014-09-29 75 views
1

我正在寫我自己的小遊戲引擎。 爲了將選項菜單與主菜單和主遊戲等分開,我想到了創建一個狀態系統,其中上述所有內容都是自己的狀態。 引擎main-loop在當前狀態上調用tick()方法。 但是現在引擎對狀態之間的交互,何時切換狀態等一無所知。 爲了解決這個問題,我實現了以下內容: tick() - 狀態方法返回一個模板類型:commandset。 引擎獲取Eventhandler來處理tick()方法的返回值。 它看起來像這樣:解決細胞依賴

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可以與引擎進行交互。 (可變處理程序是StateHandler類型的)

現在,當我想測試所有內容,並編寫測試狀態和處理程序時,我遇到了麻煩。 對於後來的使用,我打算使用一個類作爲處理程序,但爲了簡單的測試目的,我想使用一個函數。 所以當我想寫這個函數的時候,我注意到,我不能定義第二個參數,引擎,因爲它的模板參數是函數的類型(這取決於引擎的類型,這取決於函數鍵入...)。

現在我的問題:我如何定義處理程序?或者是整個想法垃圾? (這真的很悲慘,因爲我有點喜歡它)

+0

,把'的#pragma once'在所有的頭頂部,看看這有多幫助。 – Yann 2014-09-29 12:44:22

+0

我確實在每個頭文件中使用了一次雜注。據我所知,這與我的問題 – Uzaku 2014-09-29 12:46:24

+0

沒有關係嗎? – gldraphael 2014-09-29 12:57:56

回答

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 2014-09-29 12:53:55

+0

是的,但使用起來非常醜陋可怕。我將編輯添加它。 – 2014-09-29 12:55:33

+0

@Uzaku完成編輯。實際上並沒有試圖編譯它,但它應該大致工作。 – 2014-09-29 13:08:54