基于推箱子对EASYX图形库的复习

目录

一、其他小知识

1.1如何在VS中实现快速替换功能

1.2enum与define

1.3_getch()函数的介绍

1.4C/C++中的<Windows.h>库

1.5基于vs的图片音频导入

二、EASYX库

2.1简单的注意事项

2.2窗口函数 

2.2.1创建一个窗口(initgraph)

2.2.2其他

设置背景色时,需要两条命令

2.3图形绘制函数

清屏函数(cleardevice)

设置背景模式(setbkmode)

2.4文字绘制函数

 2.5图像处理函数(重点)

2.6音乐的使用

2.7消息(鼠标 键盘)

键盘和鼠标的使用

2.8其他函数·

2.8.1键盘消息函数

2.8.2如何修改窗口标题


一、其他小知识

1.1如何在VS中实现快速替换功能

点击【编辑】->[查找和替换]->[快速替换],将需要替换的内容和原内容进行填写,并选择全部替换即可!


1.2enum与define

定义

enum 标识符 
{
      枚举数据表
};

(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。

(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(3)枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(4)可以在定义类型时对枚举常量初始化。

(5)枚举类型可以进行比较。

(6)枚举常量不是字符串,不能用%s方式输出字符串。

(7)enum类型 不允许元素为字符常量、字符串常量、整型常量、浮点常量、布尔常量等字面常量

注意:

enum用来定义一系列宏定义常量区别用,相当于一系列的#define xx xx,当然它后面的标识符也可当作一个类型标识符;typedef enum则是用来定义一个数据类型,那么该类型的变量值只能在enum定义的范围内取。两者在这点上是没有差别的。

用法:因为枚举变量输出的是索引,可以使用switch(){}语句转换成字符串,提高代码的可读性

基于推箱子对EASYX图形库的复习_第1张图片

1.3_getch()函数的介绍

我们一般所使用的 getchar() 函数在读入一个字符时必须按一下 Enter 键,该代码才会继续运行;但是 _getch() 函数读入一个字符时 不用 enter 代码会继续跑;最简单使用场景是登陆界面输入密码时,我们不想让密码显示,而是每一次输入都显示一个‘*’,使用_getch()函数需使用到头文件:

#include

1.4C/C++中的<Windows.h>库

system("cls");//清屏,清除运行框里所有的内容。
system("pause");//暂停,按任意键继续。
system("shutdown -s -t 60")//最后一个数字代表几秒,表示在几秒后关机。
system("shutdown -a");//取消关机的命令(与上一个搭配)。
system("color 02");//换背景和字体的颜色,具体颜色下面会讲。

背景颜色图

0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 湖蓝色     B = 淡浅绿色
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色 

特殊·:

1>Sleep(时间(毫秒));代表的是让计算机暂停输入输出特定时间,括号里写要暂停的毫秒数,如Sleep(1000)代表休眠1000毫秒(1秒)

2>MessageBox(句柄, 显示内容,标题,选择选项);

句柄可以为NULL,表示当前窗体的句柄。

最后一个参数是显示在提示框中的按钮类型:

MB_ABORTRETRYIGNORE//终止,重试,忽略
MB_OKCANCEL//确定,取消
MB_RETRYCANCEL//重试,取消
MB_YESNO//是,否
MB_YESNOCANCEL//是,否,取消
MB_OK//确定

1.5基于vs的图片音频导入

基于推箱子对EASYX图形库的复习_第2张图片

二、EASYX库

2.1简单的注意事项

2.1.1.如果在使用的时候报错,可能是因为需要用多字节字符集,点击项目—>属性—>找到字符集 ,将它改为 多字节字符集

在这里插入图片描述

2.1.2 使用easyx图形库,要使用头文件 #include>

2.2窗口函数 

2.2.1创建一个窗口(initgraph)

initgraph函数有三个参数,第一个是窗口的宽度,第二个是窗口的高度,第三个参数有三个功能,第一个是展示控制台(SHOWCONSOLE—>show 展示,console 控制台)

#include
#include

int main()
{

	initgraph(460, 460,SHOWCONSOLE);

	while (1)
	{
		;                   // 使程序卡住,不闪退,方便看到效果
	}

	return 0;
}

第二个 NOCLOSE(没有关闭功能)

第三个功能 NOMINIMIZE(没有关闭功能)

2.2.2其他

closegraph();//关闭绘图窗口
cleardevice();//清空绘图设备

cleardevice();这个函数用于清除屏幕内容。具体的,是用当前背景色清空屏幕,并将当前点移至 (0, 0)。

特别的:

设置背景色时,需要两条命令

setbkcolor(YELLOW);
cleardevice();

2.3图形绘制函数

常见图形

circle 画圆    ellipse 椭圆    pie 扇形    polygon 多边形
rectangle 矩形    roundrect 圆角矩形    line 画线    putpixel 画点

画圆(circle,solidcircle)
circle(int x, int y, r) , solidcircle(int x, int y, r) -->实心圆,   fillcircle(int x, int y, r)-->用于绘制带边框的填充圆。
圆心坐标(x, y),圆的半径r

画线条(line)
line(int x1, int y1, int x2, int y2)
线条为 (x1, y1) 和 (x2, y2)两个点连接成的

画矩形(rectangle)
rectange(int x1,int y1,int x2, int y2)
(x1, y1)左上顶点 (x2, y2)右下顶点 画矩形

设置填充颜色(setfillcolor)
注意:颜色需要大写 例如 setfillcolor(GREEN)

设置线条颜色(setlinecolor)
颜色需要大写,setlinecolor(GREEN)

设置线条样式(setlinestyle)

用于设置当前设备画线样式。
基于推箱子对EASYX图形库的复习_第3张图片

设置背景颜色(setbkcolor)
setbkcolor(GREEN)

清屏函数(cleardevice)

设置背景时候,需要用清屏函数(无参数),将window的黑色除去,才能够显示出setbkcolor函数所设置出的颜色。

在这里插入图片描述

设置背景模式(setbkmode)

一般在做游戏或者其他项目中,用来设置成透明的
setbkmode(TRANSPARENT) -->transparent 透明的

2.4文字绘制函数

文字的打印(outtextxy)
outtextxy(int x, int y, 文字)
(x,y)位置 例如 outtextxy(40,50,“你好呀”)

文字的颜色(settextcolor)
settextcolor(GREEN)

文字的形式(settextstyle)
settextstyle(int x, int y, 字体)
(x, y) 位置
例如 settextstyle(40, 40, “宋体”)

注意:

1.printf和scanf不会在图形窗口显示

2.不兼容的解决

2.1在字符串前加大写的Z

2.2在字符串前用—T()包起来

另外还有两个函数可以求字符串的像素宽度和高度

int textheight(LPCTSTR str);//用于获取字符串实际占用的像素高度。
int textwidth(LPCTSTR str);//用于获取字符串实际占用的像素宽度。

通过这两个函数可以让字符串的居中对齐:

#include //包含图形库头文件

int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);
    setbkcolor(RGB(203, 221, 244));
    cleardevice();

     setfillcolor(YELLOW);
    fillrectangle(200, 50, 500, 100);
    settextcolor(RGB(155, 0, 15));
    char arr[] = "测试字符串";
    int width = 300 / 2 - textwidth(arr)/2;
    int height = 50 / 2 - textheight(arr) / 2;
    setbkmode(TRANSPARENT);
    outtextxy(width + 200, height + 50, arr);

  
    while (1)
    {
        ;
    }
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备
    return 0;
}

基于推箱子对EASYX图形库的复习_第4张图片

 2.5图像处理函数(重点)

第一步:放图片

先将图片复制粘贴到项目所在的文件夹

第二步:定义图片(IMAGE)

用IMAGE对图片进行定义,例如 IMAGE image
如果图片不止一张,用数组贮存图片,例如IMAGE image[N],N代表图片的数量

第三步:加载图片(loadimage)
IMAGE image;
loadimage(&image,“(定义图片的地址)”),.“./images/2.bmp”(放图片的位置));
注意:如果出现重载中没有一个可以转换参数的类型的报错
有三种解决方法:
第一种(最简单的方法):调成多字节字符集(具体步骤在前面的注意事项中)。
第二种,在loadimage函数中,放图片的位置的参数前面加上个,_T(放图片的位置)。
第三种方法:在放图片位置的参数前面加上个L。

基于推箱子对EASYX图形库的复习_第5张图片
 

第四步:图片的打印(putimage)

putimage(int x, int y, 定义图片的地址)
(x, y)表示位置
同时loadimage函数的第三个参数和第四个参数,分别表示图片的宽度和高度。

switch (map[level][i][j])
			{
			case space:
				//printf("  ");
				putimage(x, y, image_all);
				break;
			case wall:
				//printf("▓ ");
				putimage(x, y, image_all + 1);
				break;
			case destination:
				//printf("☆");
				putimage(x, y, image_all + 2);
				break;
			case box:
				//printf("□");
				putimage(x, y, image_all + 3);
				break;
			case player:
				//printf("♀");
				putimage(x, y, image_all + 4);
				break;
			case box + destination:
				//printf("★");
				putimage(x, y, image_all + 5);
				break;
			case player + destination:
				//printf("♂");
				putimage(x, y, image_all + 4);
				break;
			}
		}

 注意·:1图片位置应与.cpp同文件夹

              2./表示当前文件下

