2013-02-10 4 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

+0

Внутри main.cpp У меня есть эта функция: 'недействительным дисплей (С.Ф. :: Window и окно, Const научная фантастика :: Часы и часы, сопзЬ пустота * & данных);' это то, что вы спрашивали? – user3728501

ответ

1

Я думал об этом вопросе и подозревал, что openGL запутывается, с каким окном он рисует, если более одного объекта отбрасывается без вызова Display() для синхронизации всего.

Я еще должен проверить это и подтвердить.

EDIT Стеклянный контейнер теперь работает. Он не имеет ничего общего с аргументом функции обратного вызова.

+0

Возможно, вы могли бы опубликовать, что проблема, и решение, которое вы нашли для других людей с аналогичной проблемой. – RedX

+0

Хорошая идея, однако я думаю, что это может быть слишком специфично, чтобы стоить публикации. Я подозреваю, что это как-то связано с тем, как работают окна sfml, но я не могу быть уверен. – user3728501

Смежные вопросы