Использование glut очень облегчает отладочную работу. Позволяет, например, без усилий создать окно и делать на него визуальный вывод. В своих демонстрационных проектах я использую именно эту библиотеку.
Установка в Debian-дистрибутивах(от root)
Для 2D исходник выглядит так:
Установка в Debian-дистрибутивах(от root)
#aptitude install freeglut3 freeglut-dbg freeglut-dev
Для 2D исходник выглядит так:
#include<GL/freeglut.h>Этот пост создан для того, чтобы на него ссылаться.
#include<GL/glu.h> //для gluOrtho2D
const int FPS = 30;
const int COUNT_TIMER = 1000/FPS;
bool keys[256];
int width,height;
double XScreen,YScreen,Xf,Yf;
void Reshape(int width,int height)
{
/* Высота 1.0 - это 768 пикселей, если высота монитора больше, следовательно, вещественное значение больше.
Такая же ситуация с шириной. Сделано для того, чтобы разрешение экрана давало преимущество*/
XScreen=(double)width/(double)768;
YScreen=(double)height/(double)768;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-XScreen,XScreen,-YScreen,YScreen);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void MotionFunc(int x,int y)
{
Xf = XScreen*2*(float)x/(float)width-(XScreen);
Yf = -(YScreen*2*(float)y/(float)height-(YScreen));
}
void PassiveMotionFunc(int x,int y)
{
Xf = XScreen*2*(float)x/(float)width-(XScreen);
Yf = -(YScreen*2*(float)y/(float)height-(YScreen));
}
void MouseDown(int button,int state,int x, int y)
{
Xf = XScreen*2*(float)x/(float)width-(XScreen);
Yf = -(YScreen*2*(float)y/(float)height-(YScreen));
}
void KeyProc(unsigned char key,int x,int y)
{
if (key==27)
exit(0);
keys[key]=true;
}
void KeyUpProc(unsigned char key,int x,int y)
{
keys[key]=false;
}
void Draw(void)
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glColor3f(0.6,0.6,0.6);
glBegin(GL_LINES);
glVertex2f(-1.0,0.0);
glVertex2f(1.0,0.0);
glVertex2f(0.0,-1.0);
glVertex2f(0.0,1.0);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void PaintTimer(int value)
{
glutPostRedisplay();
glutTimerFunc(COUNT_TIMER,PaintTimer,0);
}
void KeysTimer(int value)
{
glutTimerFunc(20,KeysTimer,0);
}
int main(int argv, char * argc[])
{
glutInit(&argv,argc);
width = glutGet(GLUT_SCREEN_WIDTH);
height = glutGet(GLUT_SCREEN_HEIGHT);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
char str[17]={0};
sprintf(str,"%dx%d:32@60",width,height);
glutGameModeString(str);
glutEnterGameMode();
glutReshapeFunc(Reshape);
glutDisplayFunc(Draw);
glutKeyboardFunc(KeyProc);
glutKeyboardUpFunc(KeyUpProc);
glutDisplayFunc(Draw);
glutPassiveMotionFunc(PassiveMotionFunc);
glutMotionFunc(MotionFunc);
glutMouseFunc(MouseDown);
glutTimerFunc(30, PaintTimer, 0);
glutTimerFunc(20, KeysTimer, 0);
glutMainLoop();
return 0;
}
Комментариев нет:
Отправить комментарий