OpenGL实现鼠标移动方块

 更新时间:2020年08月18日 15:54:19   作者:lang_dye  
这篇文章主要为大家详细介绍了OpenGL实现鼠标移动方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了OpenGL实现鼠标移动方块的具体代码,供大家参考,具体内容如下

思路:用变量设定方块的坐标,然后根据鼠标的位移更改方块的变量坐标。

注意:方块的绘图坐标系和世界坐标系是重合的,鼠标所在的坐标是以窗口的左上角为原点(0,0)的坐标系,窗口的左下角的世界坐标系为gluOrho2D(left, right, bottom, top)中的(left, bottom)。所以鼠标的坐标(xMouse, yMouse)转化为世界坐标(x, y)为: x = xMouse;   y = top - yMouse.且鼠标位移的Y增量在世界坐标系中式减量。

#include <GL/glut.h>
#include "Graphics.h"
 
int x1 = 0, y1 = 0, x2 = 100, y2 = 100; //方块的左下角坐标和右上角坐标
int x = 0, y = 0; //鼠标位置
int dx = 0, dy = 0; //鼠标位移
int b = 0;  //判断鼠标是否在方块内
 
void init()
{
  glMatrixMode(GL_PROJECTION);
  gluOrtho2D(0.0, 800.0, 0.0, 800.0); //窗口左下角的世界坐标系为 (0,0)
  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
 
void test()
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0f, 0.0f, 0.0f);
  glRecti(x1, y1, x2, y2);
  glutSwapBuffers();
}
 
int inRect(int xMouse, int yMouse)
{
  yMouse = 800 - yMouse;
  if (xMouse < x2 && xMouse > x1 && yMouse < y2 && yMouse > y1)
 return 1;
  else
 return 0;
}
 
void myMouse(int button, int state, int xMouse, int yMouse)
{
  if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
 x = xMouse; //xMouse, yMouse是以窗口的左上角为原点(0,0)的窗口坐标系中的点
 y = yMouse;
 if (inRect(x, y)) b = 1;
  }
  if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) b = 0; //当移动较快时鼠标会在刷新间隔移出方块,所以用DOWN和UP来判断鼠标在方块内
}
 
void moveMouse(int xMouse, int yMouse)
{
  if (b) {
 dx = xMouse - x;
 dy = yMouse - y;
 x1 = x1 + dx;
 x2 = x2 + dx;
 y1 = y1 - dy; //鼠标的窗口坐标系和世界坐标系的Y轴相反,所以鼠标向Y轴的正方向移动的时候,在世界坐标系是向Y轴的负方向移动
 y2 = y2 - dy;
 x = xMouse;
 y = yMouse;
  }
}
 
int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowPosition(0, 0); 
  glutInitWindowSize(800, 800);
  glutCreateWindow("Move Square");
  init();
  glutDisplayFunc(test);
  glutIdleFunc(test); //移动是动画,为了流畅,必须开这个
  glutMouseFunc(myMouse);
  glutMotionFunc(moveMouse);
  glutMainLoop();
 
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • VScode搭建C/C++开发环境的详细过程

    VScode搭建C/C++开发环境的详细过程

    最近迷上了vscode,小巧美观,最主要的是全平台,但是vscode并不是ide,必须得自己配置环境,下面这篇文章主要给大家介绍了关于VScode搭建C/C++开发环境的详细过程,需要的朋友可以参考下
    2023-06-06
  • C++实现猜数字小游戏

    C++实现猜数字小游戏

    这篇文章主要为大家详细介绍了C++实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 详解C语言内核字符串拷贝与比较

    详解C语言内核字符串拷贝与比较

    本文将探索一下字符串的拷贝与比较,与应用层不同内核字符串拷贝与比较也需要使用内核专用的API函数,字符串的拷贝往往伴随有内核内存分配,我们将首先简单介绍内核如何分配堆空间,然后再以此为契机简介字符串的拷贝与比较
    2022-09-09
  • 用C语言实现单链表的各种操作(二)

    用C语言实现单链表的各种操作(二)

    本篇文章是对用C语言实现单链表的各种操作进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现电子时钟效果

    C++实现电子时钟效果

    这篇文章主要为大家详细介绍了C++实现电子时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++ opencv图像处理实现图像腐蚀和膨胀示例

    C++ opencv图像处理实现图像腐蚀和膨胀示例

    这篇文章主要为大家介绍了C++ opencv图像处理实现图像腐蚀和图像膨胀示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • c++之std::get_time和std::put_time

    c++之std::get_time和std::put_time

    std::get_time和std::put_time是C++中用于日期和时间的格式化和解析的函数,它们都包含在<iomanip>头文件中,std::get_time用于从输入流中解析日期时间字符串,而std::put_time则用于将std::tm结构格式化为字符串
    2024-10-10
  • C++实现合并排序的方法

    C++实现合并排序的方法

    这篇文章主要介绍了C++实现合并排序的方法,实例分析了合并排序的原理与相关实现技巧,需要的朋友可以参考下
    2015-07-07
  • C语言中函数与指针的应用总结

    C语言中函数与指针的应用总结

    本篇文章是对C语言中函数与指针的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 浅谈do {...} while (0) 在宏定义中的作用

    浅谈do {...} while (0) 在宏定义中的作用

    下面小编就为大家带来一篇浅谈do {...} while (0) 在宏定义中的作用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论