#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://cdweb.net/article/gdpgse.html