SDL2调整窗口+鼠标位置的大小

时间:2014-10-07 14:42:34

标签: window position mouse sdl sdl-2

我使用 SDL 2.0.4 + Code :: Blocks 13.12 + GNU / Linux Ubuntu 14.04

我的代码说明:
1)我创建了一个可调整大小的窗口(SDL_Window,1280x720像素)
2)我在其中创建一个小矩形作为按钮(SDL_Rect,150x50像素)
3)要获得鼠标位置和矩形区域,我使用以下代码:

SDL_Window window;
SDL_Rect rectangle; // <-- The button to click
SDL_Event events;

// Get current mouse position:
int mouseX = events.motion.x;
int mouseY = events.motion.y;

  // The "formula" to compare current mouse position with the rectangle area:
  if((mouseX>rectangle.x) && (mouseX<rectangle.x+rectangle.w)
  && (mouseY>rectangle.y) && (mouseY<rectangle.y+rectangle.h)) {       
   // You clicked inside the rectangle!...
  } else {
    // You missed the rectangle...
  };

如果我运行上面的代码,结果是:
- 一切正常,没有问题。

如果我调整窗口大小:
- 根据调整大小的窗口,矩形变大(或更小)(矩形按比例拟合)。但是......

问题: http://sites.google.com/site/jorgerosaportfolio/home/UBUNTU_SDL_2_issue.jpg
- 我调整窗口大小后,原始坐标(鼠标和矩形)不匹配&#34;了。我怎样才能改变这个&#34;公式&#34;要更新到新的矩形区域?... (或者......所有这一切必须以完全不同的方式完成?)

[已添加]解决方案:

SDL_Window window;
SDL_Rect rectangle; // <-- The button to click
SDL_Event events;

// Get current mouse position:
int mouseX = events.motion.x; // <-- In your case, most probably, will be: events.button.x;
int mouseY = events.motion.y; // <-- In your case, most probably, will be: events.button.y;

// Retrive window scale factor to apply it to mouse positions too:
int width, height;
SDL_GetWindowSize(window, &width, &height);
float scaleX = ((float)width / 1280.0);
float scaleY = ((float)height / 720.0);
mouseX /= scaleX;
mouseY /= scaleY;

  // After all, the "formula" stills the same as in the above code:
  if((mouseX>rectangle.x) && (mouseX<rectangle.x+rectangle.w)
  && (mouseY>rectangle.y) && (mouseY<rectangle.y+rectangle.h)) {       
   // You clicked inside the rectangle!...
  } else {
    // You missed the rectangle...
  };

谢谢大家。谢谢 joeforker !我所需要的只是一个&#34;光&#34;关于这个(我必须改变你的代码才能正常运行,但现在......它摇滚!)希望这也有助于其他人。

1 个答案:

答案 0 :(得分:1)

如果整个绘图按比例缩放,那么矩形内的鼠标坐标也必须按比例缩放。您可以尝试在每个帧上(或者每当获得调整大小事件时)获取窗口大小以相对于新大小缩放这些坐标。

int width, height;
SDL_GetWindowSize(window, &width, &height);
scaled_x = (int)((float)width / 1280.0) * mouse_x;
scaled_y = (int)((float)height / 720.0) * mouse_y;