前言
EasyX是什么?
EasyX坐标和设备
窗口函数
EasyX颜色
图形绘制函数
文字绘制函数
图像处理函数
鼠标消息函数
键盘消息函数
播放音乐
修改窗口标题
此博客所用到的代码我存在了gitee,可以看下game01: 小游戏仓库
准备一个任意vs系列的编译器(vs c++ 6.0, vs2011, vs2013, vs2017, vs2019等等)
下载EasyX帮助文档
下载EasyX并根据提示完成配置(很简单的,跟着提示走一次成功,vscode配置比较麻烦本文不做说明)
下载地址:https://easyx.cn/
参考视频:【C/C++/EasyX】学编程,做游戏,小白快速入门图形编程,零基础入门到精通,学习就是这么快乐_哔哩哔哩_bilibili
EasyX是针对C++的图形库,可以帮助C/C++初学者快速上手图形的游戏编程。比如:可以基于EasyX图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块,贪吃蛇,黑白棋等小游戏.
许多人学编程都是从C语言入门的,而目前的现状是:
- 学习只交基础语法,一直都在黑窗口上学习,同学们都学习很乏味。
- 即使有的学校教图形编程也是,使用一些难度较高的,比如win32,OpenGL门槛依然很高,初学者会受严重打击的.
- 于是就有了这个EasyX库,等这个学完后,我会后续更新天天酷跑,贪吃蛇,扫雷等小游戏,供大家练习参考,OK,现在开搞
头文件:#include
- initgraph(int width,int height,int flag=NULL);用于初始化绘图窗口(创建窗口)
width 指定窗口的宽度
height 指定窗口的高度
flag 窗口的样式,默认为NULL
- closegraph(); 关闭绘制窗口
- cleardevice();清空绘图设备
代码示例:
#include
//1.包含图形库头文件,就能使用提供给我的函数
#include
using namespace std;
int main()
{
//2.创建一个窗口,q确定窗口大小
initgraph(640,480);
getchar();
//2.1关闭窗口
closegraph();
return 0;
}
运行结果:
RGB方式
setcolor(RGB(0,0,0));
字母方式
setcolor(BLACK);
六个十六进制
setcolor(0x000000);
RGB颜色对应表
一些常见的颜色
图形绘制函数用于在窗口上绘制各种图形
以画圆为例:
circle() 无填充
fillcircle() 有边框填充
solidcircle() 无边框填充
circle画圆 elipse画椭圆 pie画扇形 polygon画多边形
rectangle画矩形 roundrect画圆角矩形 line画线 putpixel 画点
设置填充颜色: setfillcolor;
设置线条颜色: setlinecolor;
设置线条样式: setlinestyle;
代码示例:
#include
//1.包含图形库头文件,就能使用提供给我的函数
#include
using namespace std;
int main()
{
2.创建一个窗口,q确定窗口大小
initgraph(640,480);
//3.画圆
setfillcolor(YELLOW);//设置填充颜色
setlinecolor(BLUE);//设置线条颜色
setlinestyle(PS_SOLID,5);//设置线条样式
circle(50, 50, 50);
fillcircle(50, 100, 50);
solidcircle(50, 250, 50);
getchar();
//2.1关闭窗口
closegraph();
return 0;
}
运行结果:
设置背景颜色
setbkcolor(WHITE);//设置背景颜色
cleardevice();//清屏,清除掉原来的背景
//这两步合起来才能设置背景颜色
代码示例:
2.创建一个窗口,q确定窗口大小
initgraph(640,480);
//设置背景颜色,one two两步才能设置背景颜色
setbkcolor(WHITE);//one
cleardevice();//清屏//two
//3.画圆
setfillcolor(YELLOW);//设置填充颜色
setlinecolor(BLUE);//设置线条颜色
setlinestyle(PS_SOLID,5);//设置线条样式
circle(50, 50, 50);
fillcircle(50, 100, 50);
solidcircle(50, 250, 50);
getchar();
//2.1关闭窗口
closegraph();
运行结果:
- outtextxy(int x,int y,PCTSTR str); 在指定位置输出字符串
- settextcolor(COLORREF color);设置当前文字颜色
- settextstyle(int nHeight,int nWidth,LPCTSTR lpszFace) 设置字体样式
- textheight(LPCTSTR str);获取字符串实际占用的像素高度
- textwidth(LPCTSTR str);获取字符串实际占用的像素宽度
输出字符串,设置文字颜色
settextcolor(RED);//设置文字颜色
outtextxy(50, 50, "我是QK");
代码示例:
#include
//1.包含图形库头文件,就能使用提供给我的函数
#include
using namespace std;
int main()
{
initgraph(640,480);
//设置背景颜色,one two两步才能设置背景颜色
setbkcolor(WHITE);//one
cleardevice();//清屏//two
settextcolor(RED);//设置文字颜色
outtextxy(50, 50, "我是QK");
getchar();
//2.1关闭窗口
closegraph();
return 0;
}
//1.在字符串前面加上大写的L
//2.用TEXT()把字符串包起来,_T()
正确方式:
settextcolor(RED);//设置文字颜色
//1.在字符串前面加上大写的L
//2.用TEXT()把字符串包起来,_T()
outtextxy(50, 50, L"我是QK");
运行结果:
设置字体样式,大小,字体(上面的代码也加上去)
settextstyle(50, 0, L"楷体");
运行结果:
我们会发现字体是有背景的
//设置背景模式
setbkmode(TRANSPARENT);
运行结果
文字居中
settextcolor(RED);
setfillcolor(BLUE);
setlinecolor(BLACK);
fillrectangle(200, 50, 500, 100);//设置一个矩形
wchar_t arr[] = L"我是居中显示的maye";
int width = 300/2-textwidth(arr) / 2;
int height =50/2- textheight(arr) / 2;
outtextxy(width+200,height+50 ,arr);
运行结果:
- 在使用图像之前,需要定义一个变量,然后把图片加载进变量中才能进行使用.
- 平时定义变量都是使用的基础数据类型,比如:int temp;
- 在使用图像的时候需要使用easyx提供给我们的类型:IMAGE,如:IMAGE.img;
- loadimage(IMAGE* pDstImg,LPCTSTR pimgFile,int nWidth=0,int nHeight=0,bool bResize=false);从文件中读取图像
- pDstImg //保存图像的IMAGE对象指针&img
- plmgFile //图片文件名
- nWidth=0 //图片的拉伸宽度
- nHeight=0 //图片的拉伸高度
- bResize=false //是否调整IMAGE的大小以适应图片
- putimage(int dstX,int dstY,IMAGE* pSrcimg,DWORD dwRop=SRCCOPY);在当前设备上绘制指定图像
- dstX //绘制位置的X坐标
- dstY //绘制位置的Y坐标
- pSrcImg //要绘制的IMAGE对象指针&
- dwRop=SRCCOPY //三元光栅操作码
加载图片
IMAGE img;//定义一个对象
loadimage(&img, L"./相对路径或者绝对路径",500,400);//加载图片,后面两个调整图片大小
putimage(0, 0, &img);//输出图片,0,0,相当于坐标
注:相对路径: ./表示当前文件夹下,../当前文件夹的上一级目录
绝对路径:E:\vs\youxi01
这里我推荐用相对路径,我讲解下操作.
1.点击此文件
2.将图片加载到你创建的文件下面,我这里是test.cpp
运行结果:
- 鼠标消息需要使用MOUSEMSG类型,比如:MOUSEMSG.msg;
- 然后用MoustHit()判断是否有鼠标消息(左键,右键,中间,移动)
- 如果有鼠标消息就可以进行接收鼠标消息了msg=GetMouseMsg();
- 鼠标消息主要成员:
- uMsg;//当前鼠标消息
- x; //当前鼠标x坐标
- y; //当前鼠标y坐标
- uMsg可用来判断当前鼠标消息是什么消息
- WM_LBUTTONDOWN 鼠标左键消息
- WM_RBUTTONDOWN 鼠标右键消息
代码示例:(要把前面写的代码的都放进去)
//鼠标消息
while (1)//不断地处理事务,需要循环
{
if (MouseHit())
{
//cleardevice();
MOUSEMSG msg = GetMouseMsg();//接收鼠标消息
if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100)
{
printf("我是QK,大家多多关照");
}
//消息分发
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
outtextxy(400, 400, L"鼠标左键按下");
printf("坐标(%d,%d)\n", msg.x, msg.y);
break;
case WM_RBUTTONDOWN:
outtextxy(400, 400, L"鼠标右键按下");
printf("坐标(%d,%d)\n", msg.x, msg.y);
break;
}
}
}
注:这里>200,<500那段是判断鼠标是否点击在那个矩形区域内,如果是则输出下面的文字,如果不是则输出你所指向的坐标
运行结果:
另一种方式:
代码示例:
#include
#include
#include
using namespace std;
void button(int x, int y, int w, int h)
{
setbkmode(TRANSPARENT);
setfillcolor(BROWN);
fillroundrect(x, y, x + w, y + h, 10, 10);
settextstyle(30, 0, L"黑体");
wchar_t text[] = L"按钮";
int tx = x + (w - textwidth(text)) / 2;
int ty = y + (h - textheight(text)) / 2;
outtextxy(tx, ty, text);
}
int main()
{
initgraph(640, 480, EW_SHOWCONSOLE);
button(50,50,150,50);
while (1)//不断地处理事务,需要循环
{
if (MouseHit())
{
//cleardevice();
MOUSEMSG msg = GetMouseMsg();//接收鼠标消息
//消息分发
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 50 && msg.x <= 50 + 150 && msg.y >= 50 && msg.y <= 50 + 50)
{
printf("我是按钮,我被点击了\n");
}
break;
default:
break;
}
}
}
getchar();
return 0;
}
运行结果
代码示例:
//鼠标消息
int x = 0, y = 0;
while (1)//不断地处理事务,需要循环
{
cleardevice();
setfillcolor(BROWN);
fillcircle(x, y, 20);
char key = _getch();
printf("%d,%c\n", key, key);
switch (key)
{
case 72://上键
case 'w':
case 'W':
y-=5;
printf("上键\n");
break;
case 80://下键
case 's':
case 'S':
y+=5;
printf("下键\n");
break;
case 75:
case'a'://左键
case'A':
x-=5;
printf("左键\n");
break;
case 77://右键
case 'd':
case 'D':
x+=5;
printf("右键\n");
break;
}
运行结果:
//双缓冲绘图,需要放在绘图代码之前和之后
BeginBatchDraw();
......
EndBatchDraw();
另一种键盘操作方式:
if (GetAsyncKeyState(VK_UP))//上键
{
y -= 5;
}
if (GetAsyncKeyState(VK_DOWN))//下键
{
y += 5;
}
if (GetAsyncKeyState(VK_LEFT))//左键
{
x -= 5;
}
if (GetAsyncKeyState(VK_RIGHT))//右键
{
x += 5;
}
两种对比:后一种更好一点,不仅可以上下左右走,还可以斜着走
代码示例:
#include
#include//使用getch()
#include
#include//包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib")//加载静态库
//播放音乐
void BGM()
{
//打开音乐,播放音乐,repeat重复播放
mciSendString(L"open ./15161.mp3",0,0,0);
mciSendString(L"play ./15161.mp3",0,0,0);
}
代码示例:
void change()
{
//获取窗口句柄
HWND hnd = GetHWnd();
//设置窗口标题
SetWindowText(hnd, L"c语言plus,欢迎关注");
//弹出窗口,提示用户操作
int isok=MessageBox(hnd, L"恭喜你成功过关", L"提示", MB_OKCANCEL);
if (isok == IDOK)
{
printf("你点击了OK");
}
else if (IDCANCEL == isok)
{
printf("你点击了取消");
}
}
运行结果: