前言:
昨天网课学到了如何用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个元素。这样以后在一个一个调用之前的函数,一张地图就生成了。
实际演示:
小结:
看看这个地图还像那么一回事,这只是设计阶段,后面的如何控制人物移动才是最难的地方,今天的分享先到这里谢谢大家,后续会继续补充更新。
补充:
推箱子项目第二期已更新,详情请跳转以下链接: