gpt4 book ai didi

c++ - 回调函数混淆参数?

转载 作者:行者123 更新时间:2023-11-28 07:46:27 25 4
gpt4 key购买 nike

我有一个 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() 时,调用此函数:

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();
}
}

... 这一切都很好,直到屏幕上的结果是调整一个窗口的大小会影响两个窗口的视口(viewport)。这表明调用回调函数: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);
}

再次感谢,我确定我在某处犯了错误,但无法发现。

最佳答案

我一直在思考这个问题,并且怀疑如果在没有调用 Display() 同步所有内容的情况下推回多个对象,openGL 会混淆它绘制到哪个窗口。

我尚未对此进行测试和确认。

编辑 窗口容器现在可以工作了。它与回调函数参数无关。

关于c++ - 回调函数混淆参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com