“二十一天好习惯”第一期-16

前言:

昨天网课学到了如何用C++制作推箱子小游戏的相关知识,这里分几期给大家分享一下,如何C++和图形库简单制作一款推箱子小游戏,今天为第一期主要分享如何设置和贴上推箱子地图的操作。

思路分析:

首先要制作一款可以贴图的小游戏,需要自行安装图形库:easyZ图形库,详情安装和操作可以跳转下面的链接:https://easyx.cn/https://easyx.cn/https://easyx.cn/安装完图形库以后,就需要用到图形库里面的相关函数来进行地图的设计。主要分为:设计地图,加载地图,贴图等操作。其中设计地图可以简单通过数字来表示地图各个点的状态。加载地图和贴图等操作要用到图形库相关函数。这个后面会细讲,先看实现代码。

代码实现:

#include<easyx.h>//打开图形库
#include<conio.h>
#define ROW 10//行
#define COL 10//列
int map[3][ROW][COL] = {//map是地图
	//1表示墙  2表示人  3表示箱子  4表示目的地  6表示人在目的地上  7表示箱子在目的地上
	//0 表示空地
	{
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 3, 0, 4, 0, 2, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 7, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 4, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 4, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 3, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
		1, 4, 3, 0, 2, 0, 0, 3, 4, 1,
		1, 1, 1, 1, 0, 1, 1, 0, 1, 1,
		1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 3, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 4, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 2, 3, 4, 0, 0, 0, 0, 0, 1,
		1, 0, 3, 4, 0, 0, 0, 0, 0, 1,
		1, 0, 3, 4, 0, 0, 3, 4, 0, 1,
		1, 0, 3, 4, 0, 0, 3, 4, 0, 1,
		1, 0, 3, 4, 0, 0, 3, 4, 0, 1,
		1, 0, 0, 0, 0, 0, 3, 4, 0, 1,
		1, 0, 0, 0, 0, 0, 3, 4, 0, 1,
		1, 0, 0, 0, 0, 0, 3, 4, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1
	}
};
int tempMap[ROW][COL] = { 0 };//辅助地图
int level = 0;//关卡
IMAGE img[5];//图片数组,用来保存图片
//加载地图
void initMap()
{
	//把第level个二维数组加载到辅助地图中来
	int i = 0, j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			tempMap[i][j] = map[level][i][j];
		}
	}
}
//贴地图
void drawMap()
{
	BeginBatchDraw();//批量贴图
	int i = 0, j = 0;
	for (i = 0; i < 10; i++)//i表示行下标
	{
		for (j = 0; j < 10; j++)//j表示列下标
		{
			switch (tempMap[i][j])//
			{
			case 1:putimage(j * 50, 50 * i, &img[0]); break;//墙
			case 6:
			case 2:putimage(j * 50, 50 * i, &img[1]); break;//人
			case 3:putimage(j * 50, 50 * i, &img[2]); break;//箱子
			case 4:putimage(j * 50, 50 * i, &img[3]); break;//目的地
			case 7:putimage(j * 50, 50 * i, &img[4]); break;//箱子在目的地上
			}
		}
	}
	EndBatchDraw();//结束批量绘制
}
//加载图片 把图片加载进图片数组中
void loadPic()
{
	loadimage(&img[0], "1.jpg", 50, 50);//墙
	loadimage(&img[1], "2.jpg", 50, 50);//人
	loadimage(&img[2], "3.jpg", 50, 50);//箱子
	loadimage(&img[3], "4.jpg", 50, 50);//目的地
	loadimage(&img[4], "7.jpg", 50, 50);//箱子在目的地上
}
int main()
{
	initgraph(500, 500);
	//把图片放进数组中
	loadPic();
	//把当前关卡的图片放进辅助地图中
	initMap();
	//贴图
	drawMap();
	while (1)
	{
		drawMap();//贴图
	              //人物移动
		          //清屏
	}
	closegraph();
	return 0;
}

解析:

这里用到了三维数组来设计关卡,为什么用三维数组呢?因为每张地图就是一个二维数组,而由一个个二维数组组成的每一关就要拿三维数组来存放。这里设计一共设计三张地图,地图上每个位置上的状态分别用不同的数字来表示,这也方便后续根据数字来贴图。这里用到了辅助地图,作用是在把地图加载到辅助地图上方便贴图(就是initMap函数的作用)然后函数loadPic作用是把预先下载好的图片按照一定尺寸导入到图片数组中。最后drawMap用到了BeginBatchDraw()函数来进行批量的贴图,再以EndBatchDraw()函数结束贴图,在主函数中initgraph(500, 500)函数是设计程序运行框(也就是游戏画面)的大小,这里设计成500*500的大小,刚好每行每列都是10个元素。这样以后在一个一个调用之前的函数,一张地图就生成了。

实际演示:

 小结:

看看这个地图还像那么一回事,这只是设计阶段,后面的如何控制人物移动才是最难的地方,今天的分享先到这里谢谢大家,后续会继续补充更新。

补充:

推箱子项目第二期已更新,详情请跳转以下链接:

https://blog.csdn.net/xwy777/article/details/121296550?spm=1001.2014.3001.5501icon-default.png?t=LA92https://blog.csdn.net/xwy777/article/details/121296550?spm=1001.2014.3001.5501

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值