opengl第一个小游戏
#include/* Windows的头文件 */ #include /* OpenGL32库的头文件 */ #include /* GLu32库的头文件 */ /* #include // GLaux库的头文件 */ #include /* Glut库头文件 */ #include #include using namespace std; int aa[20][20]; int xx = 0; int yy = 0; int screenWidth = 640; int screenHeight = 480; int cc = 0; /* 全局变量 */ int winWidth( 500 ), winHeight( 500 ); #define MAX_CHAR 128 void Initialization() { glClearColor( 1.0f, 1.0f, 1.0f, 1.0f ); /* 设置背景色为白色 */ } void OnReshape( int w, int h ) { winWidth = w; winHeight = h; glViewport( 0, 0, w, h ); /* 设置视区大小 */ glMatrixMode( GL_PROJECTION ); /* 投影模式 */ glLoadIdentity(); /* 载入单位矩阵以初始化当前矩阵 */ gluOrtho2D( 0, w, 0, h ); /* 将当前绘图区域设置为二维正交投影 */ glMatrixMode( GL_MODELVIEW ); /* 模型视图模式 */ glLoadIdentity(); /* 初始化当前矩阵 */ } void drawString( const char* str ) /* 屏幕显示字体 */ { static int isFirstCall = 1; static GLuint lists; if ( isFirstCall ) { isFirstCall = 0; /* 申请MAX_CHAR个连续的显示列表编号 */ lists = glGenLists( MAX_CHAR ); /* 把每个字符的绘制命令都装到对应的显示列表中 */ wglUseFontBitmaps( wglGetCurrentDC(), 0, MAX_CHAR, lists ); } /* 调用每个字符对应的显示列表,绘制每个字符 */ for (; *str != '\0'; ++str ) { glCallList( lists + *str ); } } void OnDisplay() { glClear( GL_COLOR_BUFFER_BIT ); glColor3f( 0.0f, 0.0f, 0.0f ); /* 设置字体颜色 */ glRasterPos2i( 0, winHeight - 15 ); /* 起始位置 */ drawString( " Hello,OpenGL." ); /* 输出的字符串 */ glutSwapBuffers(); /* 交换前后缓存区 */ } void myInit() { glClearColor( 1.0, 1.0, 1.0, 0.0 ); /* 设置背景颜色为亮白 */ glColor3f( 0.0f, 0.0f, 0.0f ); /* 设置绘图颜色为黑色 */ glPointSize( 4.0 ); /* 设置点的大小为4*4像素 */ glMatrixMode( GL_PROJECTION ); /* 设置合适的矩阵 */ glLoadIdentity(); gluOrtho2D( 0.0, screenWidth, 0.0, screenHeight ); } void myMouse2( int button, int state, int x, int y ) { if ( state == GLUT_DOWN ) { if ( button == GLUT_RIGHT_BUTTON ) { glClearColor( 1.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); glFlush(); } } return; } void drawDot( int x, int y ) { xx = (x - 30) / 20; yy = y / 20; glBegin( GL_POINTS ); glVertex2i( x, y ); /* 画一些点 */ if ( 30 < x && x < 430 && 0 < y && y < 400 ) cc++; /* aa[yy][xx] == 0; 思路1 */ cout << cc << endl; if ( cc >= 4 ) { glVertex2i( 450, 450 ); /* 思路3 */ myMouse2( GLUT_RIGHT_BUTTON, GLUT_DOWN, 300, 400 ); } glEnd(); } void myMouse( int button, int state, int x, int y ) { if ( state == GLUT_DOWN ) { if ( button == GLUT_LEFT_BUTTON ) { drawDot( x, screenHeight - y ); glFlush(); }else if ( button == GLUT_RIGHT_BUTTON ) { glClearColor( 1.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); glFlush(); } } return; } void myDisplay() { glClear( GL_COLOR_BUFFER_BIT ); /* 清屏 */ glBegin( GL_POINTS ); /* 画一些点 */ for ( int i = 0; i < 20; i++ ) { for ( int j = 0; j < 20; j++ ) { if ( aa[i][j] == 1 ) glVertex2i( i * 20 + 33, j * 20 + 5 ); } } glEnd(); GLfloat curSizeLine = 2; glLineWidth( curSizeLine ); glBegin( GL_LINES ); for ( int i = 0; i <= 400; ) { glVertex3f( 30, 0.0 + i, 0.0f ); glVertex3f( 430, 0.0 + i, 0.0f ); glVertex3f( 30.0 + i, 0, 0.0f ); glVertex3f( 30.0 + i, 400, 0.0f ); i += 20; } glEnd(); glFlush(); /* 送所有输出到显示设备 */ } void funrand() { int s = 4; int x = 0; int y = 0; srand( time( 0 ) ); while ( s-- ) { x = rand() % 20; y = rand() % 20; aa[x][y] = 1; } } int check() { for ( int i = 0; i < 20; i++ ) { for ( int j = 0; j < 20; j++ ) { if ( aa[i][j] == 1 ) return(1); } } return(0); } void main( int argc, char **argv ) { funrand(); glutInit( &argc, argv ); /* 初始化工具包 */ glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB ); /* 设置显示模式 */ glutInitWindowSize( 640, 480 ); /* 设置窗口大小 */ glutInitWindowPosition( 100, 150 ); /* 设置窗口在屏幕上的位置 */ glutCreateWindow( "大家来找茬,找找点" ); /* 打开屏幕窗口 //注册回调函数 */ Initialization(); glutDisplayFunc( myDisplay ); glutMouseFunc( myMouse ); myInit(); glutReshapeFunc( OnReshape ); /* 重绘函数 打印提示信息好难 */ glutMainLoop(); /* 进入循环 */ } /**************** * * 实现鼠标监听 * 运行效果为面板上加点 **BUG1 打点越界 *有的点能返回1 有的点确不能 **模糊判断 ****************/
本文名称:opengl第一个小游戏
链接URL:http://scyanting.com/article/gdpgse.html