最近需要动手制作小项目(本人还是c语言小菜狗),所以加急学习了Easyx,这是我的一些笔记与心得。
这是本人第一次写长文,还请大家多多支持呀!!!
- 封面第三图是网图(侵删)
学习视频:
【C/C++/EasyX】学编程,做游戏,小白快速入门图形编程,零基础入门到精通,学习就是这么快乐_哔哩哔哩_bilibili
老师很有趣,不仅学到了图形库,学到了地道的Chinglish 。(强推!!)
Easyx入门
目录
1.基本说明
- Easyx是针对 C++ 的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。(注意创建文件时用C++文件,only for c++)
- Easyx适合新手,比其他难度要低一点。
- 比黑框框好看啊!!!
2 .Easyx原理
基于Windows的图形编辑,对其进行封装成的函数库。
3.安装
官网下载:EasyX Graphics Library for C++
安装合适版本的vc++和Easyx文档
4.Easyx颜色
用RGB宏合成颜色,实际上合成出来的颜色是一个十六进制的的整数。
RGB(红色,绿色,蓝色);
每个颜色的值都是从0~255
- 可以使用电脑的mspaint找颜色的RGB值
- 有几种简单的颜色英文快捷方式,如WHITE,YELLOW,GREEN等等(注意用大写)
5.Easyx坐标和设备
- 坐标默认错原点在窗口的左上角,X轴向右为正,Y 轴向下为正,度量单位是像素点。
- 设备:简单来说,就是绘图表面。
- 在EasyX中,设备分两种,一种是默认的绘图窗口另一种是IMAGE对象。通过SetWorkinglmage()函数可以设置当前用于绘图的设备。设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。
6.窗口函数
initgraph(int width,int heigh,int flag=NULL);用于初始化绘图窗口(创建窗口)
width 指定窗口的宽度
height 指定窗口的高度
flag 窗口的样式,默认为NULL
flag的几种形式:
若要同时实现:initgraph(x,y,NOCLOSE | NOMINIMIZE);使用 | 隔开
- 注意需要使用getchar();接收窗口。话说吃饭要用筷子呢,接收窗口也要getchar();
closegraph();关闭绘图窗口(无参数函数)
cleardevice();清空绘图设备,实际是覆盖之前的图形,删除等于覆盖。(无参数函数)
例如:setbkcolor(WHITE);
cleardevice();
这样就可以实现清空(覆盖)之前的背景,然后加上背景了。
- 注意要先设置背景颜色再清除背景,因为本质是覆盖,用白色背景覆盖原有背景。
7.图形绘制函数
- 绘图函数从填充样式分类可以分为无填充,有边框填充,无边框三种。
以画圆为例:
circle()无填充
fillcircle()有边框填充
solidcircle()无边框填充
不知道有什么区别?直接上图:从左往右分别是无填充,有边框填充,无边框填充
- 设置填充颜色 setfillcolor(颜色);
- 设置线条样式 setlinestyle(样式,厚度);
- 设置线条颜色 setlinecolor(颜色);
线条样式有:PS_SOLID 实线 PS_DASH 虚线 PS_DOT 点线,还有其他就不一一赘述了。
(tips:右键函数或者右键变量转到定义可以查看更多信息,如上图。)
8.文字绘制函数
- outtextxy(int x,int y,字符串);在指定位置输出字符串
- settextcolor(颜色);设置当前文字颜色
- settextstyle(高度,宽度,字体);设置字体样式
- setbkmode(TRANSPARENT);去掉字体的背景
- textheight(字符串);获取字符串实际占用的像素高度
- textwidth(字符串);获取字符串实际占用的像素宽度
如果高度,宽度为0,则比例自适应。字体可直接写“楷体”
- 这时候输入字符串编译时会报错,该怎么解决呢?
- 字符串前面加上L
- 项目 ->属性 ->高级->字符集->使用多字节字符集
- 如何将文字居中:(实际是数学问题)
- 计算出字符串所占用的像素高度与宽度,textheight () ; textwidth () ;
- 计算居中时的空隙高度和空隙宽度
- 用空隙加上要居中图形的宽度
在这里我们以一个矩形为例子:
#include <stdio.h>
#include <graphics.h>
int main()
{
initgraph(1040, 600,SHOWCONSOLE);//设置图形边框
setbkcolor(RED);//设置背景颜色
cleardevice();//覆盖之前背景颜色
setfillcolor(GREEN);//填充颜色
fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
settextstyle(20, 0, "楷体");//设置字体样式
settextcolor(YELLOW);//设置字体颜色
setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
char arr[] = "俺在居中位置";//定义一个字符串
int height = (100 - textheight(arr)) / 2;//计算空隙高度
int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串
getchar();//接受图形
closegraph();//关闭图形
return 0;
}
9.图像处理函数
Easyx也可以导入图片,在使用图像之前,我们需要定义一个(变量)对象,然后把图像加载进变量后才可以使用。定义图像用:IMAGE,如 IMAGE img ;
- loadimage (指针(&img),文件名,拉伸高度,拉伸长度,调整大小(一般不用管));
- putimage( int x , int y ,指针(&img)) ;
注意事项:
- 图片文件最后保存到与源代码相同目录的地方
- 取文件的时候使用 ./ 文件名(. / 是取当前文件目录,. / 是取上一级目录)
- JPG图像不支持透明背景
10.鼠标消息函数
旧版:使用头文件#include <graphics.h>(建议使用旧版)
- 首先还是需要定义鼠标消息类型:MOUSEMSG
- MouseHit()用于判断是否有鼠标消息
- 用GetMouseMsg()接收消息
- 注意使用循环判断鼠标消息
可以结合上面的代码进行操作试验:(看看黑框框出现什么鸭)
while (1)
{
if (MouseHit())
{
MOUSEMSG msg = GetMouseMsg();
if (msg.mkLButton && msg.x >= 400 && msg.x <= 600 && msg.y >= 200 && msg.y <= 300)
{
printf("我被按下了\n");
}
}
}
新版: 使用头文件#include <easyx.h>(跟graphics有一些不一样的地方,毕竟是新版)
- 定义鼠标消息用:ExMessage
- 用peekmessage(指针,消息类型)用于判断和接收鼠标消息
- 注意用循环判断鼠标消息
11.键盘消息函数 (非Easyx函数)
下图为获取键盘消息的函数,有两种操作方式,建议使用第二个。
- 因为又使用循环,所以我们经常把全部(全部图像)代码放进循环中
- 循环会出现闪屏的情况,所以我们经常会使用另外的函数库避免闪屏现象:
tips:结束批量绘制建议使用 FlushBatchDraw ( ) ;
下面是我的一段参考代码:可实现小球移动 (也有之前的一些练习代码)
#include <stdio.h>
#include <graphics.h>
int main()
{
int x = 50, y = 50;//定义小球初始位置
initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
while (1)
{
BeginBatchDraw();//开始批量绘制
setbkcolor(WHITE);//设置背景颜色
cleardevice();//覆盖之前背景颜色
setlinestyle(PS_SOLID, 2);//设置线条样式
setlinecolor(RED);//设置线条颜色
setfillcolor(GREEN);//填充颜色
circle(100, 100, 50);
fillcircle(200, 100, 50);
solidcircle(300, 100, 50);
fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
settextstyle(20, 0, "楷体");//设置字体样式
settextcolor(YELLOW);//设置字体颜色
setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
char arr[] = "按钮";//定义一个字符串
int height = (100 - textheight(arr)) / 2;//计算空隙高度
int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串
IMAGE img;//定义图像
loadimage(&img,"./11.jpeg",250,250);//加载图片,图片你们自己选,这段代码可以删去
putimage(0, 0, &img);//输出图片
//int x = 50, y = 50;
int v = 1;//定义速度v
setfillcolor(BLUE);//设置小球颜色
fillcircle(x, y, 10);//设置小球大小位置
FlushBatchDraw();//结束批量绘制
if (GetAsyncKeyState(VK_UP))//上移
y -= v;
if (GetAsyncKeyState(VK_DOWN))//下移
y += v;
if (GetAsyncKeyState(VK_LEFT))//左移
x -= v;
if (GetAsyncKeyState(VK_RIGHT))//右移
x += v;
}
getchar();
closegraph();
return 0;
}
12.音乐播放函数
- 注意头文件中 mmsystem.h 和 winmm.lib 需要写在 graphics.h 的下面
- 使用 mciSendString () 来打开和播放音乐,后面三个参数暂时不用管,都写 0
- 还是建议把音乐文件放在与源代码相同目录的地方
- 可对音乐文件取别名 alias +别名
- 在音乐后加上 repeat 重复播放音乐,不能使用while循环!!
- 一般是使用函数播放音乐
- 加载静态库:#pragma comment(lib,"winmm.lib") (放在头文件里面)
13.其他函数
- 首先需要定义操作窗口类型:HWND 来定义窗口句柄,GetHWnd ( ) 获取句柄
- 使用 SetWindowText ( 句柄,字符串(标题) ) 来修改窗口标题
- 使用 MessageBox ( 句柄,消息框,标题,选项 ) 设置模态对话框
最后附上我的练习效果图:
最后附上我的代码:
#include <stdio.h>
#include <graphics.h>//EasyX图形库函数
#include <easyx.h>//都一样的,只不过是新版
#include <mmsystem.h>//播放音乐所需的头文件,需要放在graphics下面
#pragma comment(lib,"winmm.lib")//加载静态库
void bgm()
{
mciSendString("open ./一半.mp3 alias bgm", 0, 0, 0);//打开音乐,薛之谦的一半
mciSendString("play bgm", 0, 0, 0);//播放音乐
}
void change()
{
HWND win = GetHWnd();//获取窗口句柄
SetWindowText(win, "c语言练习-EasyX");//修改窗口标题
MessageBox(win, "你爱我吗?", "快快回答",MB_YESNO);//设置模态对话框
}
int main()
{
int x = 50, y = 50;//定义小球的初始位置
initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
bgm();//播放音乐
change();//弹窗与标题修改
while (1)
{
BeginBatchDraw();//开始批量绘制,防止闪屏
setbkcolor(WHITE);//设置背景颜色
cleardevice();//覆盖之前背景颜色
setlinestyle(PS_SOLID, 2);//设置线条样式,实线
setlinecolor(RED);//设置线条颜色
setfillcolor(GREEN);//填充颜色
circle(100, 100, 50);
fillcircle(200, 100, 50);
solidcircle(300, 100, 50);
fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
settextstyle(20, 0, "楷体");//设置字体样式
settextcolor(YELLOW);//设置字体颜色
setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
char arr[] = "按钮";//定义一个字符串
int height = (100 - textheight(arr)) / 2;//计算空隙高度
int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串
ExMessage msg;//定义鼠标消息
if (peekmessage(&msg,EM_MOUSE))//判断与接收鼠标消息
{
if ( msg.lbutton && msg.x >= 400 && msg.x <= 600 && msg.y >= 200 && msg.y <= 300)//如果鼠标左键点击了矩形框
{
printf("我被按下了\n");
}
}
IMAGE img;//定义图像
loadimage(&img,"./11.jpeg",250,250);//加载图片,这是我自己的图片路径和名称
putimage(700, 100, &img);//输出图片
int v = 1;//定义速度
setfillcolor(BLUE);//设置小球填充颜色为蓝色
fillcircle(x, y, 10);//设置小球的位置(用变量表示)
FlushBatchDraw();//结束批量绘制,防止闪屏
if (GetAsyncKeyState(VK_UP))//上移
y -= v;
if (GetAsyncKeyState(VK_DOWN))//下移
y += v;
if (GetAsyncKeyState(VK_LEFT))//左移
x -= v;
if (GetAsyncKeyState(VK_RIGHT))//右移
x += v;
}
getchar();
closegraph();
return 0;
}
14.总结
EasyX图形库函数很多,一次性记下来还是很难的,建议多动手做一下小项目和平时多实践用一下,这样记忆会牢固不少。最后恭喜大家摆脱了黑框框!!!