C/C++ EasyX图形库

Last updated on 2 years ago

-->官方文档<--

EsayX头文件

头文件有两个

  • graphics.h:包含了已经被淘汰的函数

  • easyx.h:只有最新的函数

窗口的创建与关闭

  • initgraph(int x ,int y ,int style):x,y为窗口大小,style为是否显示控制台
  • closegraph():关闭窗口

设置窗口属性

  • **setbkcolor(颜色)**:设置窗口颜色
    • 颜色宏:颜色英文大写,可在easyx.h文件中支持的颜色
    • RGB

基本绘图函数

  • **line(int x,int y.int xx .int yy)**:两点确定一条直线

  • circle(int x ,int y ,int r):使用圆心和半径画圆

    • fillcircle(int x,int y ,int r):填充圆(带边界线)
    • solidcircle(int x,int y,int r):填充圆(不带边界线)
  • **rectangle(int x ,int y ,int xx ,int yy)**:使用左上角坐标,右下角坐标画矩形

    • fillrectangle(int x,int y,int xx,int yy):填充矩形(带边界线)
    • solidrectangle(int x,int y,int r):填充矩形(不带边界线)
  • setfillcolor(颜色):设置填充颜色

  • cleardevice():刷新

贴图

定义IMAGE变量

1
IMAGE img;//用IMAGE变量表示图片

加载图像

1
2
loadimage(IMAGE *img,URL);//原始大小
loadimage(IMAGE *img,URL,int width,int height);//修改大小

显示图像

1
putimage(int x,int y,IMAGE* img);
  • 原样贴图:按照上面步骤进行

  • 透明贴图

    1. 使用位与运算显示二进制掩码图

      1
      putimage(int x,int y,IMAGE* img,SRCAND);
    2. 使用位异或运算显示背景图

      1
      putimage(int x,int y,IMAGE* img,SRCPAINT);
  • png贴图

    直接载入的话透明部分会显示为黑色,可通过算法解决。(自行寻找)

透明贴图素材制作与原理

二进制掩码图

将需要设置成透明的部分填充成白色,要保留的部分填充成黑色,用1表示白色,0表示黑色,故称为二进制掩码图

背景图

将需要设置成透明的部分填充成黑色,要保留的地方不变

原理(个人理解):

以下内容仅为个人理解,没有任何依据,仅供方便理解记忆

以下内容仅为个人理解,没有依据,仅供方便理解参考

我们可以用setcolor()设置窗口背景颜色,或是使用putimage()设置一张图片作为窗口背景图,用二进制表示每个位的颜色,0为黑,其余统一为1。

接着使用**SRCAND()**将二进制掩码图和窗口背景图进行位与运算,由于掩码图将需要保留的部分填充为黑色,将需要透明的部分填充为白色,与运算后,会得到一张需要保留的部分为黑色,需要成透明的部分为窗口背景图的图,称为a

最后使用SRCPAINT(),将背景图与a进行位异或运算,由于背景图要保留的部分是不为黑的1,透明部分为黑0,与b运算后,会得到一张

所需要的透明图了。

图示

交互

阻塞式交互

不交互就无法继续进行

非阻塞式交互

不交互仍然会进行

定时器和双缓冲绘图

定时器

sleep()是一个全局阻塞,可以使用定时器进行单个对象的刷新

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <time.h>//头文件
int Timer(int id,int duration)//输入时间间隔和计时器id
{
static int startTime[10];//静态变量默认初始化为0
int endTime = clock();//clock函数,获取程序开始运行目前位置的时间
if(endTime - startTime[id] >= duration)
{
startTime[id] = endTime;
return 1;
}
else return 0;

}

双缓冲绘图

双缓冲绘图是指,在屏幕看不见的地方,先将图形绘制出来,然后再移动到指定位置,可以避免频闪问题。

1
2
3
4
#include<graphics.h>
BeginBatchDraw();//开启双缓冲绘图
FlushBatchDraw();//显示每一帧,不开的话图形会不显示
EndBatchDraw();//关闭双缓冲绘图

键盘交互

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <conio.h>
getch();//getch()不需要回车确认,可配合switch和if语句进行键盘输入和操作,但会造成阻塞

kbhit()//检查当前是否有键盘输入,有则返回一个非0值,否则返回0,而且按下键盘后必须有getch一类将输入接收掉,不然会一直有返回值。

异步处理
#include <graphics.h>
void keyDown()
{
if(GetAsyncKeyState(vkey))//vkey为虚拟键码
}
//使用异步处理,运动会更快速更流畅,速度可以配合定时器控制。

虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

鼠标交互