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

时间:2016-12-28 22:31:47

标签: c++ opengl graphics

我在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);

2 个答案:

答案 0 :(得分:1)

实际上,鼠标点击坐标正在发生变化。您必须将鼠标单击位置(x,y)从视口坐标转换为绘图坐标(即Ortho2D坐标)。

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

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

然后测试按钮界限。

答案 1 :(得分:0)

实现此目的的正确方法是使用selection buffer

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