【问题标题】:Callback function confuses argument?回调函数混淆参数?
【发布时间】: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*&amp;)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&amp; window, const sf::Clock&amp; clock, const void*&amp; data); 你问的是这个吗?

标签: c++ callback containers sfml


【解决方案1】:

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

我还没有对此进行测试和确认。

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

【讨论】:

  • 也许您可以发布问题所在以及您为其他有类似问题的人找到的解决方案。
  • 一个好主意,但我认为它可能过于具体,不值得发布。我怀疑这与 sfml windows 的工作方式有关,但我不能确定。
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2021-06-23
  • 2013-03-20
  • 2012-06-04
相关资源
最近更新 更多