当我在SDL2中调整窗口大小并使用SDL_RenderSetLogicalSize时,如何使位置适应新窗口位置?
我希望能够将文本悬停并使其改变颜色,但每当我调整窗口大小时,它仍然在相同的窗口中。有没有办法改编鼠标?
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 :(得分:0)
前段时间我遇到了类似的问题,这是由于我在一个SDL事件循环中多次更新鼠标位置。我想通过拖动鼠标来移动SDL_Texture,但是在调整大小后它失败了,因为不知何故鼠标坐标搞砸了。
我所做的是重新安排我的代码,只有一个事件处理鼠标位置更新。此外,我没有使用任何SDL_SetWindowSize()调用。当用户调整窗口大小时,由于SDL_RenderSetLogicalSize(),渲染器会被适当调整大小。
相关的代码部分看起来像这样 - 有些东西适合你的情况。我还建议使用SDL_Rect来检测鼠标是否在文本区域内,因为如果窗口/渲染器改变大小,SDL_Rects将在内部调整大小。
//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;
}
}