使用到的类库
1.GLShaderManager
2.GLTools
3.GLUT
一.针对方块的控制,我们首先可以先绘制一个正方形
正方形坐标示意图GLfloat blockSize = 0.1f;
GLfloat vVerts[] = {
-blockSize,-blockSize,0.0f,
blockSize,-blockSize,0.0f,
blockSize,blockSize,0.0f,
-blockSize,blockSize,0.0f,
};
对于绘制一个正方形来说,需要我们在设置图元方式的时候设置为GL_TRIANGLE_FAN
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
当然,还有很多的图元连接方式 :
对应的图元连接方式二.在main函数中注册相应的回调函数
int main(int argc,char *argv[]) {
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
glutInitWindowSize(500, 500);
glutCreateWindow("Triangle");
glutReshapeFunc(changeSize);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
GLenum status = glewInit();
if (GLEW_OK != status) {
printf("GLEW Error:%s\n",glewGetErrorString(status));
return 1;
}
setupRC();
glutMainLoop();
return 0;
}
main函数中:
gltSetWorkingDirectory(argv[0]) 设置当前工作目录
glutInit(&argc, argv);初始化GLUT库
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);:初始化双缓冲窗口
glutInitWindowSize(500, 500); GLUT窗口大小设置
glutCreateWindow("Triangle");窗口设置标题为Triangle
glutReshapeFunc(changeSize); 注册窗口大小更改时候的函数回调
glutDisplayFunc(RenderScene);注册显示函数回调
glutSpecialFunc(SpecialKeys);注册特殊键位函数回调
setupRC();//设置渲染环境
其中,我们设置的所有回调函数都可以自己定义名称,这里我定义的分别为changeSize、RenderScene、SpecialKeys
其它函数我们不再赘述,主要说下自己注册的这几个回调
changeSize:顾名思义,就是窗口大小更改的时候会自动回调这个函数,在此函数中,需要设置视口大小
glViewport(0,0, w, h);
RenderScene :显示的时候调用该函数,需要在此函数中清除特定的缓存区
SpecialKeys:接收到键值回调函数,
这里有两种计算形式:1.根据顶点进行计算 2. 根据矩阵方式进行计算
但是这两种方式的核心为下图:
以矩阵为例:设定xPos 与yPos stepSize 后即可进行方块移动的操作
GLfloat xPos = 0.0f;
GLfloat yPos = 0.0f;
voidSpecialKeys(intkey,intx,inty){
GLfloat stepSize =0.025f;
if(key ==GLUT_KEY_UP) {
yPos+= stepSize;
}
if(key ==GLUT_KEY_DOWN) {
yPos-= stepSize;
}
if(key ==GLUT_KEY_LEFT) {
xPos-= stepSize;
}
if(key ==GLUT_KEY_RIGHT) {
xPos+= stepSize;
}
//碰撞检测
if(xPos< (-1.0f+blockSize)) {
xPos= -1.0f+blockSize;
}
if(xPos> (1.0f-blockSize)) {
xPos=1.0f-blockSize;
}
if(yPos< (-1.0f+blockSize)) {
yPos= -1.0f+blockSize;
}
if(yPos> (1.0f-blockSize)) {
yPos=1.0f-blockSize;
}
glutPostRedisplay();
}
网友评论