前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】OpenGL:键盘交互示例

【C++】OpenGL:键盘交互示例

作者头像
DevFrank
发布2024-07-24 14:45:13
580
发布2024-07-24 14:45:13
举报
文章被收录于专栏:C++开发学习交流

在窗体中创建多边形

新建opengl项目,安装好nupengl程序包,开始main函数编写。

创建多边形窗体,相信大家已经熟悉了:

代码语言:javascript
复制
#include <GL/glut.h>

void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.8, 0.5, 0.6);
	glPointSize(5);
	glBegin(GL_POLYGON);
	glVertex2i(10 , 10 );
	glVertex2i(20 , 10 );
	glVertex2i(20 , 0 );
	glVertex2i(10 , 0 );
	glEnd();
	glFlush();
}

void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-20, 30, -20, 30);	//可视的范围,类似鼠标滚轮的远近
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100);
	glutInitWindowSize(600, 500);
	glutCreateWindow("key interaction");

	init();
	glutDisplayFunc(myDisplay);	//传递需要勾画的函数
	glutMainLoop();
	return 0;
}

多边形窗体效果如下:

在这里插入图片描述
在这里插入图片描述

写入键盘交互函数

我们的目的是通过键盘交互,使窗体中的多边形依次上下左右移动。

因此,我们要先改变一下多边形函数-myDisplay(),首先创建全局变量:

代码语言:javascript
复制
int xd = 0, yd = 0;	//全局变量

然后在多边形的几个顶点的(x,y)坐标后分别加上xdyd

代码语言:javascript
复制
	glVertex2i(10 + xd, 10 + yd);
	glVertex2i(20 + xd, 10 + yd);
	glVertex2i(20 + xd, 0 + yd);
	glVertex2i(10 + xd, 0 + yd);

移动需要的变量有了,接着我们要创建键盘动作函数了。

首先在main函数中加入键盘操作:

代码语言:javascript
复制
glutKeyboardFunc(myKeyboard);		//调用键盘函数

然后创建键盘函数:

代码语言:javascript
复制
void myKeyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'w':yd++; break;
	case 's':yd--; break;
	case 'a':xd--; break;
	case 'd':xd++; break;
	}
	glutPostRedisplay();	//刷新显示
}

运行程序,就可以通过键盘控制多边形移动了,移动后的效果如下:

在这里插入图片描述
在这里插入图片描述

完整程序

main.cpp

代码语言:javascript
复制
#include <GL/glut.h>

int xd = 0, yd = 0;	//全局变量

void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.8, 0.5, 0.6);
	glPointSize(5);
	glBegin(GL_POLYGON);
	glVertex2i(10 + xd, 10 + yd);
	glVertex2i(20 + xd, 10 + yd);
	glVertex2i(20 + xd, 0 + yd);
	glVertex2i(10 + xd, 0 + yd);
	glEnd();
	glFlush();
}

void myKeyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'w':yd++; break;
	case 's':yd--; break;
	case 'a':xd--; break;
	case 'd':xd++; break;
	}
	glutPostRedisplay();	//刷新显示
}

void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-20, 30, -20, 30);	//可视的范围,类似鼠标滚轮的远近
}


int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100);
	glutInitWindowSize(600, 500);
	glutCreateWindow("key interaction");

	init();
	glutDisplayFunc(myDisplay);	//传递需要勾画的函数
	glutKeyboardFunc(myKeyboard);		//调用键盘函数
	glutMainLoop();
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在窗体中创建多边形
  • 写入键盘交互函数
  • 完整程序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档