我使用 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;关于这个(我必须改变你的代码才能正常运行,但现在......它摇滚!)希望这也有助于其他人。
答案 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;