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;
}

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

(0)

相关推荐

  • OpenGL实现3D空间中移动图像

    Qt_OpenGL:3D空间中移动图像,供大家参考,具体内容如下 //.h #ifndef GLWIDGET_H #define GLWIDGET_H #include <QGLWidget> #include <QtOpenGL> class QGLWidget; class QTimer; typedef struct Stars{ public: int r, g, b; GLfloat dist, angle; }Stars; class GLWidget : public

  • OpenGL实现鼠标移动方块

    本文实例为大家分享了OpenGL实现鼠标移动方块的具体代码,供大家参考,具体内容如下 思路:用变量设定方块的坐标,然后根据鼠标的位移更改方块的变量坐标. 注意:方块的绘图坐标系和世界坐标系是重合的,鼠标所在的坐标是以窗口的左上角为原点(0,0)的坐标系,窗口的左下角的世界坐标系为gluOrho2D(left, right, bottom, top)中的(left, bottom).所以鼠标的坐标(xMouse, yMouse)转化为世界坐标(x, y)为: x = xMouse;   y = t

  • 详解Java图形化编程中的鼠标事件设计

    鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口. MouseListener接口 MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标.鼠标进入.鼠标退出.相应的方法有: (1) getX():鼠标的X坐标 (2) getY():鼠标的Y坐标 (3) getModifiers():获取鼠标的左键或右键

  • AjaxUI:鼠标拖拽

    New Document body{padding:0px;text-align:center;font:12px Arial;} div.container{width:100px;height:100px;border:1px solid #000;margin:10px auto;} div#main{width:99px;height:99px;border:1px solid #000;background:#050;color:#fff;font:12px Arial;margin:

  • 记录鼠标的轨迹并回放的js代码

    遇到的问题: Question①:mousemove事件中,移动方法中会被记录很多的left和top,我只需要大概的几组数据就行,不需要那么多: Question②:回放的时候,在for循环里执行太快了,导致的效果就是直接看到开始跟结束位置,我想放慢中间的过程:搞了一个延迟的函数,但是还是没有实质性解决. 慢慢慢慢拖动小方块到一个新位置,然后松开鼠标, 先点击"复位",再点击"回放"查看所经过的路径, 只有一次机会哦 - -||| 循环内延迟的部分代码: 复制代码

  • 原生js写的放大镜效果

    我的大体思路是:时时监听鼠标的坐标,当鼠标移动时,透明层随着鼠标移动,大图片相对透明层的移动而移动.不废话了,看代码. 复制代码 代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>放大镜</title> <meta name="Keywords" content=""> <me

  • Vue实现拖拽穿梭框功能四种方式实例详解

    目录 一.使用原生js实现拖拽 二.VUe使用js实现拖拽穿梭框 三.Vue 拖拽组件 vuedraggable 四.Awe-dnd指令封装 一.使用原生js实现拖拽 <html lang="en"> <head> <meta charset="UTF-8" /> <title>Lazyload</title> <style> .drag { background-color: skyblue;

  • Jquery 方块随着鼠标所在的区域而放大

    效果如下图:实现代码:运行后F5刷新下 Jquery 方块随着鼠标所在的区域而放大 *{margin:0;padding:0;} .dock { text-align:center;} .dock div{width:8px;height:8px;border:1px #dfdfdf solid; background:#dfdfdf;margin:2px auto; line-height:0px;overflow: hidden;} //配置 var m=5;//最大倍数 var s=400

  • Python著名游戏实战之方块连接 我的世界

    目录 导语 正文 (1)<我是世界>游戏规则. (2)主要程序代码. (3)效果图如下. ​总结 导语 <我的世界>是一款自由度极高的游戏,每个新存档的开启,就像是作为造物主的玩家在虚拟空间开辟了一个全新的宇宙. 方块连接世界,云游大好河山. 国庆不是回家了一趟嘛?隔壁家的小胖墩在跟家里的小孩子一起玩手机,一起下载 了这款<我的世界>的游戏,玩儿的可是非常起劲儿了,建房子打怪,别说那房子的模型着实蛮惊艳的哈! 至少我作为一个没玩过的人来说确实是很牛逼了~ 至少我做不来哈

  • 解决Vista系统OpenGL驱动问题的方法整理

    关于Vista系统下OPENGL不支持的问题,比较复杂,现列一些解决方法如下(以GF为例): 1.强行设置,有些显卡老提醒你说不支持OPENGL,别理他,继续设置,可以用的. 2.如果不行,下载最新的显卡驱动 3.最好安装DirectX 9,地址:http://www.vista123.com/html/3770.html 一般这样都能解决问题,还不行,看下面. 4.手工安装GLsetup.exe或MSOpengl(地址:http://www.openglsource.com/download/

  • javascript 鼠标事件总结

    常见的有以下8个: mousedown:鼠标的键钮被按下. mouseup:鼠标的键钮被释放弹起. click:单击鼠标的键钮. dblclick:鼠标的键钮被按下. contextmenu :弹出右键菜单. mouseover:鼠标移到目标的上方. mouseout:鼠标移出目标的上方. mousemove:鼠标在目标的上方移动. mousedown事件与mouseup事件可以说click事件在时间上的细分,顺序是mousedown => mouseup => click.因此一个点击事件,

随机推荐