【C++】<图形库> EasyX基础使用

news2024/11/20 16:34:11

文章目录

     一、安装EasyX库

二、图形窗口显示

三、基本绘图函数

四、图片显示

五、键盘交互

六、鼠标交互

七、双缓冲区解决闪屏


一、安装EasyX库

已经有兄弟写得很清楚了,见EasyX | 安装教程(详细图文)。


二、图形窗口显示

1. 包含的头文件:

  • graphics.h:包含已经被淘汰的函数
  • easyx.h:只包含最新的函数

2. 窗口创建及关闭:

  • 创建:initgraph(int x, int y, int style); 其中x和y代表窗口的大小,style为0表示不显示控制台,为1表示显示控制台。
  • 关闭:closegraph(); 

3. 图形化界面坐标:

  • 原点位于左上角,x轴往右为正半轴,y轴往下为正半轴。

4. 设置窗口属性:

  • 背景颜色:setbkcolor(颜色); 其中颜色可以使用RGB(i, j, k)或者RED等常量。
  • 刷新窗口:cleardevice(); 不刷新窗口不会更新显示内容。

5. 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <graphics.h>
using namespace std;

int main()
{
	//创建800*600的窗口
	initgraph(800, 600, 0);
	//设置背景颜色为绿色
	setbkcolor(RGB(0, 255, 0));
	//刷新窗口
	cleardevice();
	//避免直接结束程序
	while (1) {}
	//关闭窗口
	closegraph();
	return 0;
}

三、基本绘图函数

1. 绘制线段:

  • line(int x, int y, int xx, int yy);
  • x和y表示起始点坐标,xx和yy表示终点坐标。
  • //绘制一条从(0,0)到(800,600)的线段
    line(0, 0, 800, 600);

2. 绘制圆:

  • 线条圆:circle(int x, int y, int r); 其中x和y为圆心坐标,r为半径。
  • 填充有线圆:fillcircle(int x, int y, int r); 绘制出的圆有边框线且内部有填充。
  • 填充无线圆:solidcircle(int x, int y, int r); 绘制的圆无边框线且内部有填充。
  • 填充颜色:setfillcolor(颜色);
  • //线条圆
    circle(100, 100, 50);
    //设置填充颜色为红色
    setfillcolor(RED);
    //填充有线圆
    fillcircle(200, 500, 20);
    //填充无线圆
    solidcircle(500, 200, 50);

3. 绘制矩形:

  • 线条矩形:rectangle(int x, int y, int xx, int yy);其中x和y为矩形左上角坐标,xx和yy为右下角坐标。
  • 填充有线矩形:fillrectangle(int x, int y, int xx, int yy);
  • 填充无线矩形:solidrectangle(int x, int y, int xx, int yy);
  • //线条矩形
    rectangle(400, 300, 500, 500);
    //填充有线矩形
    fillrectangle(300, 400, 500, 500);
    //填充无线矩形
    solidrectangle(150, 200, 300, 300);

四、图片显示

1. 原样显示:

  • ①创建IMAGE类型变量。例如IMAGE image;
  • ②加载图片,调用函数loadimage(IMAGE* image, 图片路径, int x, int y); 其中image是步骤一创建的变量的地址,x和y是图片大小(可省略)。
  • ③显示图片,调用函数putimage(int x, int y, IMAGE* image); 其中x和y是图片左上角的坐标。
  • 注意:若出现错误,需要修改属性--->高级中的字符集为多字节字符集,右击的是解决方案下面那一行!
  • IMAGE wsl;
    loadimage(&wsl, "./wsl.jpg", 800, 600);//图片长800宽600
    putimage(400, 300, &wsl);//从(400,300)开始显示

