2013-02-10 5 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; 
    } 
} 

대안 적으로,이 기능 설정을 호출 할 수있는 디스플레이 및 입력 기능 콜백 : 윈도우 .Display()가 '보내고해야하는 경우,이 함수가 호출되고 나서

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

:

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)에서와 같이)

누구든지이 문제를 해결할 수 있습니까?

주요 루프는이 코드를 포함

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

다시 한번 감사, 내가 어딘가에서 실수를했지만 그것을 발견 할 수없는 확신 :

while(container.Access(0)->IsOpened()){ 
    container.ProcessInput(); 
    container.ProcessDisplay(); 
} 

Container.Access(int)이 기능입니다.

+0

디스플레이 기능의 프로토 타입은 무엇입니까? ;' 당신이 무엇을 요구했다인가요 '무효 디스플레이 (SF : 창 및 창, CONST 김포 :: 시계 및 시계, const를 무효 * 데이터) : MAIN.CPP 내부 – molbdnilo

+0

나는이 기능이? – user3728501

답변

1

나는이 질문에 대해 생각해 왔으며, OpenGL은 Displaying()을 호출하지 않고 두 개 이상의 객체가 모두 밀려 나오면 어느 창으로 그리는 지 혼란 스럽다.

아직 테스트를 거쳐 확인하고 있습니다.

EDIT 이제 창 컨테이너가 작동합니다. 콜백 함수 인수와 아무 관련이 없습니다.

+0

어쩌면 당신은 문제가 무엇인지 그리고 비슷한 문제를 가진 다른 사람들을 위해 발견 한 해결책을 게시 할 수 있습니다. – RedX

+0

좋은 생각이지만, 게시할만한 가치가있는 것은 너무 구체적 일 수 있다고 생각합니다. sfml 창이 작동하는 방식과 관련이 있다고 의심되지만 확신 할 수 없습니다. – user3728501

관련 문제