Используя SCREEN_WIDTH = 1200 и SCREEN_HEIGHT = 800.
Сначала я рисую прямоугольник на экране (x = 0, y = 0, w = 40, h = 40);
Затем я использую функцию handleMouse, чтобы вернуть координаты x и y того места, где нажата мышь.
Проблема в том, что когда программа запускается в не максимизированном оконном режиме, когда я нажимаю (в том, что кажется) в самом нижнем правом углу поля, возвращаемые координаты имеют вид x = 40, y = 32. Когда я думаю, что это должно возвращаться х = 40, у = 40.
Я не знаю, заключается ли проблема в том, что она отображается неправильно или функции возвращают неправильные значения x / y.
Мне кажется, я понимаю, как работают рендеринг, трансформация и glOrth в openGL, но я могу ошибаться. Я видел несколько предложений онлайн, говорящих, что Декор Windows (Используя Windows 7) может вызвать эту проблему, но очень мало объяснил и не дал решения.
Это весь мой исходный код. Я снял все с моей игры до основ, и проблема все еще сохраняется :(. Я добавил две картинки, чтобы люди могли видеть мою проблему. В НЕМАКСИМАЛЬНОМ ОКНЕ (верхнее изображение), при нажатии в правом нижнем углу возвращаемые координаты 41,32; координата y меньше, чем должна быть. И в МАКСИМАЛЬНОМ ОКНЕ (нижнее изображение), при нажатии на тот же угол, он возвращает правильные координаты 40, 40. Эти результаты возникают для обоих мой оригинальный исходный код и предложенный код genpfault.
// Оказывается, я не могу публиковать картинки :(, вместо этого ссылки.
main.cpp
int main( int argc, char* args[] )
{
//Initialize FreeGLUT
glutInit( &argc, args );
//Create OpenGL 2.1 context
glutInitContextVersion( 2, 1 );
//Create Double Buffered Window
glutInitDisplayMode( GLUT_DOUBLE );
glutInitWindowSize( SCREEN_WIDTH, SCREEN_HEIGHT );
glutCreateWindow( "OpenGL" );
//Do post window/context creation initialization
if( !initGL() )
{
printf( "Unable to initialize graphics library!\n" );
return 1;
}
//initGame();glutMouseFunc(handleMouse);glutDisplayFunc( render );glutMainLoop();
return 0;
}
Functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
bool initGL();
void render();
void handleMouse(int button, int state, int x, int y);
#endif
Functions.cpp
bool initGL()
{
//Initialize clear color
glClearColor( 0.f, 0.f, 0.f, 1.f );
//Check for error
GLenum error = glGetError();
if( error != GL_NO_ERROR )
{
//cout <<"Error initializing OpenGL! " << gluErrorString( error ) << endl;
return false;
}
return true;
}
void render()
{
//Clear color buffer
glClear( GL_COLOR_BUFFER_BIT );
glColor3f(1.f,1.f,1.f);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0, 41);
glVertex2f(41, 41);
glVertex2f(41, 0);
glEnd();
glutSwapBuffers();
}
void handleMouse(int button, int state, int x, int y)
{
std::cout << x << '\t' << y << std::endl;
}
constants.h
const int SCREEN_WIDTH = 1200;
const int SCREEN_HEIGHT = 800;
Это хорошо работает для меня на Windows 7 на Aero и Classic:
#include <GL/glut.h>
#include <iostream>
void render()
{
glClearColor( 0, 0, 0, 1 );
glClear( GL_COLOR_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3ub( 255, 255, 255 );
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(41, 0);
glVertex2f(41, 41);
glVertex2f(0, 41);
glEnd();
glutSwapBuffers();
}
void handleMouse(int button, int state, int x, int y)
{
std::cout << x << '\t' << y << std::endl;
}
int main( int argc, char* args[] )
{
glutInit( &argc, args );
glutInitDisplayMode( GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "OpenGL" );
glutMouseFunc(handleMouse);
glutDisplayFunc( render );
glutMainLoop();
return 0;
}
В частности, я добавил время выполнения glutGet()
размер окна запрашивает render()
,
Попробуйте переместить квадратор от края экрана, потому что когда я пытался сделать что-то подобное, край экрана был очень странным
glBegin(GL_QUADS);
glVertex2f(20,20);
glVertex2f(20, 61);
glVertex2f(61, 61);
glVertex2f(61, 20);
glEnd();