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

文章目录

     一、安装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();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app 接入微信短剧播放器

前言 作为一个 uniapp 初学者&#xff0c;恰巧遇到微信短剧播放器接入的需求&#xff0c;在网上检索许久并没有发现傻瓜式教程。于是总结 uni-app 官网文档及微信开放文档&#xff0c;自行实践后&#xff0c;总结出几个步骤&#xff0c;希望为大家提供些帮助。实践后发现其实确…

42.接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

抖音小店出单之后怎么发货?抖店详细发货流程来了

大家好&#xff0c;我是喷火龙。 抖音小店发货是有规则的&#xff0c;如果出现超时发货或者虚假发货都会被平台处罚的&#xff0c;会影响我们店铺的评分和正常运营&#xff0c;还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…

夏季天气炎热没胃口怎么办?没食欲,心情浮躁怎么调理?

点击文末领取中医揿针的视频教程跟直播讲解 夏季天气炎热&#xff0c;很容易就让人出现胃口不佳的情况&#xff0c;再加上不少人需要长期服药&#xff0c;或是受到病痛困扰&#xff0c;更是严重影响了食欲。 夏养心 夏季&#xff0c;在这个季节&#xff0c;心脏的负担是很重…

JVM学习-对象实例化、内存布局、访问定位

对象实例化 创建对象方式 创建对象步骤 判断对象对应的类是否加载、链接、初始化 虚拟机遇到一个new指令&#xff0c;首先会去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析、初始化(判断…

【源码+文档+调试讲解】可信捐赠系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统可信捐赠系统信息管理难度大&#xff0c;容错率低&#x…

【基于Fluent和深度学习算法驱动的流体力学计算与应用】

在深度学习与流体力学融合的背景下&#xff0c;科研边界不断拓展&#xff0c;创新成果层出不穷。从物理模型融合到复杂流动模拟&#xff0c;从数据驱动研究到流场智能分析&#xff0c;深度学习正以前所未有的力量重塑流体力学领域。目前在Nature和Science杂志上发表的深度学习驱…

香橙派 Kunpeng Pro 上手初体验

香橙派 Kunpeng Pro 上手初体验 目录 香橙派 Kunpeng Pro 上手初体验1.前言2.开箱3.开发板资源介绍硬件规格参数外观规格参数4.系统环境搭建系统镜像烧录ssh连接5.简单测试6.总结 1.前言 我很荣幸能收到了来自CSDN的测评邀请&#xff0c;让我有机会对香橙派最新推出的Kunpeng …

10个最佳人物素材网站推荐,免费获取第一个PNG文件!

人物素材是设计中应用最广泛的元素之一。无论是网页设计还是移动终端设计&#xff0c;人物素材的插画设计都比文字信息更容易吸引用户的注意力。作为内容呈现&#xff0c;还可以增加设计的艺术属性。为了节省大家寻找人物素材的时间成本&#xff0c;本文立即为大家整理了10个宝…

ARM IHI0069F GIC architecture specification (8)

3.2中断旁路支持 CPU interface可以支持中断信号旁路&#xff0c;使得当接口发出的中断信号被禁用时&#xff0c;传统中断信号被传递到PE上的中断请求输入&#xff0c;从而绕过GIC功能。 是否支持旁路由实际设计决定。 用于确定是否使用GICv3 FIQ和IRQ输出或旁路信号的控制取决…

Xinstall地推效果大揭秘:洞察用户需求,创新营销策略不再是难题

在互联网流量红利逐渐衰退的今天&#xff0c;企业如何快速搭建起满足用户需求的运营体系&#xff0c;成为了亟待解决的问题。特别是在地推领域&#xff0c;如何在多变的互联网环境下&#xff0c;迅速、有效地触达用户&#xff0c;扩大目标用户基数和流量池&#xff0c;成为了企…

计算机类主题会议推荐之——ACAIB 2024

【北方民族大学40 周年校庆学术活动】 第四届自动化控制、算法与智能仿生学术会议(ACAIB 2024) 2024年6月7-9日 中国银川 往届均已见刊检索 EI、SCOPUS双检索 基本信息 会议官网&#xff1a;www.acaib.org 最终截稿时间&#xff1a;2024年6月3日晚23&#xff1a;…

自定义CSS属性(@property)解决自定义CSS变量无法实现过渡效果的问题

且看下面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>demot</title&g…

HX-100调频广播覆盖专用天线

HX-100全向天线是北京恒星科通科技发展有限公司自主研发的一款隧道专用宽带调频发射天线&#xff0c;采用圆盘形结构、振子采用铝合金材料制造&#xff0c;具有增益高、功率容量大、工作频带宽、安装方便、防腐防潮、抗风性能好等特点&#xff0c;特别适合隧道调频广播覆盖、地…

多语言跨境电商源码:迅狐系统的创新融合

在全球化经济的浪潮中&#xff0c;跨境电商正成为连接不同国家和地区消费者的重要桥梁。迅狐多商户跨境电商商城系统&#xff0c;以其创新的技术解决方案&#xff0c;将传统销售模式与新型电商营销手段完美融合&#xff0c;为用户和技术商提供了一个多语言、多功能的跨境电商平…

预防侵权知识丨什么是图形商标?怎么用产品图片进行图形商标查询检索?

图形商标查询检索是跨境电商预防侵权中重要的一环&#xff0c;但是有很多卖家对图形商标不太了解&#xff0c;也不知道怎么进行图形商标的查询检索。所以&#xff0c;我们一起来看下。 一、什么是图形商标 图形商标是商标的一种&#xff0c;指的是由几何图形或其它事物图案构…

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

链动3+1模式:引领企业创新发展的全新商业模式

在数字化时代&#xff0c;企业正积极寻求创新策略以应对竞争激烈的市场环境。链动31模式&#xff0c;作为一种前沿的商业模式&#xff0c;为企业带来了全新的发展机遇。本文将对链动31模式进行深度剖析&#xff0c;并与传统的链动21模式进行对比&#xff0c;以展现其独特魅力和…

C语言-信号

信号 一、信号是什么东西 信号是事件发生时通知进程的一种机制&#xff0c;有时也称之为软件中断。 信号的到来会打断了程序执行的正常流程。 大多数情况下&#xff0c;无法预测信号到达的精确时间。 一个&#xff08;具有合适权限的&#xff09;进程能够向另一进程发送信…