【发布时间】:2013-02-10 13:29:36
【问题描述】:
我有一个 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);
}
再次感谢,我确定我在某处犯了错误,但无法发现。
【问题讨论】:
-
你的展示功能原型是什么?
-
在 main.cpp 里面我有这个功能:
void display(sf::Window& window, const sf::Clock& clock, const void*& data);你问的是这个吗?
标签: c++ callback containers sfml