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

... 1つのウィンドウのサイズ変更が両方のウィンドウのビューポートに影響するという結果が画面に表示されるまで、これはすべて問題ありません。これは、コールバック関数を呼び出すことは、各ウィンドウを個別にではなく、毎回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);
}

もう一度ありがとう、私はどこかで間違いを犯したと確信していますが、それを見つけることができません。

4

1 に答える 1

1

私はこの質問について考えていましたが、すべてを同期するためにDisplay()を呼び出さずに複数のオブジェクトがプッシュバックされると、openGLがどのウィンドウに描画されるのか混乱するのではないかと思います。

私はまだこれをテストして確認していません。

編集ウィンドウコンテナが機能するようになりました。コールバック関数の引数とは何の関係もありません。

于 2013-02-19T22:36:26.220 に答える