C++ 相对于视口的SDL2鼠标位置

C++ 相对于视口的SDL2鼠标位置,c++,sdl-2,C++,Sdl 2,我正在开发一个简单的SDL2应用程序,它有多个包含按钮的视口。我使用的是LazyFoo教程中的类,还有一些小的修改(因此我使用的是教程17中的LButton,我使用的是教程9中的视口数组) 下面是我设置按钮位置的步骤: //Buttons in viewport 1 buttons[0].setPosition(12, buttonHeadSpace ); buttons[1].setPosition(24 + BUTTON_WIDTH_DEFAULT, buttonHeadSpace ); /

我正在开发一个简单的SDL2应用程序,它有多个包含按钮的视口。我使用的是LazyFoo教程中的类,还有一些小的修改(因此我使用的是教程17中的LButton,我使用的是教程9中的视口数组)

下面是我设置按钮位置的步骤:

//Buttons in viewport 1
buttons[0].setPosition(12, buttonHeadSpace );
buttons[1].setPosition(24 + BUTTON_WIDTH_DEFAULT, buttonHeadSpace );
//Buttons in viewport 2
buttons[2].setPosition(12,buttonHeadSpace);
buttons[3].setPosition(24 + BUTTON_WIDTH_DEFAULT, buttonHeadSpace);
如您所见,视口1中的按钮在其位置整数中的值与视口2中的按钮相同

下面是我用按钮填充视口:

//viewport 1
SDL_RenderSetViewport( gRenderer, &panelOutlines[0]);
buttons[0].render(buttonSpriteSheetTexture, &*buttonSpriteClips);
buttons[1].render(buttonSpriteSheetTexture, &*buttonSpriteClips);

//viewport 2
SDL_RenderSetViewport( gRenderer, &panelOutlines[3]);
buttons[2].render(buttonSpriteSheetTexture, &*buttonSpriteClips);
buttons[3].render(buttonSpriteSheetTexture, &*buttonSpriteClips);
当然,在LButton对象内部,有一个鼠标悬停检测片段:

int x, y;
SDL_GetMouseState(&x, &y);

//Check if mouse is in button
bool inside = true;
if ( (x < mPosition.x ) || (x > mPosition.x + mButtonWidth) || (y < mPosition.y) || (y > mPosition.y + mButtonHeight) )
{
    inside = false;
}
intx,y;
SDL_GetMouseState(x&y);
//检查鼠标是否在按钮中
bool-inside=true;
if((xmPosition.x+mButtonWidth)| |(ymPosition.y+mButtonHeight))
{
内=假;
}
因此,问题在于鼠标悬停检测是根据内存中的按钮位置检查相对于窗口的鼠标位置,但内存中的按钮位置是相对于视口存储的。因此,当我将鼠标悬停在视口1按钮1上时,我会在视口1按钮1和视口2按钮1上获得悬停动画

如何在SDL2中获取鼠标相对于视口的位置


提前谢谢

SDL适用于窗口,OpenGL的
glViewport
适用于窗口的部分。您的鼠标悬停检测必须与视口(一个简单的窗口-视口转换)一起工作,必须测试所有视口,直到其中一个满足。是的,我一直在尝试避免OpenGL,但我可能最终不得不在这里开始使用它。。。目前,我实现了一个树,因此它首先检查与视口的冲突,然后将相对位置传递给button类。