【C/C++】使用类和对象 练习EasyX图形库

本文介绍了如何使用C++和EasyX图形库来封装一个游戏人物类,包括创建类、构造与析构函数的使用,以及人物的显示和移动方法。通过控制台读取键盘输入,实现实时的人物移动和画面更新。
摘要由CSDN通过智能技术生成

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


在之前的文章中使用C语言完成过几个基于EasyX图形库的小项目

【c语言】游戏项目——贪吃蛇、俄罗斯方块等

介绍过类和对象后,本文将通过类和对象的角度再次使用EasyX图形库,进行简单的练习,封装一个游戏人物—属性、行为等

一、创建类

将游戏人物—超级玛丽封装成类,定义人物的横纵坐标和面朝方向,代表人物在画面中的位置和状态

class CMary
{
public:
	int m_x;
	int m_y;
	int m_direct;	//四个方向
	//表示图片的变量
	IMAGE m_up;
	IMAGE m_down;
	IMAGE m_left;
	IMAGE m_right;
};

二、构造、析构函数

使用构造函数将程序窗口、窗口背景、人物坐标进行初始化

	CMary()		//构造函数用于初始化
	{
		//创建窗口 大小600*600
		::initgraph(600, 600);		// ::取全局作用域,最好加上:: 防止同名函数的混淆

		//设定窗口背景色为 白色
		::setbkcolor(RGB(255, 255, 255));
		::cleardevice();

		//初始化最初位置为 中间
		m_x = 300;
		m_y = 300;

		m_direct = DIRECT_RIGHT;
	}

加载图片资源也写到构造函数中(图片资源放在文末)

需要在工程文件目录下创建pic文件夹,将图片资源保存其中

		//加载图片(表示图片的变量和具体的图片资源绑定)
		::loadimage(&m_up, L"./pic/mary-up.bmp");		//相对路径		L:转码
		::loadimage(&m_down, L"./pic/mary-down.bmp");
		::loadimage(&m_left, L"./pic/mary-left.bmp");
		::loadimage(&m_right, L"./pic/mary-right.bmp");

析构函数用来回收额外的内存空间,关闭窗口

	~CMary()	//析构函数 回收
	{
		::closegraph();	//关闭窗口
	}

三、基本功能

基本功能包括显示人物、人物移动、运行程序的函数

通过EasyX图形库提供的函数进行绘图,定义Show()函数用来显示人物

	//显示人物
	void Show()
	{
		//每次改变位置前,清空窗口
		::BeginBatchDraw();	//开始批量绘图
		::cleardevice();

		m_direct == DIRECT_UP ? ::putimage(m_x, m_y, &m_up) : void(0);
		m_direct == DIRECT_DOWN ? ::putimage(m_x, m_y, &m_down) : void(0);
		m_direct == DIRECT_LEFT ? ::putimage(m_x, m_y, &m_left) : void(0);
		m_direct == DIRECT_RIGHT ? ::putimage(m_x, m_y, &m_right) : void(0);

		settextstyle(20, 0, _T("宋体"));
		settextcolor(RGB(0, 0, 255));
		outtextxy(40, 390, L"天喜Studio");
		::EndBatchDraw();	//结束批量绘图
	}

定义Move()函数用来控制人物的移动,并且根据选择的方向不同进行不同方向的移动

在移动时根据窗口大小限制人物,防止任务移动到窗口外

	//人物移动
	void Move(int direct)
	{
		switch (direct)
		{
		case DIRECT_UP:
		{
			/*if (m_y - MOVE_STEP >= 0)
			{
				m_y -= MOVE_STEP;
			}
			else
			{
				m_y = 0;
			}*/
			m_y - MOVE_STEP >= 0 ? m_y -= MOVE_STEP : m_y = 0;
			m_direct = DIRECT_UP;
			break;
		}
		case DIRECT_DOWN:
		{
			//下边界: 图片尺寸大小 60	600-60=540
			m_y - MOVE_STEP <= 540 ? m_y += MOVE_STEP : m_y = 540;
			m_direct = DIRECT_DOWN;
			break;
		}
		case DIRECT_LEFT:
		{
			m_x - MOVE_STEP >= 0 ? m_x -= MOVE_STEP : m_x = 0;
			m_direct = DIRECT_LEFT;
			break;
		}

		case DIRECT_RIGHT:
		{
			//右边界: 图片尺寸大小 60	600-60=540
			m_x - MOVE_STEP <= 540 ? m_x += MOVE_STEP : m_x = 540;
			m_direct = DIRECT_RIGHT;
			break;
		}
		}
	}

定义Run()运行函数,用于获取用户按下的键盘信息(通过控制台)

