2013-02-10 138 views
0

我有一個sfml窗口容器,它似乎工作,但glViewPorts是錯誤的大小,我認爲是因爲錯誤的sf :: Window正在傳遞。回調函數混淆了參數?

這是一個添加到窗口的函數:它需要關於sfml窗口的一些信息。

int WindowContainer::PushBack(WindowData& data) 
{ 
    if(data.WindowSettingsOK() && data.VideoModeOK()){ 

     mWindowVector.resize(mWindowVector.size() + 1); 
     mDisplayFuncVector.resize(mWindowVector.size()); 
     mInputFuncVector.resize(mWindowVector.size()); 

     mWindowVector.at(mWindowVector.size() - 1) = new sf::Window(); 
     mWindowVector.at(mWindowVector.size() - 1)->Create(data.VideoMode(), data.Title(), data.Style(), data.Settings()); 
     mWindowVector.at(mWindowVector.size() - 1)->SetPosition(data.PositionX(), data.PositionY()); 

     mDisplayFuncVector.at(mWindowVector.size() - 1) = nullptr; 
     mInputFuncVector.at(mWindowVector.size() - 1) = nullptr; 

     return 0; 
    } 
    else{ 
     PrintError(ErrorMessageType::BadSettings); 
     return 1; 
    } 
} 

或者,該函數可被調用來設置顯示和輸入功能回調:

int WindowContainer::PushBack(WindowData& data, function_p displayFunc, function_p inputFunc) 
{ 
    int return_val = PushBack(data); 
    mDisplayFuncVector.at(mWindowVector.size() - 1) = displayFunc; 
    mInputFuncVector.at(mWindowVector.size() - 1) = inputFunc; 

    return return_val; 
} 

然後,當窗口需要.Display()「ING,調用此函數:

void WindowContainer::ProcessDisplay() 
{ 
    for(unsigned int i = 0; i < mWindowVector.size(); i ++){ 
     if(mDisplayFuncVector.at(i) != nullptr){ 
      mDisplayFuncVector.at(i)(*mWindowVector.at(i), mClock, (const void*&)mExternalDrawingDataPointer); 
     } 
     mWindowVector.at(i)->Display(); 
    } 
} 

...這一切都很好,直到屏幕上的結果是調整一個窗口的大小會影響兩個窗口的視口。這表明調用回調函數:mDisplayFuncVector.at(i)(*mWindowVector.at(i), mClock, (const void*&)mExternalDrawingDataPointer);每次給出參數*mWindowVector.at(0),而不是單獨的每個窗口。 (如在*mWindowVector.at(i)

任何人都可以幫助解決這個問題嗎?

主循環包含此代碼:

while(container.Access(0)->IsOpened()){ 
    container.ProcessInput(); 
    container.ProcessDisplay(); 
} 

Container.Access(int)是這樣的功能:

const sf::Window*& WindowContainer::Access(unsigned int index) 
{ 
    if(index > mWindowVector.size()){ 
     PrintError(ErrorMessageType::IndexOutOfRange); 
    } 
    else{ 
     return (const sf::Window*&)mWindowVector.at(index); 
    } 
    return (const sf::Window*&)mWindowVector.at(0); 
} 

再次感謝,我敢肯定,我犯了一個錯誤的地方,但不能發現它。

+0

什麼是你的顯示功能的原型? – molbdnilo 2013-02-10 14:10:17

+0

main.cpp裏面我有這個功能: 'void display(sf :: Window&window,const sf :: Clock&clock,const void *&data);' 這就是你要求的嗎? – user3728501 2013-02-10 14:11:00

回答

1

我一直在考慮這個問題,並懷疑openGL會與其繪製到的窗口混淆,如果多個對象被推回而沒有調用Display()來同步所有內容。

我還沒有測試這個並確認。

編輯窗口容器現在工作。它與回調函數參數無關。

+0

也許您可以發佈問題所在,以及您爲其他遇到類似問題的人找到的解決方案。 – RedX 2013-02-25 22:00:24

+0

一個好主意,但我認爲它可能太具體,不值得發佈。 我懷疑它與sfml窗口的工作方式有關,但我無法確定。 – user3728501 2013-02-25 23:25:37