easyx安装过程及c语言常用图形库函数
- 格式:ppt
- 大小:203.50 KB
- 文档页数:17
easyx函数
EasyX 函数是一系列图形图像操作函数,它支持许多操作,如画图、绘制图像、设置颜色和线条等,方便使用者执行图形图像操作任务。
EasyX 函数也可以说是一个图形图像函数库,它由若干子函数组成,每个子函数都有自己的特点,可以为开发者进行图形图像的操作,方便使用操作者完成指定的图形图像操作。
EasyX 函数涉及画点、线、三角形、圆、椭圆及画图、写字、设置颜色、线条等多种可以实现的图形图像表达形式及其参数。
EasyX 函数可以应用在计算机图形学课程、计算机图像处理课程、C/C++语言应用课程、动态图形学课程及计算机图形图像处理、计算
机绘图课程等。
- 1 -。
在EasyX图形库中,alpha 函数主要用于设置图像或图形的透明度。
透明度是指图像或图形的不透明程度,值范围为0到255,其中0表示完全透明(不可见),255表示完全不透明(完全可见)。
以下是alpha 函数的基本用法:
void alpha(int alpha_value);
参数:alpha_value 是透明度的值,范围为0到255。
返回值:无。
下面是一个简单的例子,演示了如何使用alpha 函数:
#include <graphics.h>
int main() {
// 初始化图形模式
initgraph(400, 300);
// 画一个矩形,并设置透明度
setfillcolor(RGB(255, 0, 0)); // 红色填充
solidrectangle(50, 50, 200, 150);
// 设置透明度为128(半透明)
alpha(128);
// 再画一个矩形,观察透明效果
setfillcolor(RGB(0, 0, 255)); // 蓝色填充
solidrectangle(100, 100, 250, 200);
// 等待用户点击窗口关闭按钮
getch();
// 关闭图形模式
closegraph();
return 0;
}
在这个例子中,首先使用setfillcolor 函数设置矩形的填充颜色,然后使用solidrectangle 函数画矩形。
接着,使用alpha 函数设置透明度为128,最后再画一个矩形。
由于设置了透明度,两个矩形之间呈现出半透明的效果。
easyx的基础应⽤教程引⽤什么是 EasyX?作者:EasyXEasyX 是针对 C++ 的图形库,可以帮助 C 语⾔初学者快速上⼿图形和游戏编程。
⽐如,可以⽤ VC + EasyX 很快的⽤⼏何图形画⼀个房⼦,或者⼀辆移动的⼩车,可以编写俄罗斯⽅块、贪吃蛇、⿊⽩棋等⼩游戏可以练习图形学的各种算法,等等。
许多学编程的都是从 C 语⾔开始⼊门的,⽽⽬前的现状是:1. 有些学校以 Turbo C 为环境讲 C 语⾔,只是 Turbo C 的环境实在太⽼了,复制粘贴都很不⽅便。
2. 有些学校直接拿 VC 来讲 C 语⾔,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。
可惜在 VC 下只能做⼀些⽂字性的练习题,想画条直线画个圆都很难,还要注册窗⼝类、建消息循环等等,初学者会受严重打击的。
初学3. 还有计算机图形学,这门课程的重点是绘图算法,⽽不是 Windows 编程。
所以,许多⽼师不得不⽤ TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是⽤的 OpenGL,可是门槛依然很⾼。
所以,我们想给⼤家⼀个更好的学习平台,就是 VC ⽅便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。
如果您刚开始学 C 语⾔,或者您是⼀位教 C 语⾔的⽼师,再或者您在教计算机图形学,那么这个库⼀定会让您兴奋的。
1.配置easyx(vs2017+easyx)1.点击easyx官⽹,进⼊easyx⽹页->点击下载按钮->下载安装包(可选择第⼆个下载,第⼀个⼀般为测试版)2.安装easyx会出现下图页⾯,点击安装⽂档和Visual c++ 20173.打开刚才安装的⽂档,就可以看到⾥⾯包括了easyx函数的介绍和使⽤⽅法。
2.函数使⽤使⽤之前要#include <graphics.h> // 引⽤图形库头⽂件然后initgraph(640, 480); // 创建绘图窗⼝,⼤⼩为 640x480 像素(绘图窗⼝不是控制台,initgraph(640,480,SHOWCONSOLE)就可以看到我们熟悉的控制台了)2.1绘图过程:定义变量->加载->贴出分别⽤到IMAGE、loadimage、putimage往往和BeginBatchDraw、FlushBatchDraw、EndBatchDraw搭配使⽤可解决绘图闪烁问题,详见⽂档。
C语⾔基于EasyX库实现有图形界⾯时钟本⽂实例为⼤家分享了C语⾔基于EasyX库实现有图形界⾯时钟的具体代码,供⼤家参考,具体内容如下1.⽬标要求:1.实现⼀个显⽰图像的时钟2.时间与本地时间⼀致2.C语⾔代码:#include<graphics.h> //需要提前安装库函数EasyX,⽹上官⽹下载#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<math.h>#define High 480#define Width 640//画布尺⼨#define PI 3.1415/*SYSTEMTIME ti;GetLocalTime(&ti);//获得本地时间1. ti.wYear2. ti.wMonth3. ti.wDay4. ti.wHour5. ti.wMinute6. ti.wSecond*//*outtextxy(x,y," ");//输出⽂字在(x,y)上*/int IsEnd;//是否结束int center_x,center_y;//中点int second_long;//长度int second_x,second_y;//秒针位置int minute_long;//长度int minute_x,minute_y;//分针位置int hour_long;//长度int hour_x,hour_y;//时针位置int second_num,minute_num,hour_num;//秒针分针时针计数⽤的SYSTEMTIME ti;//定义变量存储系统时间void startup(){ //【数据初始化】IsEnd = 0;initgraph(Width,High);//展⽰画布center_x=Width/2;center_y=High/2;//中⼼点信息second_long= (Width>High)? High/4:Width/4;minute_long=second_long*8/9;hour_long=second_long*2/3;//指针长度信息GetLocalTime(&ti);//获取本地时间second_num= ti.wSecond;//秒针信息second_x=center_x+second_long*sin(((2*PI)/60)*second_num);//计算秒针端点位置second_y=center_y-second_long*cos(((2*PI)/60)*second_num);minute_num= ti.wMinute*5+second_num/12;//分针信息minute_x=center_x+minute_long*sin(((2*PI)/(60*5))*minute_num);//计算分针端点位置minute_y=center_y-minute_long*cos(((2*PI)/(60*5))*minute_num);hour_num= ti.wHour%12*5+minute_num/5/12;//时针信息,按照60刻度算hour_x=center_x+hour_long*sin(((2*PI)/(12*5))*hour_num);//计算时针端点位置hour_y=center_y-hour_long*cos(((2*PI)/(12*5))*hour_num);}void show_begin(){//【初始页⾯展⽰】BeginBatchDraw();//批量绘图开始}void show(){ //【显⽰画⾯】int i;setlinestyle(PS_SOLID,2);//设置线型为实线,线宽为2setcolor(DARKGRAY);//设置颜⾊为暗灰⾊setfillcolor(DARKGRAY);//设置填充颜⾊也为暗灰⾊fillcircle(center_x,center_y,second_long*21/16);//画表盘外圆setcolor(LIGHTGRAY);//设置颜⾊亮灰⾊setfillcolor(LIGHTGRAY);//设置填充颜⾊为亮灰⾊fillcircle(center_x,center_y,second_long*6/5);//填充表盘背景for(i=0;i<=59;i++){//画表盘上的刻度setcolor(BLACK);if(i%5==0){//每个⼩时点线长更长line((center_x+second_long*15/14*sin(((2*PI)/60)*i)),(center_y-second_long*15/14*cos(((2*PI)/60)*i)),(center_x+second_long*6/5*sin(((2*PI)/60)*i)),(center_y-second_long*6/5*cos(((2*PI)/60)*i)));}else line((center_x+second_long*8/7*sin(((2*PI)/60)*i)),(center_y-second_long*8/7*cos(((2*PI)/60)*i)),(center_x+second_long*6/5*sin(((2*PI)/60)*i)),(center_y-second_long*6/5*cos(((2*PI)/60)*i)));}setbkcolor(LIGHTGRAY);//设置背景颜⾊亮灰⾊settextcolor(WHITE);//设置颜⾊⽩⾊outtextxy(center_x-second_long/4,center_y+second_long/2,"你最珍贵");//输出⽂字setbkcolor(BLACK);//背景颜⾊设置回⿊⾊不要忘记setlinecolor(YELLOW);//设置线条颜⾊黄⾊setlinestyle(PS_SOLID,3);//设置线条风格为实线,线宽为3line(center_x,center_y,second_x,second_y);//画秒针setlinecolor(BLUE);//设置颜⾊setlinestyle(PS_SOLID,4);//设置线条风格实线,线宽为4line(center_x,center_y,minute_x,minute_y);//画分针setlinecolor(RED);//设置颜⾊setlinestyle(PS_SOLID,6);//设置线条风格实线,线宽3line(center_x,center_y,hour_x,hour_y);//画时针FlushBatchDraw();//更新⼀次画⾯,解决画⾯闪的问题,需要配合BeginBatchDraw函数使⽤ Sleep(1000);//延时cleardevice();//清除之前的画迹}void update_outinput(){ //【与输⼊⽆关的更新】GetLocalTime(&ti);//获取本地时间second_num= ti.wSecond;//秒针信息second_x=center_x+second_long*sin(((2*PI)/60)*second_num);//计算秒针端点位置second_y=center_y-second_long*cos(((2*PI)/60)*second_num);minute_num= ti.wMinute*5+second_num/12;//分针信息minute_x=center_x+minute_long*sin(((2*PI)/(60*5))*minute_num);//计算分针端点位置minute_y=center_y-minute_long*cos(((2*PI)/(60*5))*minute_num);hour_num= ti.wHour%12*5+minute_num/5/12;//时针信息,按照60刻度算hour_x=center_x+hour_long*sin(((2*PI)/(12*5))*hour_num);//计算时针端点位置hour_y=center_y-hour_long*cos(((2*PI)/(12*5))*hour_num);}void update_input(){//【与输⼊有关的更新】char input;if(kbhit()){input = getch();}}void show_end(){//【显⽰失败界⾯】EndBatchDraw();}int main(){startup(); //数据初始化show_begin();//初始页⾯while(!IsEnd){ //游戏循环执⾏show(); // 显⽰画⾯update_outinput(); //与输⼊⽆关的更新update_input(); //与输⼊有关的更新}show_end(); //显⽰失败界⾯return 0;}3.运⾏结果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
分享一个有趣的库,让你学习C语言不会觉得那么枯燥
前几天看了果果小师弟做了一个华为太空船表盘界面,其中用到了一个EasyX图形库。
我以前读大二的时候也有用过这个图形库,当时是跟着一位老师的教程用这个图形库来写了一个游戏——夜夜爱消除:
代码可在文末获取。
对于一些C语言初学者,可能觉得C语言很枯燥,把这个库用起来,让你学习C语言不那么枯燥。
下面我们来简单介绍一下:
EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持VC6.0 ~ VC2019及Visual Studio,简单易用,学习成本极低,应用领域广泛。
目前已有许多大学将 EasyX 应用在教学当中。
链接:
https:///
我们可以使用EasyX 来写一些小游戏,其在图形学、图像学、分形学、粒子系统、物理模拟等各种场景都有应用。
EasyX的安装很简单,装完VC或VS之后,在官网下载EasyX安装即可:
EasyX库的应用接口使用也很简单,注释写得很清楚,如:
并且配有详细的用户文档:
除此之外,官网上还有很多丰富有趣的例子:。
EasyX折叠编辑本段安装系统支持编译环境版本:Visual C++ 6.0、Visual Studio 2003/2008/2010/2012/2013/2015/2017/2019。
安装执行 Setup.hta,并跟随提示安装即可。
如果您想手动安装,将 include 和 lib 文件夹下的文件分别拷贝到VC 对应的 include 和 lib 文件夹内即可。
或者将 include 和 lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径也可以。
总之,就是要让 VC 能找到这几个文件。
卸载由于安装程序并不改写注册表,因此您在"添加删除程序"中不会看到EasyX 的卸载项。
如需卸载,请执行Setup.hta,并跟随提示卸载。
新版本的安装程序并不能确保完全卸载旧版本,因此请保留相应版本的安装程序。
文件列表说明下载的压缩包里文件列表及对应说明如下:include<文件夹>graphics.h 程序需要引用的头文件lib<文件夹>graphics.lib VC6 MBCS 版本库文件graphicsu.lib VC6 Unicode 版本库文件graphicsw.lib VC2008 / VC2010 MBCS 版本库文件graphicswu.lib VC2008 / VC2010 Unicode 版本库文件EasyX_Help.chm 帮助文件Setup.hta 安装程序项目依赖该绘图库采用静态链接方式,不会为您的程序增加任何额外的DLL 依赖项。
折叠编辑本段范例使用上,基本和 Turbo C没太大区别。
启动Visual C++,创建一个控制台项目(Win32 Console Application),然后引用graphics.h 头文件就可以了。
看一个画圆的例子:#include <graphics.h> // 就是需要引用这个图形库#include <conio.h>void main(){initgraph(640, 480); // 这里和 TC 略有区别circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100getch(); // 按任意键继续closegraph(); // 关闭图形界面}不过还是有不少区别的,比如颜色上,TC 只有16 色,而这个库支持了真彩色。
Dev-C++下配置EasyXVC2010vc6vc6 与 easyX1,下载绿⾊版vc6. 仅43m。
解压后,点击执⾏ShortCut.exe,会⽣成桌⾯快捷 vc6. 运⾏即可。
vc6在win10下运⾏,⽆法单步调试。
需要把来源注解选项关掉:2,下载该版本⽀持 VC6~VC2019。
这个下载下来的包是个exe⽂件。
⽤7zip打包的。
可以直接⽤7zip解压或者后缀改成7z后解压。
因为我们要⼿动配置环境。
3,设置vc6环境:3.1 新加⼯程:添加cpp⽂件3.2 头⽂件⽬录设置,从⼯程 -> 设置3.3 添加库⽂件最后,点击run 运⾏,编制执⾏代码。
⽤⿏标选中区域可以放⼤,enjoy it.源码:1// 程序名称:分形学 - 可以⽆穷放⼤的 Mandelbrot Set (曼德布洛特集)2// 编译环境:Visual C++ 6.0 ~ 2019,EasyX_202107303// 最后更新:2010-9-94//5 #include <graphics.h>6 #include <conio.h>78// 定义常量9#define ITERATIONS 1000 // 迭代次数,越⾼,图像越精细10#define MAXCOLOR 64 // 颜⾊数111213/////////////////////////////////////////////////14// 定义复数及乘、加运算17// 定义复数18struct COMPLEX19 {20double re;21double im;22 };2324// 定义复数“乘”运算25 COMPLEX operator * (COMPLEX a, COMPLEX b)26 {27 COMPLEX c;28 c.re = a.re * b.re - a.im * b.im;29 c.im = a.im * b.re + a.re * b.im;30return c;31 }3233// 定义复数“加”运算34 COMPLEX operator + (COMPLEX a, COMPLEX b)35 {36 COMPLEX c;37 c.re = a.re + b.re;38 c.im = a.im + b.im;39return c;40 }414243/////////////////////////////////////////////////44// 定义颜⾊及初始化颜⾊45/////////////////////////////////////////////////4647// 定义颜⾊48int Color[MAXCOLOR];4950// 初始化颜⾊51void InitColor()52 {53// 使⽤ HSL 颜⾊模式产⽣⾓度 h1 到 h2 的渐变⾊54int h1 = 240, h2 = 30;55for (int i = 0; i < MAXCOLOR / 2; i++)56 {57 Color[i] = HSLtoRGB((float)h1, 1.0f, i * 2.0f / MAXCOLOR);58 Color[MAXCOLOR - 1 - i] = HSLtoRGB((float)h2, 1.0f, i * 2.0f / MAXCOLOR);59 }60 }616263/////////////////////////////////////////////////64// 绘制 Mandelbrot Set (曼德布洛特集)65/////////////////////////////////////////////////66void Draw(double fromx, double fromy, double tox, double toy)67 {68 COMPLEX z, c;69int x, y, k; // 定义循环变量70for (x = 0; x < 640; x++)71 {72 c.re = fromx + (tox - fromx) * (x / 640.0);73for (y = 0; y < 480; y++)74 {75 c.im = fromy + (toy - fromy) * (y / 480.0);76 z.re = z.im = 0;77for (k = 0; k < ITERATIONS; k++)78 {79if (z.re * z.re + z.im * z.im > 4.0) break;80 z = z * z + c;81 }82 putpixel(x, y, (k >= ITERATIONS) ? 0 : Color[k % MAXCOLOR]);83 }84 }85 }868788/////////////////////////////////////////////////89// 主函数90/////////////////////////////////////////////////91int main()92 {93// 初始化绘图窗⼝及颜⾊94 initgraph(640, 480);95 InitColor();9697101 fromy = -1.2; toy = 1.2;102 Draw(fromx, fromy, tox, toy);103104105// 捕获⿏标操作,实现放⼤⿏标选中区域106 ExMessage m;107bool isLDown = false;108int selfx, selfy, seltx, selty; // 定义选区109110do111 {112 getmessage(&m, EM_MOUSE | EM_KEY); // 获取⼀条⿏标消息113114switch (m.message)115 {116case WM_KEYDOWN:117break;118119// 按⿏标中键恢复原图形坐标系120case WM_MBUTTONUP:121 fromx = -2.1; tox = 1.1;122 fromy = -1.2; toy = 1.2;123 Draw(fromx, fromy, tox, toy);124break;125126// 按⿏标左键并拖动,选择区域127case WM_MOUSEMOVE:128if (isLDown)129 {130 rectangle(selfx, selfy, seltx, selty);131 seltx = m.x;132 selty = m.y;133 rectangle(selfx, selfy, seltx, selty);134 }135break;136137// 按⿏标左键并拖动,选择区域138case WM_LBUTTONDOWN:139 setlinecolor(WHITE);140 setrop2(R2_XORPEN);141 isLDown = true;142 selfx = seltx = m.x;143 selfy = selty = m.y;144 rectangle(selfx, selfy, seltx, selty);145146break;147148// 按⿏标左键并拖动,选择区域149case WM_LBUTTONUP:150 rectangle(selfx, selfy, seltx, selty);151 setrop2(R2_COPYPEN);152 isLDown = false;153 seltx = m.x;154 selty = m.y;155156if (selfx == seltx || selfy == selty) break;157158// 修正选区为 4:3159int tmp;160if (selfx > seltx) { tmp = selfx; selfx = seltx; seltx = tmp; }161if (selfy > selty) { tmp = selfy; selfy = selty; selty = tmp; }162163if ((seltx - selfx) * 0.75 < (selty - selfy))164 {165 selty += (3 - (selty - selfy) % 3);166 selfx -= (selty - selfy) / 3 * 4 / 2 - (seltx - selfx) / 2;167 seltx = selfx + (selty - selfy) / 3 * 4;168 }169else170 {171 seltx += (4 - (seltx - selfx) % 4);172 selfy -= (seltx - selfx) * 3 / 4 / 2 - (selty - selfy) / 2;173 selty = selfy + (seltx - selfx) * 3 / 4;174 }175176// 更新坐标系177double f, t;178 f = fromx + (tox - fromx) * selfx / 640;179 t = fromx + (tox - fromx) * seltx / 640;180 fromx = f;181 tox = t;185 toy = t;186187// 画图形188 Draw(fromx, fromy, tox, toy);189190break;191 }192 } while (m.message != WM_KEYDOWN);193194 closegraph();195return0;196 }View Code汉诺塔移动⽰例:///////////////////////////////////////////////////// 程序名称:汉诺塔移动动画// 编译环境:Visual C++ 6.0,EasyX_20130506(beta)// 作 者:Ronald Email:ryl910527@// 最后修改:2011-5-26//#include <graphics.h>#include <conio.h>#include <stdio.h>#define MAX 64 // 圆盘的最⼤数⽬#define NULL 0// 定义栈struct STKNODE{int a[4];};struct STK{STKNODE* stack[MAX];int top;};// 定义全局变量STK s[3]; // 声明三个栈,分别代表⼀号⼆号三号钢针上圆盘的状态int v = 5; // 调整速度// 函数声明void Initstk(STK* s); // 初始化栈void Hannoi(int n, char a, char b, char c); // 汉诺塔递归void start(); // 开始画⾯void Move(int n, char a, char b); // 移动过程int switchab(char a); // 返回钢针号void adjust(); // 调整速度暂停// 主函数void main(){int n, ta[4] = {115, 500, 285, 518}; // 第⼀个圆盘的位置printf("尽量⼩于16\n"); // 因为⼤于⼗六时就会显⽰有误,但程序可以正常运⾏printf("请输⼊汉诺塔的层数(1~64):");scanf("%d", &n);STKNODE** p;p = (STKNODE**)malloc(n * sizeof(STKNODE **)); // 声明⼀个元素为 n 个的动态 STKNODE 型指针数组for (int i2 = 0; i2 < n; i2 ++){p[i2] = (STKNODE *)malloc(sizeof(STKNODE)); // 为每⼀个指针申请空间}Initstk(&s[0]);Initstk(&s[1]);Initstk(&s[2]); // 将三个栈初始化start(); // 呈现开始画⾯setfillcolor(GREEN); // 圆盘的颜⾊for (int i=0; i < n; i++){ta[0] += 5;ta[1] -= 20;solidrectangle(ta[0], ta[1], ta[2], ta[3]); // 画出n个从⼤到⼩⼀次叠放的黄⾊圆盘++s[0].top; // 进栈for (int i1 = 0; i1 < 4; i1++){p[i]->a[i1] = ta[i1];s[0].stack[s[0].top] = p[i]; // 记录每个矩形的位置,top为圆盘的个数}}Hannoi(n, 'a', 'b', 'c'); // 汉诺塔递归函数system("pause");printf("\t\t\t\tGame Over!\n");}///////////////////////////////////////////////////// 函数定义// 汉诺塔的递归void Hannoi(int n, char a, char b, char c){if(n == 1)Move(1, a, c);else{Hannoi(n-1, a, c, b);Move(n, a, c);Hannoi(n-1, b, a, c);}}// 栈的初始化void Initstk(STK *s){int i;s->top = 0;for (i = 0; i <= MAX; i++)s->stack[++s->top] = NULL;s->top = 0;}// 移动过程void Move(int n, char a, char b){int i3, i4 = 0, i5 = 0;i3 = b - a; // ⽬的钢针与源钢针的位置差值i4 = switchab(a); // 源钢针钢针号i5 = switchab(b); // ⽬的钢针号STKNODE *q1, *q0; // 两个中间结点⽤于源栈和⽬的栈间的值得传递,q1为⽬的栈,q0为源栈 q1 = (STKNODE *)malloc(sizeof(STKNODE));q0 = (STKNODE *)malloc(sizeof(STKNODE));// 源栈与⽬的栈值的传递q0 = s[i4].stack[s[i4].top];++s[i5].top; // 进栈q1->a[0] = q0->a[0] + i3 * 200;q1->a[1] = 500 - s[i5].top * 20;q1->a[2] = q0->a[2] + i3 * 200;q1->a[3] = 500 - s[i5].top * 20 + 18;s[i5].stack[s[i5].top] = q1;--s[i4].top; // 出栈// 向上运动while (q0->a[1] >= 100){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);adjust(); // 调整函数Sleep(10 * v); // 暂停(ms)setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setlinecolor(RED);line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); // 重新画上被擦掉原有的红线q0->a[1] -= 10;q0->a[3] -= 10;}// 向左或右运动,与 i3 的正负有关while (q0->a[2] != q1->a[2]){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);if (i3 < 0) // i3<0向左移{q0->a[0] -= 20;q0->a[2] -= 20;}else// i3>0向右移{q0->a[0] += 20;q0->a[2] += 20;}}// 向下运动while (q0->a[3] <= q1->a[3]){setfillcolor(GREEN);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);adjust();Sleep(10 * v);setfillcolor(WHITE);solidrectangle(q0->a[0], q0->a[1], q0->a[2], q0->a[3]);setlinecolor(RED);if (q0->a[1] > 100) // 重画被擦掉的红线{line((q0->a[0] + q0->a[2]) / 2, q0->a[1], (q0->a[0] + q0->a[2]) / 2, q0->a[3]); }q0->a[1] += 10;q0->a[3] += 10;}// 在⽬的钢针上的相应位置绘制出黄⾊矩形块setfillcolor(GREEN);solidrectangle(q1->a[0], q1->a[1], q1->a[2], q1->a[3]);}// 绘制开始界⾯void start(){// 初始化画⾯⼤⼩initgraph(800, 650);// 背景设为⽩⾊setbkcolor(WHITE);// ⽤⽩⾊填充整个画⾯cleardevice();// 绘制彩虹,形成⼀道彩虹,摘⾃ easyx 帮助⽂档⽰例程序float H, S, L;H = 0; // ⾊相S = 1; // 饱和度L = 0.5f; // 亮度setlinestyle(PS_SOLID,2, NULL, 0); // 设置线宽为 2for(int r = 600; r > 544; r--){H += 5;setlinecolor( HSLtoRGB(H, S, L) );circle(750, 900, r);}// 说明settextstyle(50, 0, "华⽂楷体");settextcolor(RED);outtextxy(200, 150, "汉诺塔移动动画");settextstyle(20, 0, "⿊体");outtextxy(600, 200, "BY:Ronald");outtextxy(500, 200, "版本V1.1");settextstyle(50, 0, "⿊体");settextcolor(GREEN);outtextxy(200, 350, "随便按⼀个键开始吧!");// 检测键盘敲击getch();// 清空开始界⾯cleardevice();// 绘制运动画⾯的的环境line(400, 110, 400, 500);line(600, 110, 600, 500);line(200, 110, 200, 500);// 长⽅体形的底座setfillcolor(LIGHTGRAY);fillrectangle(80, 501, 720, 510);// 暂停按钮solidrectangle(360, 540, 440, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "暂停");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(300, 580, "⿏标暂停后请按空格继续");// 加速按钮solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(170, 550, "加速");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(170, 580, "请按 d");// 减速按钮solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(570, 550, "减速");settextstyle(20, 0, "宋体");settextcolor(RED);outtextxy(570, 580, "请按 a");// 说明settextstyle(50, 0, "宋体");settextcolor(GREEN);outtextxy(10, 10, "正在进⾏中请欣赏:");}// 判断⽬的钢针与源钢针的钢针号返回钢针号int switchab(char a){switch (a){case'a':return0;case'b':return1;case'c':return2;default:return0;}}// 调整函数,实现加速,减速,暂停void adjust(){char f; // 接收键盘敲进去的按钮和⿏标点击时赋予的变化值// ⽤ f 接受键盘的键⼊值if(kbhit())f = getch();// 检测⿏标消息if (MouseHit()==true){// 接收⿏标消息MOUSEMSG Mouse;Mouse = GetMouseMsg();// 响应⿏标消息if (Mouse.x >= 360 && Mouse.x <= 440 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) {f = '';}if (Mouse.x >= 160 && Mouse.x <= 240 && Mouse.y >= 540 && Mouse.y <= 580 && Mouse.mkLButton) {{f = 'a';}}// 作⽤于动画switch(f){// 暂停case'':// ⽤‘继续’覆盖‘暂停’settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "继续");getch();// 继续后变回显⽰‘暂停’settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(370, 550, "暂停");break;// 减速case'a':// 当被点击时,‘减速’位置震动⼀下setfillcolor(LIGHTGRAY);solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(575, 545, "减速");Sleep(30);// 减速v++;// 回原位setfillcolor(LIGHTGRAY);solidrectangle(560, 540, 640, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(570, 550, "减速");break;// 加速case'd':setfillcolor(LIGHTGRAY);solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(165, 545, "加速");Sleep(30);setfillcolor(LIGHTGRAY);solidrectangle(160, 540, 240, 580);settextstyle(30, 0, "⿊体");settextcolor(GREEN);outtextxy(170, 550, "加速");// 加速v--;// v 最⼩为1if (v <= 0){v = 1;}break;default:break;}f = 'r'; // f 初始化为 rFlushMouseMsgBuffer(); // 清空⿏标消息}View Code。
easyx图形库
easyx图形库的⾷⽤⽅式(c++)
由于学c艹真的没python有图形辣么好玩,于是我⽆意间了解了easyx图形库(可以做挺多好玩的东西)虽然说感觉⽤起来还是有点繁琐(可能是本菜狗刚了解,太菜了QAQ)
基于本菜狗经常忘记东西,就打算学⼀点就稍微记⼀些,本博客会不定期更新(也可能我忘了的说)
本博客主要为了⾃⼰复习⽤(毕竟作为⼀个博客园⼩透明,写的博客也没⼈看啊QAQ),顺便请求⼤佬发现本菜狗的bug后进⾏指点
若要转载,请注明来处
1.基础
1.下载
链接
2.安装
其中第⼀个easyx⽂档是说明啥的,很不错的哦!
因为我是⽤vs2019的所以我后⾯⼤部分都是⽤vs2019进⾏操作
其中有很多可以直接了解的说
3.有时候输⼊中⽂报错
例如
这时候有好⼏种解决⽅法
第⼀种:在冒号前加上字母L
第⼆种:在中⽂冒号前加_T(,且在后⾯补⼀个)
第三种:⼀次性解决:打开带cpp⽂件的属性(可以在资源管理器右边源⽂件下⾯右键找到或者vs上⽅项⽬⾥找到),然后配置属性->⾼级->字符集->⾼级属性->字符集->使⽤多字节字符集
就像酱紫
然后确定就⾏啦
然后你就会发现,除了加L以外的报错都消失了的说。
C++经典绘图⼯具EasyXEasyX简介EasyX在学习C语⾔时,很多同学抱怨说C只能写最简单的Demo程序,通过printf在屏幕上打印字符来验证代码。
这样的编程很枯燥,⼀点没觉得⾃⼰在设计软件。
EasyX是针对C++的第三⽅图形库,通过它我们能够在屏幕上绘制出⾃⼰喜欢的各种颜⾊的图形。
有了它,⾃⼰编写好玩的⼩游戏不是梦哦。
使⽤EasyX有下⾯⼏点要求:只能在Windows下使⽤建议使⽤Visual Studio作为IDE必须写C++代码(⽂件后缀名为cpp)EasyX安装下载路径安装解压下载⽬录EasyX_20151015(beta).zip如下:双击setup.hta⽂件找到需要的VS版本点击安装即可。
PS:在解压缩的⽂件中,有个EasyX_help.chm⽂件,它是EasyX的⽂档,所有API的介绍都在⾥⾯。
作为⼀个软件开发⼈员,阅读⽂档是最基本的技能,希望⼤家从现在开始培养⾃⼰这⽅⾯的能⼒。
如果你通读了这个⽂档之后,相信你完全能够⾃⼰完成在屏幕上画出⾃⼰想要的图案。
EasyX基本API在EasyX的⽂档中,有⼀节是“超简单的使⽤预览”,⾥⾯有这样⼀段代码。
#include <iostream>#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480); // 创建图形界⾯circle(200, 200, 100); // 画圆,圆⼼(200, 200),半径 100getch(); // 按任意键继续closegraph(); // 关闭图形界⾯}这段代码的执⾏结果如下:这个Demo程序实现了在屏幕上画⼀个圆形的功能。
1. 画布的创建和销毁main函数中,第⼀⾏和最后⼀⾏代码是创建和删除图形界⾯,这个图形界⾯常常被叫做“画布”。
initgraph()创建画布时,需要输⼊⽬标窗⼝的长宽值。
C语⾔Easyx实现贪吃蛇详解⽬录⼀、头⽂件包含⼆、创建蛇与⾷物的结构体三、游戏的初始化四、游戏的绘画事件五、蛇的移动事件六、输⼊⽅向******这个⽅⾯没什么好解释的⼤家看代码应该可以看懂。
七、⽣成⾷物⼋、吃⾷物九、游戏失败的判定⼗、main函数总结:⼀、头⽂件包含#include<stdio.h>#include<graphics.h> //图形处理需要包含的库⽂件#include<mmsystem.h> //windows多媒体接⼝#include<conio.h> //读取键盘输⼊#include<time.h> //随机数种⼦#include<stdlib.h> //内存分配包含完头⽂件后进⾏⼀些预处理操作:#pragma comment(lib,"winmm.lib")//多媒体接⼝#define NUM 200;#define SIZE 10enum Ch{ up=72,down=80,left=75,right=77} ;⼆、创建蛇与⾷物的结构体直接上代码:struct pos 蛇⾝坐标{int x;int y;};struct snake{int n; 初始化蛇⾝长度Ch ch; 蛇前进的⽅向pos szb[3265]; 蛇的坐标数组};struct food{int x;int y;bool iseat; 判断⾷物是否被吃};创建⼀个蛇与⾷物snake s;food f;三、游戏的初始化void gameinit(){srand((unsigned int)time(NULL));//随机数种⼦,⽤于随机⽣成⾷物s.n = 2; //蛇的初始长度,可以⾃⼰设定s.ch = right;//蛇的初始⽅向;s.szb[0].x=100;s.szb[0].y=100;s.szb[1].y = 100;//蛇的初始位置坐标f.iseat = true;}四、游戏的绘画事件cleardevice(); //每次绘画都要进⾏⼀次清屏setfillcolor(RED); //蛇头颜⾊fillrectangle(s.szb[0].x, s.szb[0].y,s.szb[0].x + SIZE, s.szb[0].y + SIZE);//SIZE在预处理是已经定义表⽰每个蛇⾝的⼤⼩for (int i = 0; i < s.n; i++) {rectangle(s.szb[i].x, s.szb[i].y,s.szb[i].x + SIZE, s.szb[i].y + SIZE);} //⽣成矩形蛇setfillcolor(GREEN);//⾷物颜⾊fillroundrect(f.x, f.y, f.x + SIZE, f.y + SIZE,5,5);//⽣成圆形⾷物五、蛇的移动事件void snakemove(){for (int i = s.n - 1; i > 0; i--){s.szb[i].x = s.szb[i - 1].x;s.szb[i].y = s.szb[i - 1].y; //通过数组的变换来实现蛇的移动}switch (s.ch)//ch枚举类型在预处理时已经定义{case up:s.szb[0].y -= SIZE;//由于在窗⼝坐标系中y⽅向是向下的所以向上移动需要减去⼀个sizebreak;case down:s.szb[0].y += SIZE;break;case left:s.szb[0].x -= SIZE;break;case right:s.szb[0].x += SIZE;break;}}六、输⼊⽅向******这个⽅⾯没什么好解释的⼤家看代码应该可以看懂。
EasyX在C语言课程教学中的应用摘要本文笔者通过多年的C语言课程的教学经验,提出了在C语言教学过程中引入EasyX图形库的必要性,介绍了通过绘制图形和制作动画的案例进行教学的方法,激发学生利用C语言进行编程的兴趣,提高学生的自主性和创新性。
关键词EasyX C语言动画设计1 引入EasyX的必要性C语言程序设计课是理论与实践相结合的课程,实践性很强,是高等院校的公共基础课程之一。
近几年来,一般高校采用Visual C++ 6.0作为编辑环境进行C语言课程的讲解。
尽管Visual C++ 6.0已经远远比从前的tubor C 2.0无论从界面上还是实际操作上简便了很多,但C语言课程的一些经典实例兴趣性不强,不容易激发学生的创新能力。
如果能够将枯燥的C语言学习和图形界面以及电脑游戏结合到一起,从老师多次强调讲解程序的编写方法转变为让学生自己参与算法的设计和程序的编写,调动起学生的学习兴趣,提高学生的实践能力。
EasyX让图形案例引入进C语言的课堂成为可能性。
2 EasyX图形库标准的C中包含“graphics.h”这个头文件,具备强大的图形功能,利用C语言可以进行各种图形的绘制。
但是在Visual C++ 6.0并不包含这个头文件。
EasyX 是针对C++ 的图形库,可以帮助C语言初学者快速上手图形和游戏编程。
在Visual C++ 6.0的基础上安装EasyX只需下载压缩包,执行Setup.hta,并跟随提示安装即可。
如果想手动安装,需要include 和lib 文件夹下的文件分别拷贝到Visual C++ 6.0对应的include 和lib 文件夹内即可。
这样就将EasyX图形库引入到了Visual C++ 6.0中。
可以利用EasyX图形库画出各种几何图形和移动的图形,也可以编写类似我们所熟悉的俄罗斯方块等小游戏,可以练习图形学的各种算法,等等。
3 EasyX的应用3.1 绘制图形案例的应用以往循环结构的典型案例包括像累计求和求乘积、最大公约数与最小公倍数、斐波那契数列等等数学问题,对于非专业的学生来说这些内容理解起来并不容易,也不容易产生兴趣,因而编程就变成了死记硬背程序。
EasyX图形库,绘制透明和旋转图⽚的⽅法(效率很⾼)#ifndef EX_EASYX_H#define EX_EASYX_H#include <graphics.h>#define _USE_MATH_DEFINES#include <math.h>#ifndef M_RD#define M_RD 0.01745329251994329576923690768489#endif//2x3矩阵class gdimat2 : public XFORM{public:gdimat2(){this->identity();}void identity(){eM11 = 1.0f; eM12 = 0.0f;eM21 = 0.0f; eM22 = 1.0f;eDx = 0.0f; eDy = 0.0f;}void translate(float x, float y){XFORM mat;mat.eM11 = 1.0f; mat.eM12 = 0.0f;mat.eM21 = 0.0f; mat.eM22 = 1.0f;mat.eDx = x;mat.eDy = y;CombineTransform(this, this, &mat);}void scale(float x, float y){XFORM mat;mat.eM11 = x; mat.eM12 = 0.0f;mat.eM21 = 0.0f; mat.eM22 = y;mat.eDx = 0.0f;mat.eDy = 0.0f;CombineTransform(this, this, &mat);}void rotate(float angle){using namespace std;XFORM mat;angle *= M_RD;float cosin = cos(angle);float sine = sin(angle);mat.eM11 = cosin; mat.eM12 = sine;mat.eM21 = -sine; mat.eM22 = cosin;mat.eDx = 0.0f;mat.eDy = 0.0f;CombineTransform(this, this, &mat);}//应⽤到⽬标HDCvoid use(HDC dc){SetWorldTransform(dc, this);}};//easyx扩展,绘制透明png图⽚#pragma comment (lib, "MSIMG32.lib")void draw_image(IMAGE& image, int x, int y, int w = -1, int h = -1){BLENDFUNCTION blendfunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };int width = image.getwidth();int height = image.getheight();if (w == -1)w = width;if (h == -1)h = height;AlphaBlend(GetImageHDC(), x, y, w, h, GetImageHDC(&image), 0, 0, width, height, blendfunc);}//绘制旋转的图⽚,⽀持透明png图⽚void rotate(IMAGE& image, int x, int y, int w, int h, float angle){//获取当前绘图dcHDC dc = GetImageHDC();//矩阵gdimat2 m;m.rotate(angle); //旋转m.translate(x, y); //平移e(dc);BLENDFUNCTION blendfunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; int width = image.getwidth();int height = image.getheight();//绘制位置设置图⽚的中⼼点x = -w / 2;y = -h / 2;AlphaBlend(dc, x, y, w, h, GetImageHDC(&image), 0, 0, width, height, blendfunc); //初始化矩阵m.identity();//恢复dc初始变换e(dc);}#endif EX_EASYX_H。
C++easyx窗⼝程序⼊门教程C++ easyx 窗⼝制作基础教程⽬录使⽤前的准备去easyx的官⽹下载easyx。
⾄于官⽹⽹址就不多说了,⽹上都有。
然后在vs2008中安装。
只需要把下载下来的“安装向导”打开,然后选择对应版本即可。
如果弹出“安装成功”的对话框就说明成功了。
然后打开相应的VS版本,在创建项⽬的时候选择“WIN32控制台应⽤程序”即可。
简单窗⼝在“解决⽅案资源管理器”中打开stdafx.h,然后include上需要的头⽂件。
⼀般easyx程序需要的头⽂件是#include<graphics.h>。
然后,在主程序中输⼊如下的语句:#include "stdafx.h"int main(){initgraph(640,480);for(;;){}closegraph();}运⾏效果:我们制作出了⼀个⿊⾊的窗⼝。
要点:initgraph(a,b)⽤于设定⼀个长为a,宽为b的窗⼝,并显⽰出来。
closegraph()⽤于关闭窗⼝设置窗⼝颜⾊我们使⽤setbkcolor和cleardevice函数。
上代码:#include "stdafx.h"int main(){initgraph(640,480);setbkcolor(WHITE);cleardevice();for(;;){}closegraph();}运⾏效果:要点:setbkcolor(color)⽤于设定背景⾊为color。
实际上easyx⾃带了很多常量,例如BLACK WHITE BLUE GREEN等。
在设定后,必须使⽤cleardevice函数刷新,以显⽰新的背景颜⾊。
cleardevide()⽤于刷新屏幕,把所有内容使⽤背景⾊刷新。
显⽰⽂字可以使⽤outtextxy函数。
注:outtextxy函数的第三的参数是TCHAR类型的,需要在前⾯加上_T()函数以修改为TCHAR类型。
1:创建新项目自己动手建立项目试试,并输入以下代码:#include <stdio.h>void main(){ printf("Hello World!");}然后,输入以下代码试试(无需理解代码含义):#include <graphics.h>#include <conio.h>void main(){initgraph(640, 480);line(200, 240, 440, 240);line(320, 120, 320, 360);getch();closegraph();}执行后应该可以看到屏幕正中央有一个十字2:简单绘图,学习单步执行#include <graphics.h> // 绘图库头文件,绘图语句需要#include <conio.h> // 控制台输入输出头文件,getch()语句需要void main(){initgraph(640, 480); // 初始化640x480的绘图屏幕line(200, 240, 440, 240); // 画线(200,240) - (440,240)line(320, 120, 320, 360); // 画线(320,120) - (320,360)getch(); // 按任意键closegraph(); // 关闭绘图屏幕}解释一下:1. 创建的绘图屏幕640x480,表示横向有640个点,纵向有480个点。
注意:左上角是原点(0,0),也就是说,y轴和数学的y轴是相反的。
2. getch实现按任意键功能,按任意键后,程序继续执行。
否则,程序会立刻执行closegraph 以至于看不到绘制的内容。
[作业]用线条画出更多的图形,要求不少于10条直线。
[学习单步执行]完成作业后(务必完成),开始试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):1. 将VC取消最大化,并缩小窗口,能看到代码就行。