2014-07-12 12 views
0

SDL2 및 SDL_RenderSetLogicalSize로 창 크기를 조정할 때 위치를 새 창 위치에 맞게 조정하려면 어떻게해야합니까?SDL2 창 크기 조정 마우스 위치

텍스트를 가져 가서 색상을 변경할 수 있지만 같은 크기의 창 코드에서 창 크기를 조정할 때마다 변경할 수 있기를 원합니다. 마우스를 적용 할 수있는 방법이 있습니까?

void MainMenu::CheckHover() 
{ 
    for (std::list<MenuItem>::iterator it = menuItems.begin(); it != menuItems.end(); it++) 
    { 
     Text* text = (*it).text; 
     float Left = text->GetX(); 
     float Right = text->GetX() + text->GetWidth(); 
     float Top = text->GetY(); 
     float Bottom = text->GetY() + text->GetHeight(); 

     if (mouseX < Left || 
      mouseX > Right || 
      mouseY < Top || 
      mouseY > Bottom) 
     { 
      //hover = false 
      text->SetTextColor(255, 255, 255); 
     } 
     else 
     { 
      //hover = true 
      text->SetTextColor(100, 100, 100); 
     } 
    } 
} 
+0

어떻게 창의 크기를 조정하고'mouseX'와'mouseY'를 어떻게 설정합니까? – olevegard

+0

RenderSetLogicalSize 및 SDL_SetWindowSize를 사용하여 크기를 조정하지만 논리 크기로 인해 모든 것이 화면에 맞추어 져서 마우스의 좌표가 꺼집니다. – SundayBrowsing

답변

0

저는 비슷한 문제가있었습니다. 한 번의 SDL 이벤트 루프에서 마우스 위치가 여러 번 업데이트 되었기 때문입니다. 마우스로 드래그하여 SDL_Texture를 움직이고 싶었지만 크기를 조정 한 후에 실패했습니다. 왜냐하면 어떻게 든 마우스 좌표가 엉망 이었기 때문입니다.

마우스 위치 업데이트를 처리하는 이벤트가 하나 뿐이도록 코드를 재정렬했습니다. 또한 SDL_SetWindowSize()에 대한 호출을 사용하고 있지 않습니다. 사용자가 윈도우의 크기를 조절하면 SDL_RenderSetLogicalSize()로 인해 렌더러의 크기가 적절하게 조정됩니다.

관련 코드 부분은 다음과 같습니다. 일부 내용이 귀하의 케이스에 맞게 조정되었습니다. 윈도우/렌더러의 크기가 변경되면 SDL_Rects의 내부 크기가 조정되기 때문에 마우스가 텍스트 영역 안에 있는지 감지하기 위해 SDL_Rect를 사용하는 것이 좋습니다.

//Declarations 
    //... 
    SDL_Point mousePosRunning; 

    // Picture in picture texture I wanted to move 
    SDL_Rect pipRect; 

    // Init resizable sdl window 
    window = SDL_CreateWindow(
    "Window", 
    SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), 
    SDL_WINDOWPOS_CENTERED_DISPLAY(displayIndex), 
    defaultW, defaultH, 
    SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // This one is optional 
    SDL_RenderSetLogicalSize(renderer, defaultW, defaultH); 

    // SDL main loop 
    while(SDL_PollEvent(&event) && running) 
    { 
    switch (event.type) 
    { 
     // Some event handling here 
     // ... 
     // Handle mouse motion event 
     case SDL_MOUSEMOTION: 
      // Update mouse pos 
      mousePosRunning.x = event.button.x; 
      mousePosRunning.y = event.button.y; 

      // Check if mouse is inside the pip region 
      if (SDL_EnclosePoints(&mousePosRunning, 1, &pipRect, NULL)) 
      { 
       // Mouse is inside the pipRect 
       // do some stuff... i.e. change color 
      } 
      else 
      { 
       // Mouse left rectangle 
      } 
      break; 
    } 
    }