OpenGL實現(xiàn)鼠標(biāo)移動方塊
本文實例為大家分享了OpenGL實現(xiàn)鼠標(biāo)移動方塊的具體代碼,供大家參考,具體內(nèi)容如下
思路:用變量設(shè)定方塊的坐標(biāo),然后根據(jù)鼠標(biāo)的位移更改方塊的變量坐標(biāo)。
注意:方塊的繪圖坐標(biāo)系和世界坐標(biāo)系是重合的,鼠標(biāo)所在的坐標(biāo)是以窗口的左上角為原點(0,0)的坐標(biāo)系,窗口的左下角的世界坐標(biāo)系為gluOrho2D(left, right, bottom, top)中的(left, bottom)。所以鼠標(biāo)的坐標(biāo)(xMouse, yMouse)轉(zhuǎn)化為世界坐標(biāo)(x, y)為: x = xMouse; y = top - yMouse.且鼠標(biāo)位移的Y增量在世界坐標(biāo)系中式減量。
#include <GL/glut.h>
#include "Graphics.h"
int x1 = 0, y1 = 0, x2 = 100, y2 = 100; //方塊的左下角坐標(biāo)和右上角坐標(biāo)
int x = 0, y = 0; //鼠標(biāo)位置
int dx = 0, dy = 0; //鼠標(biāo)位移
int b = 0; //判斷鼠標(biāo)是否在方塊內(nèi)
void init()
{
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 800.0, 0.0, 800.0); //窗口左下角的世界坐標(biāo)系為 (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)的窗口坐標(biāo)系中的點
y = yMouse;
if (inRect(x, y)) b = 1;
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) b = 0; //當(dāng)移動較快時鼠標(biāo)會在刷新間隔移出方塊,所以用DOWN和UP來判斷鼠標(biāo)在方塊內(nèi)
}
void moveMouse(int xMouse, int yMouse)
{
if (b) {
dx = xMouse - x;
dy = yMouse - y;
x1 = x1 + dx;
x2 = x2 + dx;
y1 = y1 - dy; //鼠標(biāo)的窗口坐標(biāo)系和世界坐標(biāo)系的Y軸相反,所以鼠標(biāo)向Y軸的正方向移動的時候,在世界坐標(biāo)系是向Y軸的負(fù)方向移動
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;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
帶你用C語言實現(xiàn)strtok和字符串分割函數(shù)
下面小編就為大家?guī)硪黄猚語言中字符串分割函數(shù)及實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09
詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用
這篇文章主要介紹了詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
在C++17中實現(xiàn)無鎖數(shù)據(jù)結(jié)構(gòu)的方法詳解
在探索?C++17?中的無鎖數(shù)據(jù)結(jié)構(gòu)之前,我們首先需要理解無鎖編程的基本概念及其在現(xiàn)代軟件開發(fā)中的重要性,在這個章節(jié)中,我們將深入探討無鎖編程的概念,以及它如何滿足人類對于更高效、更可靠軟件的本能需求,文中通過代碼示例介紹的非常詳細(xì),感興趣的朋友可以參考下2023-12-12