2.6音乐的使用

首先声明一点,这个并不属于easyx库,而是属于windows,所以就需要用头文件,#include(mm- 多媒体的,system系统,多媒体系统),还需要个库文件**#pragma comment(lib, “winmm.lib”) —>windows的多媒体库文件**,同样也需要把音乐,复制粘贴到项目所在的文件夹中

#include
#include
#include  // 包含多媒体设备接口文件  
#pragma comment(lib, "winmm.lib")
int main()
{

	initgraph(460, 460);
	//第一种
	mciSendString("open ./fire/小幸运.mp3", 0, 0, 0);
	mciSendString("play ./fire/小幸运.mp3", 0, 0, 0);
  // 

	//第二种方法   alias 取别名 bk
	//mciSendString("open ./fire/小幸运.mp3 alias bk", 0, 0, 0);   打开音乐
	//mciSendString("play bk ", 0, 0, 0);                           播放音乐
	// mciSendString("close ./fire/小幸运.mp3", 0, 0, 0);         关闭音乐
	//如果想程序运行一会儿 自动关闭音乐,
	//可以使用Sleep函数,然后再关闭音乐的函数,Sleep(3000)表示前面的程序执行3秒,再执行下面的程序 
	while (1)
	{
		;                   // 使程序卡住,不闪退,方便看到效果
	}

	return 0;
}

其中mciSendString 最后三个参数 分别是 快进 快退,这里播放,就没管,全为0

#include
#include
#include
#pragma comment(lib,"winmm.lib")
using namespace std;
int main()
{
	PlaySound(TEXT("F:\\c.wav"),NULL,SND_FILENAME | SND_ASYNC);
	cin.get();
	cin.get();
	return 0;
}

PlaySound只能播放WAV文件。

2.7消息(鼠标 键盘)

首先,我们应该知道,initgraph 创建的窗口的无法直接使用键盘和鼠标操作的,所以接下来我们来学习,怎样输出消息。

消息的定义(ExMessage)

直接使用 ,像这样Exmessage m;来定义一个消息

消息的接受(peekmessage)

