EasyX使用介绍
本文介绍在Visual C++ 2010 Express中 EasyX的使用。
一直在黑窗口练习字符输出程序,是否感觉很乏味。EasyX是针对C++的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。Visual C++ 2010 Express和EasyX的安装和初步使用见“Visual C++ 2010 Express和EasyX初学者入门” https://blog.csdn.net/cnds123/article/details/127801184
EasyX基础知识
EasyX使用上非常简单。
启动 Visual C++(我用的是Visual C++ 2010 Express),创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件就可以了。
先看一个简单的例子:
#include <graphics.h> // 引用图形库头文件
#include <conio.h>
int main()
{
initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素
line(0, 100, 200, 100); //画直线,起点坐标是(0,100)终点坐标是(200,100)
line(100, 0, 100, 200);
circle(100, 100, 50); //画圆,圆心(100, 100),半径 50
_getch(); // 按任意键继续
closegraph(); // 关闭绘图窗口
return 0;
}
效果:
EasyX 也可以在 Win32 Application 项目上使用。需要注意的是,Win32 Application 项目没有控制台,所以无法使用控制台相关的函数。
在 EasyX 中,坐标分两种:物理坐标和逻辑坐标。
物理坐标
物理坐标是描述设备的坐标体系。
坐标原点在设备的左上角,X 轴向右为正,Y 轴向下为正,度量单位是像素。
坐标原点、坐标轴方向、缩放比例都不能改变。
逻辑坐标
逻辑坐标是在程序中用于绘图的坐标体系。
坐标默认的原点在窗口的左上角,X 轴向右为正,Y 轴向下为正,度量单位是点。
默认情况下,逻辑坐标与物理坐标是一一对应的,一个逻辑点等于一个物理像素。
在 EasyX 中,“设备”,是指绘图表面,所有的绘图函数都会绘制在该设备上。
设备分两种,一种是默认的绘图窗口,见前面的例子,另一种是 IMAGE 对象——通过SetWorkingImage 函数可以设置当前用于绘图的设备,见下面的例子。
#include <graphics.h>
#include <conio.h>
int main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 创建 200x200 的 img 对象
IMAGE img(200, 200);
// 设置绘图目标为 img 对象
SetWorkingImage(&img);
// 以下绘图操作都会绘制在 img 对象上面
line(0, 100, 200, 100); //画直线,起点坐标是(0,100)终点坐标是(200,100)
line(100, 0, 100, 200);
circle(100, 100, 50); //画圆,圆心(100, 100),半径 50
// 设置绘图目标为绘图窗口
SetWorkingImage();
// 将 img 对象显示在绘图窗口中
putimage(220, 140, &img);
// 按任意键退出
_getch();
closegraph();
}
效果:
EasyX 表示颜色的方法
EasyX 表示颜色的方法有多种
1. 用预定义常量表示颜色
常量 | 值 | 颜色 |
BLACK | 0 | 黑 |
BLUE | 0xAA0000 | 蓝 |
GREEN | 0x00AA00 | 绿 |
CYAN | 0xAAAA00 | 青 |
RED | 0x0000AA | 红 |
MAGENTA | 0xAA00AA | 紫 |
BROWN | 0x0055AA | 棕 |
LIGHTGRAY | 0xAAAAAA | 浅灰 |
DARKGRAY | 0x555555 | 深灰 |
LIGHTBLUE | 0xFF5555 | 亮蓝 |
LIGHTGREEN | 0x55FF55 | 亮绿 |
LIGHTCYAN | 0xFFFF55 | 亮青 |
LIGHTRED | 0x5555FF | 亮红 |
LIGHTMAGENTA | 0xFF55FF | 亮紫 |
YELLOW | 0x55FFFF | 黄 |
WHITE | 0xFFFFFF | 白 |
2. 用 16 进制数字表示颜色
16 进制的颜色表示规则为:0xbbggrr (bb=蓝,gg=绿,rr=红)
3. 用 RGB 宏合成颜色
4. 用 HSLtoRGB、HSVtoRGB 转换其他色彩模型到 RGB 颜色
明确了上述概念,就可使用EasyX提供的函数进行实践了。
函数说明官方文档 https://docs.easyx.cn/zh-cn/reference
窗口函数用于窗口的一些操作
closegraph(); //关闭绘图窗口
cleardevice(); //清空绘图设备
下面给出几个示例
钟表 (表针形式)程序
先给出效果图:
启动Visual C++(我用的是Visual C++ 2010 Express),创建一个空的控制台项目(Win32 Console Application),【若出现如下提示
(大意是“是否添加CLR组件”,不需要),单击“No”】
然后添加一个新的代码文件(.cpp),
源码如下:
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define PI 3.1415926536
void DrawHand(int hour, int minute, int second)
{
double a_hour, a_min, a_sec; // 时、分、秒针的弧度值
int x_hour, y_hour, x_min, y_min, x_sec, y_sec; // 时、分、秒针的末端位置
// 计算时、分、秒针的弧度值
a_sec = second * 2 * PI / 60;
a_min = minute * 2 * PI / 60 + a_sec / 60;
a_hour= hour * 2 * PI / 12 + a_min / 12;
// 计算时、分、秒针的末端位置
x_sec = int(120 * sin(a_sec));
y_sec = int(120 * cos(a_sec));
x_min = int(100 * sin(a_min));
y_min = int(100 * cos(a_min));
x_hour= int(70 * sin(a_hour));
y_hour= int(70 * cos(a_hour));
// 画时针
setlinestyle(PS_SOLID, 10);
setcolor(WHITE);
line(320 + x_hour, 240 - y_hour, 320 - x_hour / 7, 240 + y_hour / 7);
// 画分针
setlinestyle(PS_SOLID, 6);
setcolor(LIGHTGRAY);
line(320 + x_min, 240 - y_min, 320 - x_min / 5, 240 + y_min / 5);
// 画秒针
setlinestyle(PS_SOLID, 2);
setcolor(RED);
line(320 + x_sec, 240 - y_sec, 320 - x_sec / 3, 240 + y_sec / 3);
}
void DrawDial()
{
// 绘制一个简单的表盘
circle(320, 240, 2);
circle(320, 240, 60);
circle(320, 240, 160);
//outtextxy(296, 310, "BestAns");
wchar_t s[] = L"BestAns";
outtextxy(296, 310, s);
// 绘制刻度
int x, y;
for (int i=0; i<60; i++)
{
x = 320 + int(145 * sin(PI * 2 * i / 60));
y = 240 + int(145 * cos(PI * 2 * i / 60));
if (i % 15 == 0)
bar(x - 5, y - 5, x + 5, y + 5);
else if (i % 5 == 0)
circle(x, y, 3);
else
putpixel(x, y, WHITE);
}
}
void main()
{
initgraph(640, 480); // 初始化 640 x 480 的绘图窗口
DrawDial(); // 绘制表盘
setwritemode(R2_XORPEN); // 设置 XOR 绘图模式
// 绘制表针
SYSTEMTIME ti; // 定义变量保存当前时间
while(!kbhit()) // 按任意键退出钟表程序
{
GetLocalTime(&ti); // 获取当前时间
DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 画表针
Sleep(1000); // 延时 1 秒
DrawHand(ti.wHour, ti.wMinute, ti.wSecond); // 擦表针(擦表针和画表针的过程是一样的)
}
closegraph(); // 关闭绘图窗口
}
移动的球
从左向右移动的球,先给出效果图:
源码如下:
#include <graphics.h>
int main()
{
initgraph(640,480);//绘图环境640*480
setcolor(WHITE);//绘图前景色为白色
setfillstyle(BS_SOLID);//填充样式为固实填充
setfillcolor(RED);//填充颜色为蓝色
BeginBatchDraw();//开始批量绘图
for(int i=50; i<600; i++)
{
circle(i,100,40);//画圆
floodfill(i, 100, WHITE);//填充
FlushBatchDraw();//执行未完成的绘制任务
Sleep(10);//挂起50毫秒
cleardevice();//用背景色清空屏幕
}
EndBatchDraw();//结束批量绘制
closegraph();//关闭图形环境
return 0;
}
OK!