并根据方向键进行人物的移动,不断进行刷新显示,实现动态画面


	//运行
	void Run()
	{
		Show();		//初始显示
		while (1)
		{
			//不断获取键盘信息:按下的方向键
			int key = _getch();
			if (key == ESC_KEY)
			{
				::MessageBox(nullptr, L"退出游戏?", L"提示", MB_OK);
				break;
			}
			Move(key);	//根据方向键移动人物
			Show();//更新显示

			Sleep(10);
		}
	}

主函数

主函数中只需要使用CMary人物类创建一个对象m,通过调用类中的Run()函数开始执行程序

int main()
{
	CMary m;
	m.Run();	//运行

	return 0;
}

四、运行结果

在这里插入图片描述

图片资源

mary-down.bmp

在这里插入图片描述

mary-left.bmp

在这里插入图片描述

mary-right.bmp

在这里插入图片描述

mary-up.bmp

在这里插入图片描述

全部完整代码

直接复制代码并配置图片路径就能执行:

#include <conio.h>

#include <easyx.h>
#include <windows.h>
//宏定义四个方向:
#define DIRECT_UP   72
#define DIRECT_DOWN 80
#define DIRECT_LEFT 75
#define DIRECT_RIGHT 77

#define MOVE_STEP 5
#define ESC_KEY 27

class CMary
{
public:
	int m_x;
	int m_y;

	int m_direct;	//方向
	IMAGE m_up;
	IMAGE m_down;
	IMAGE m_left;
	IMAGE m_right;

public:
	CMary()		//构造函数用于初始化
	{
		//创建窗口 大小600*600
		::initgraph(600, 600);		// ::取全局作用域,最好加上:: 防止同名函数的混淆

		//设定窗口背景色为 白色
		::setbkcolor(RGB(255, 255, 255));
		::cleardevice();

		//初始化最初位置为 中间
		m_x = 300;
		m_y = 300;

		m_direct = DIRECT_RIGHT;

		//加载图片(表示图片的变量和具体的图片资源绑定)
		::loadimage(&m_up, L"./pic/mary-up.bmp");	//相对路径		L:转码
		::loadimage(&m_down, L"./pic/mary-down.bmp");
		::loadimage(&m_left, L"./pic/mary-left.bmp");
		::loadimage(&m_right, L"./pic/mary-right.bmp");


	}
	~CMary()	//析构函数 回收
	{
		::closegraph();	//关闭窗口
	}

	//显示人物
	void Show()
	{
		//每次改变位置前,清空窗口
		::BeginBatchDraw();	//开始批量绘图
		::cleardevice();

		m_direct == DIRECT_UP ? ::putimage(m_x, m_y, &m_up) : void(0);
		m_direct == DIRECT_DOWN ? ::putimage(m_x, m_y, &m_down) : void(0);
		m_direct == DIRECT_LEFT ? ::putimage(m_x, m_y, &m_left) : void(0);
		m_direct == DIRECT_RIGHT ? ::putimage(m_x, m_y, &m_right) : void(0);

		settextstyle(20, 0, _T("宋体"));
		settextcolor(RGB(0, 0, 255));
		outtextxy(500, 570, L"天喜Studio");
		::EndBatchDraw();	//结束批量绘图
	}
	//人物移动
	void Move(int direct)
	{
		switch (direct)
		{
		case DIRECT_UP:
		{
			/*if (m_y - MOVE_STEP >= 0)
			{
				m_y -= MOVE_STEP;
			}
			else
			{
				m_y = 0;
			}*/
			m_y - MOVE_STEP >= 0 ? m_y -= MOVE_STEP : m_y = 0;
			m_direct = DIRECT_UP;
			break;
		}
		case DIRECT_DOWN:
		{
			//下边界: 图片尺寸大小 60	600-60=540
			m_y - MOVE_STEP <= 540 ? m_y += MOVE_STEP : m_y = 540;
			m_direct = DIRECT_DOWN;
			break;
		}
		case DIRECT_LEFT:
		{
			m_x - MOVE_STEP >= 0 ? m_x -= MOVE_STEP : m_x = 0;
			m_direct = DIRECT_LEFT;
			break;
		}

		case DIRECT_RIGHT:
		{
			//右边界: 图片尺寸大小 60	600-60=540
			m_x - MOVE_STEP <= 540 ? m_x += MOVE_STEP : m_x = 540;
			m_direct = DIRECT_RIGHT;
			break;
		}
		}
	}


	//运行
	void Run()
	{
		Show();		//初始显示
		while (1)
		{
			//不断获取键盘信息:按下的方向键
			int key = _getch();
			if (key == ESC_KEY)
			{
				::MessageBox(nullptr, L"退出游戏?", L"提示", MB_OK);
				break;
			}
			Move(key);	//根据方向键移动人物
			Show();//更新显示

			Sleep(10);
		}
	}

};

int main()
{
	CMary m;
	m.Run();	//运行

	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值