OpenGL键位控制方块移动

2020-07-05  本文已影响0人  郝程序猿

使用到的类库

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 :显示的时候调用该函数,需要在此函数中清除特定的缓存区

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();

}

上一篇 下一篇

猜你喜欢

热点阅读