2. 透明贴图:去除图片背景。

  • ①制作掩码图和核心图,可以利用ps等工具(在线ps工具:www.uupoop.com/#/)。如下图所示,左图为掩码图,右图为核心图。

                               

  • ②利用原样显示的方式将两张图同时显示。
  • IMAGE dog[2];
    loadimage(dog, "./dog.png", 150, 150);
    loadimage(dog + 1, "./dogbk.png", 150, 150);
    putimage(200, 200, dog, SRCAND);		//掩码图
    putimage(200, 200, dog + 1, SRCPAINT);	//核心图

五、键盘交互

1. 阻塞式获取键盘输入(不常用):

  • ①添加头文件<conio.h>。
  • ②使用_getch()函数获取键盘输入。不同于cin等需要回车的机制,该函数可以实时获取键盘输入,更适合与用户交互。但是,若只使用_getch()则会使系统阻塞至这条语句,直至用户输入。因此,通常和_kbhit()联合使用,当_kbhit()检测到键盘输入时才会进行相关操作。
  • ③使用_kbhit()函数检测键盘是否有输入。

2. 非阻塞式获取键盘输入(常用):

  • 调用GetAsyncKeyState(按键常量值)函数。
  • 这种方式不需要按键检测,而且支持斜方向移动(按住左键和下键可以往斜下方移动)。

3. 代码示例:在图形化窗口中绘制两个球,一个球自动移动并且碰到边缘自动弹射,另一个球由用户控制其移动。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <thread>
#include <chrono>
#include <graphics.h>
#include <conio.h>
using namespace std;

class Ball {
private:
	int x;//x坐标
	int y;//y坐标
	int r;//半径
	int dx;//x方向移动增量
	int dy;//y方向移动增量
	int status = 4;//球自动移动的模式:1.左上移动 2.左下移动 3.右下移动 4.右上移动
public:
	Ball(int x, int y, int r, int dx, int dy) :x(x), y(y), r(r), dx(dx), dy(dy) {}

	//函数:在窗口中绘制球
	void drawBall() {
		setfillcolor(LIGHTBLUE);
		solidcircle(x, y, r);
	}

	//函数:球自动移动
	void moveBall() {
		//碰壁检测,改变移动模式
		if (x + r >= 800) {//碰到右墙
			status = 1;
		}
		else if (y <= r) {//碰到上墙
			status = 2;
		}
		else if (x <= r) {//碰到左墙
			status = 3;
		}
		else if (y + r >= 800) {//碰到下墙
			status = 4;
		}
		//根据模式来移动
		switch (status) {
		case 1:
			x -= dx;
			y -= dy;
			break;
		case 2:
			x -= dx;
			y += dy;
			break;
		case 3:
			x += dx;
			y += dy;
			break;
		case 4:
			x += dx;
			y -= dy;
			break;
		}
	}

	//函数:键盘控制球移动
	void inputMove() {
		//阻塞式交互
		/*char keyNumber = _getch();
		switch (keyNumber) {
		case 'w':
			y -= dy;
			break;
		case 's':
			y += dy;
			break;
		case 'a':
			x -= dx;
			break;
		case 'd':
			x += dx;
			break;
		}*/
		//非阻塞式交互
		if (GetAsyncKeyState(VK_UP)) {
			y -= dy;
		}
		if (GetAsyncKeyState(VK_DOWN)) {
			y += dy;
		}
		if (GetAsyncKeyState(VK_LEFT)) {
			x -= dx;
		}
		if (GetAsyncKeyState(VK_RIGHT)) {
			x += dx;
		}
	}
};

int main()
{
	//创建窗口,设置背景色
	initgraph(800, 800, 0);
	setbkcolor(WHITE);
	//创建两个球对象,b自动来回弹,键盘控制moveball
	Ball b(500, 500, 20, 5, 5);
	Ball moveball(400, 400, 20, 5, 5);
	//绘制两个球,并显示运动轨迹
	while (1) {
		BeginBatchDraw();
		cleardevice();
		b.drawBall();
		b.moveBall();
		moveball.drawBall();
		//按键检测(阻塞式交互才需要)
		/*if (_kbhit()) {
			moveball.inputMove();
		}*/
		moveball.inputMove();
		//延迟1毫秒
		this_thread::sleep_for(chrono::milliseconds(1));
		FlushBatchDraw();
	}
	//关闭窗口
	closegraph();
	return 0;
}

六、鼠标交互

(1) 一般处理流程:

  • ①创建变量存储鼠标信息:ExMessage mouse;
  • ②调用peekmessage(&mouse)函数检测是否有鼠标点击。
  • ③若存在鼠标点击,处理点击信息。

(2) 注意:一般使用switch-case的结构来判定点击信息。还可以使用mouse.x和mouse.y来获取当前鼠标点击的位置。

(3) 代码示例:鼠标点击左键时画圆,右键画矩形。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <graphics.h>
using namespace std;

int main()
{
	initgraph(800, 600, 0);
	ExMessage mouse;
	while (1) {
		//鼠标交互
		if (peekmessage(&mouse)) {
			switch (mouse.message) {
			case WM_LBUTTONDOWN://鼠标左键按下画圆
				circle(mouse.x, mouse.y, 5);
				break;
			case WM_RBUTTONDOWN://鼠标右键按下画矩形
				rectangle(mouse.x - 5, mouse.y - 5, mouse.x + 5, mouse.y + 5);
				break;
			}
		}
	}
	closegraph();
	return 0;
}

七、双缓冲区解决闪屏

当绘制的图形过多时,就会出现闪屏现象,影响视觉体验。因此,可以使用双缓冲机制来解决闪屏,调用如下函数即可,可以参考easyx图形库-----贴图技巧之双缓冲消除闪屏。

BeginBatchDraw();
cleardevice();

//绘制图形

FlushBatchDraw();//也可以用EndBatchDraw();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题&#xff0c;也是计算机视觉领域的重要应用之一。…

【加密与解密(第四版)】第二十一章笔记

第二十一章 VMProtect逆向和还原浅析 21.1 VMProtect逆向分析 21.2 VMProtect的还原 不行了&#xff0c;一点都看不懂

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

推荐网站(17)audiohub免费音乐平台

今天&#xff0c;我要向您推荐一个非常实用的网站——AudioHub。这是一个提供免费音乐的平台&#xff0c;特别适合需要无版权音乐资源的创作者、视频制作人、播客主持人以及任何需要背景音乐的项目。里面的音乐无版权&#xff0c;可商用。 链接直达&#xff1a;https://audiohu…

移动硬盘不显示容量与无法访问问题的解决方案及预防措施

在日常生活和工作中&#xff0c;移动硬盘已成为我们存储数据的重要工具。然而&#xff0c;当遇到移动硬盘不显示容量或无法访问的情况时&#xff0c;我们该如何应对&#xff1f;本文将详细介绍这一问题的现象、原因&#xff0c;并提供两种有效的数据恢复方案&#xff0c;同时还…

深度学习之基于Pytorch框架多人多摄像头摔倒跌倒坠落检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着智能监控技术的广泛应用&#xff0c;对于公共场合的安全监控需求日益增加。摔倒跌倒坠落是常见的…

申请公众号数量达标

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

太阳诱电:顺应时代需求的新型电容器为何能在全球得到广泛应用(下)

随着汽车电动化和电子控制化的进展&#xff0c;车载计算机和电气部件也在逐渐向大功率化的方向发展。而构成这些车载设备电源电路的电子元器件也必须随之进行技术革新。太阳诱电集团携手全资子公司ELNA&#xff0c;开发并供应新型电容器“导电性高分子混合铝电解电容器”&#…

Vue前端项目打包,并部署Vue项目到Linux云服务器上

一. vue前端项目打包 1.使用vscode开发项目 2.在config目录下的prod.env.js文件当中配置我们后端服务器的IP地址和端口号&#xff0c;因为这是在实际的部署当中所以必须要在生成环境下进行项目的部署。 如图所示&#xff1a; 3.在config目录下的index.js文件当中要改assetsPu…

chrome125.0.6422.60驱动包下载

百度网盘地址:https://pan.baidu.com/s/1DAr_O58GQ6m4sk_QePZscA?pwd=5t0j 提取码:5t0j Chrome驱动包(ChromeDriver)是一个用于支持自动化测试的工具,它提供了对Google Chrome浏览器的控制,使您可以编写和运行自动化脚本来测试网站。这个驱动程序是由Selenium项目开…

今日arXiv最热大模型论文:LoRA又有新用途,学得少忘得也少,成持续学习关键!

自大模型&#xff08;LLM&#xff09;诞生以来&#xff0c;苦于其高成本高消耗的训练模式&#xff0c;学界和业界也在努力探索更为高效的参数微调方法。其中Low-Rank Adaptation&#xff08;LoRA&#xff09;自其诞生以来&#xff0c;就因其较低的资源消耗而受到广泛关注和使用…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…

Mysql命令行客户端常用命令

Mysql命令行客户端常用命令 注意点 下面展示的 database_name、table_name、column1、column2、value1、value2 和 datatype在自己用的时候需要替换为实际的值 在敲命令的时候要注意&#xff0c;一定要在末尾加上分号 操作 安装好Mysql之后&#xff0c;搜索找到以下应用 打…

QQ沐个人引导页html源码

好看的QQ沐个人引导页html源码&#xff0c;鼠标移动滑出美丽的线条收缩特效&#xff0c;界面美观大气&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 …

PDF24 Creator v11.12.1软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; PDF24 Creator v11.12.1是一款免费、简便实用的多功能 PDF 工具。用户可通过直观拖放界面轻松组合、编辑和处理PDF文件。功能包括合并、分割、添加、…

Python筑基之旅-MySQL数据库(二)

目录 一、第三方库 1、mysql-connector-python 1-1、由来 1-2、优缺点 1-2-1、优点 1-2-1-1、官方支持 1-2-1-2、纯Python实现 1-2-1-3、全面支持 1-2-1-4、兼容性 1-2-1-5、易于使用 1-2-2、缺点 1-2-2-1、性能 1-2-2-2、安装 1-2-2-3、社区支持 1-2-2-4、扩…

Windows神级工具汇总

Windows神级工具汇总 文章目录 Windows神级工具汇总ConEmu&#xff08;Cmder&#xff09;TortoiseGitListary & everythingBeyond CompareDittof.luxTranclucentTBSyncToyMaximaTyporaKeePass 2VeraCryptTexLive & TeXstudio & MathpixmybaseSeafile8gadgetpack电脑…

基于RK3588的AI边缘计算网关设计

随着物联网和人工智能技术的飞速发展&#xff0c;边缘计算逐渐成为数据处理和分析的重要趋势。RK3588作为一款高性能的处理器&#xff0c;具备强大的计算能力和丰富的接口&#xff0c;为构建AI边缘计算网关提供了有力的支持。本文将介绍基于RK3588的AI边缘计算网关设计&#xf…

数据结构与算法-树-二分搜索树(二)

二叉树节点删除的几种情况 今天我们研究一下二叉搜索树(BST)的删除操作。删除操作对树来讲有些复杂&#xff0c;包含以下场景&#xff1a; 删除点是叶节点删除点非叶节点&#xff0c;只有左子树删除点非叶节点&#xff0c;只有右子树删除点非叶节点&#xff0c;既有左子树又有右…

面试-软件工程与设计模式相关,Spring简介

面试-软件工程与设计模式相关&#xff0c;Spring简介 1.编程思想1.1 面向过程编程1.2 面向对象编程1.2.1 面向对象编程三大特征 1.3 面向切面编程1.3.1 原理1.3.2 大白话&#xff1f;1.3.3 名词解释1.3.4 实现 2. 耦合与内聚2.1 耦合性2.2 内聚性 3. 设计模式3.1 设计模型七大原…