调整窗口大小时如何使用鼠标单击获取图像坐标?

Posted

技术标签:

【中文标题】调整窗口大小时如何使用鼠标单击获取图像坐标?【英文标题】:how to get coordinate of image using mouse click when resize window? 【发布时间】:2016-12-28 22:31:47 【问题描述】:

我在 openGl 中制作游戏,其中包含开始菜单屏幕。问题是当我单击开始游戏按钮(这是一个纹理图像)游戏成功启动但是当我调整窗口大小然后单击开始游戏按钮时,纹理图像坐标发生变化并且游戏没有开始我如何防止在调整窗口大小后更改图像坐标。

这是我的鼠标功能

void mouseClick (int button, int state, int x, int  y)    

    if (!menu)
     
        xMin = 300, xMax = 400, yMin = 350, yMax = 400;

        if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
        
            y = height - y;
            if (x >= xMin && x <= xMax && y >= yMin && y <= yMax)
            
                printf_s("starting 2d Game ");
            
        
    

这是我的纹理图像代码

glBegin(GL_QUAD_STRIP);


        glTexCoord2f(0, 0);
        glVertex2f(300, 350);

        glTexCoord2f(1, 0);
        glVertex2f(400, 350);

        glTexCoord2f(0, 1);
        glVertex2f(300, 400);


        glTexCoord2f(1, 1);
        glVertex2f(400,400);

        glEnd();
        glFlush();

这是我的矩阵投影代码:

glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //gluOrtho2D(0.0, 640.0, 0.0, 440);//dino window
    gluOrtho2D(0.0, 640.0, 0.0, 440);//dino window
    //gluOrtho2D(1.0, 1.0, 1.0,1.0);//house window
    //gluOrtho2D(1.0, 1.0, 1.0, 1.0);//bird window
    glViewport(0, 0, width, height);
    //glViewport(220, 100, 100, 200);

【问题讨论】:

【参考方案1】:

其实变化的是鼠标点击坐标。您必须将鼠标单击位置 (x,y) 从视口坐标转换为绘图坐标(即 Ortho2D 坐标)。

假设在调整窗口大小时系统会提供widthheight 变量,请尝试以下操作:

x = x/width * 640;
y = (height -y) / height * 440;

然后测试按钮边界。

【讨论】:

【参考方案2】:

实现这一点的正确方法是使用selection buffer。

这样,您就知道点击了哪个多边形。这不受窗口大小的影响。

【讨论】:

感谢这个独特的建议,我一定会实施选择缓冲区(Y)

以上是关于调整窗口大小时如何使用鼠标单击获取图像坐标?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何防止当我调整窗口大小时,我的图像使用 HTML-CSS 移动?

在 Windows 环境中,如何获取鼠标点击的坐标(相对于窗口)

窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标

创建特定窗口后如何调整其大小?

Qt 如何获取滚动窗体中鼠标点击的坐标

如何使用某个组合键+鼠标移动来调整窗口大小? (如 Linux 中的 Alt+F8)不单击并拖动