OpenGL学习笔记之鼠标检测

来源:互联网 发布:linux安装rz sz 命令 编辑:程序博客网 时间:2024/06/05 04:30

OpenGL学习笔记之鼠标检测

//由于之前的代码我也留着的,代码有点多了,所以我稍微分了一下
//main主函数

#include "head.h"//第一个参数是命令的个数,第二个参数是命令内容int main(int argc,char** argv){    std::cout<<argc<<std::endl;//输出命令个数    for(int i = 0; i < argc; ++i)//输出命令内容    {        std::cout<<argv[i]<<std::endl;    }    glutInit(&argc,argv);//初始化glut库(创建窗口需要)    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//初始化显示模式 GLUT_RGBA 颜色 GLUT_DOUBLE 双缓冲    glutInitWindowPosition(100,100);//初始化我们创建的窗口在屏幕左上角的位置    glutInitWindowSize(600,600);//初始化创建窗口的宽高    int iWindowID = glutCreateWindow("OpenGL");//创建窗口,并返回窗口的ID,传窗口的标题    glutDisplayFunc(DisplayFunc);//屏幕显示的回调函数    glutIdleFunc(IdleFunc);//闲置时回调函数(当没有消息时调用)    glutKeyboardFunc(KeyboardFunc);//数字、字母键的按键检测的回调函数    glutSpecialFunc(SpecialFunc);//特殊按键检测(F1~F12,控制键)    glutMouseFunc(MouseFunc);//鼠标检测    glutMotionFunc(MotionFunc);//鼠标按着拖动检测    glutPassiveMotionFunc(PassiveMotionFunc);//鼠标移动检测    glEnable(GL_LINE_STIPPLE);//开启画虚线的模式    glClearColor(0.0f,0.6f,0.6f,1.0f);//指定屏幕背景色,最后参数为透明度    glutMainLoop();//消息主循环    //glutDestroyWindow(iWindowID);//销毁窗口    return 1;}

//head.h

#include <gl/glew.h>#include <gl/glut.h>#include <iostream>struct Vector2D{    float fX;    float fY;};extern Vector2D g_vector2D;void DisplayFunc();//显示函数void IdleFunc();//闲置时调用的函数void KeyboardFunc(unsigned char Key,int x,int y);//数字、字母键按键检测void SpecialFunc(int Key,int x,int y);//F1~F12、控制键检测void MouseFunc(int button,int state,int x,int y);//鼠标检测void MotionFunc(int x,int y);//鼠标按着拖动void PassiveMotionFunc(int x,int y);//鼠标移动

//head.cpp

#include "head.h"Vector2D g_vector2D = {-0.2f,0.2f};void DisplayFunc(){    glClear(GL_COLOR_BUFFER_BIT);//用指定的颜色清屏    glBegin(GL_TRIANGLES);    {        glColor3f(0,0.6f,0);        glVertex2f(g_vector2D.fX,g_vector2D.fY);        glColor3f(0,0.0f,0.6f);        glVertex2f(g_vector2D.fX+0.4f,g_vector2D.fY);        glColor3f(0.6f,0.0f,0);        glVertex2f(g_vector2D.fX+0.2f,g_vector2D.fY-0.4f);    }    glEnd();    glFlush();//提交绘图命令    glutSwapBuffers();//交换前台缓冲与后台缓冲(GLUT_DOUBLE双缓冲模式需要)}//闲置时调用的函数void IdleFunc(){    glutPostRedisplay();//重新绘制(即调用DisplayFunc()函数)}//数字、字母键按键检测void KeyboardFunc(unsigned char Key,int x,int y){    if(Key == 'w' || Key == 'W')    {        if(g_vector2D.fY < 1.0f)//界限判定            g_vector2D.fY += 0.05f;    }    if(Key == 's' || Key == 'S')    {        if(g_vector2D.fY - 0.4f > -1.0f)//界限判定            g_vector2D.fY -= 0.05f;    }    if(Key == 'a' || Key == 'A')    {        if(g_vector2D.fX > -1.0f)//界限判定            g_vector2D.fX -= 0.05f;    }    if(Key == 'd' || Key == 'D')    {        if(g_vector2D.fX + 0.4f< 1.0f)//界限判定            g_vector2D.fX += 0.05f;    }}//F1~F12、控制键检测void SpecialFunc(int Key,int x,int y){    if(Key == GLUT_KEY_UP)    {        if(g_vector2D.fY < 1.0f)//界限判定            g_vector2D.fY += 0.05f;    }    if(Key == GLUT_KEY_DOWN)    {        if(g_vector2D.fY - 0.4f > -1.0f)//界限判定            g_vector2D.fY -= 0.05f;    }    if(Key == GLUT_KEY_LEFT)    {        if(g_vector2D.fX > -1.0f)//界限判定            g_vector2D.fX -= 0.05f;    }    if(Key == GLUT_KEY_RIGHT)    {        if(g_vector2D.fX + 0.4f< 1.0f)//界限判定            g_vector2D.fX += 0.05f;    }}//鼠标检测void MouseFunc(int button,int state,int x,int y){    //button  鼠标按键 0 -- 左键    1 -- 中键   2 -- 右键    //state  鼠标状态  0 -- 按下  1 -- 抬起    //x,y  鼠标的像素点坐标(以窗口的左上角为原点的坐标系)    std::cout<<"鼠标的坐标:x = "<<x<<" ,y = "<<y<<std::endl;    if(button == 0)    {        if(state == 0)        {            std::cout<<"鼠标左键按下"<<std::endl;        }        if(state == 1)        {            std::cout<<"鼠标左键抬起"<<std::endl;        }    }    if(button == 1)    {        if(state == 0)        {            std::cout<<"鼠标中键按下"<<std::endl;        }        if(state == 1)        {            std::cout<<"鼠标中键抬起"<<std::endl;        }    }    if(button == 2)    {        if(state == 0)        {            std::cout<<"鼠标右键按下"<<std::endl;        }        if(state == 1)        {            std::cout<<"鼠标右键抬起"<<std::endl;        }    }}//鼠标按着拖动void MotionFunc(int x,int y){    //x,y  鼠标的像素点坐标(以窗口的左上角为原点的坐标系)    std::cout<<"鼠标按着拖动的坐标:x = "<<x<<" ,y = "<<y<<std::endl;}//鼠标移动void PassiveMotionFunc(int x,int y){    //x,y  鼠标的像素点坐标(以窗口的左上角为原点的坐标系)    std::cout<<"鼠标移动的坐标:x = "<<x<<" ,y = "<<y<<std::endl;}

//运行效果:对鼠标的操作,会在控制台屏幕上显示出鼠标的坐标

原创粉丝点击