peekmessage(参数1, 参数2),peekmessage的参数1为消息的地址,参数2则为接受消息的对象(键盘或者鼠标或者都有),所以peekmessage的参数2有3种,分别是EM_MOUSE(鼠标) , EM_KEY(键盘), EM_MOUSE | EM_KEY(鼠标和键盘)

#include
#include

int main()
{
	ExMessage m;  // 定义消息
	peekmessage(&m, EM_KEY);  //接受消息(键盘)
	peekmessage(&m, EM_MOUSE); //接受消息(鼠标)
	peekmessage(&m, EM_KEY | EM_MOUSE);// 接受消息(鼠标和键盘)

	return 0;
}

键盘和鼠标的使用

#include
#include
#include
#pragma comment(lib, "winmm.lib")

int main()
{
	initgraph(460, 460);
	ExMessage m;  // 定义消息
	//peekmessage(&m, EM_KEY);  //接受消息(键盘)
	//peekmessage(&m, EM_MOUSE); //接受消息(鼠标)
	peekmessage(&m, EM_KEY | EM_MOUSE);// 接受消息(鼠标和键盘)

	mciSendString("open ./fire/11.mp3", 0, 0, 0);

	while (1)
	{
		if (m.message == WM_LBUTTONDOWN) // 鼠标左键      M_RBUTTONDOWN 鼠标右键
		{
			mciSendString("play ./fire/11.mp3", 0, 0, 0);
		}

		if (m.message == WM_KEYDOWN) // 按键
		{
			if (m.vkcode == 'f')     // 如果按f  就播放小幸运 
			{
				mciSendString("pause ./fire/11.mp3", 0, 0, 0);
			}
		}
	}
	return 0;
}
1.void FlushMouseMsgBuffer():用于清空鼠标消息缓冲区

2.MOUSEMSG GetMouseMsg():用于获取鼠标消息。如果鼠标消息队列为空,等待直到有鼠标消息。

3.bool PeekMouseMsg(MOUSEMSG *pMsg, bool bRemoveMsg):用于获取鼠标消息并立即返回。

4.bool MouseHit():用于检查鼠标消息

5.struct MOUSEMSG
{
UINT uMsg; //当前鼠标信息。
bool mkCtrl; //按下CTRL键。
bool mkShift; // SHIFT键为down。
bool mkLButton;//鼠标左键按下。
bool mkMButton;//鼠标中键是向下的。
bool mkRButton;//点击鼠标右键。
int x;//光标的x坐标。(物理坐标)
int y;//光标的y坐标。(物理坐标)
int wheel;//鼠标滚轮滚动值。
}:用于保存鼠标消息

应用:如何控制游戏里人物的移动


	ExMessage msg;
	peekmessage(&msg, EM_KEY);
	switch (msg.message)
	{
	case WM_KEYDOWN://键盘按下消息
		switch (msg.vkcode)
		{
		case VK_LEFT://按下左键
			
			break;
		case VK_RIGHT://按下右键
			
			break;
		case VK_UP://按下上键
			
			break;
		case VK_DOWN://按下下键
			
			break;
		}
		break;
	}

2.8其他函数·

2.8.1键盘消息函数

要使用头文件conio.h

getch()与getchar()类似,但是getch()不需要回车就能输入,如果是上下左右等非ASCII码字符按键时,则使用虚拟键值,其中
上:72
下:80
左:75
右:77

2.8.2如何修改窗口标题

HWND GetHWnd();//这个函数用于获取绘图窗口句柄。

具体使用方式如下:

void change()
{
    //获取窗口句柄
    HWND hnd = GetHWnd();
    //设置窗口标题
    SetWindowText(hnd, "测试标题");
    //弹出窗口,提示用户操作
    MessageBox(NULL, "游戏失败", "窗口标题", MB_OKCANCEL);
}

基于推箱子对EASYX图形库的复习_第6张图片

你可能感兴趣的:(算法,c++,开发语言)