这篇文章主要介绍如何制作以及画出地图,顺便会填充一些个人认为有趣的东西介绍给大家。
C用来写图形化界面其实是一个很费力的过程,但是面向过程的语言结构,让人在做一些逻辑处理的时候更加的清晰,而不像C++一样,抽象化的方式让查看代码的人眼花缭乱,防不胜防,势必增加维护成本。但是C++更加高级的重写机制,泛型,以及STL方法,使得代码量很大的缩减,减少了开发者的劳动力输出。为了让逻辑处理更加简单易懂,本次开发大量使用简单的C语言,力图让每个读者都能看懂。
我们收集好素材以后就要想着如何去使用它,比如说,要在某个位置打印出一个怪物的图片,那么 我们每次打印都要确定那个位置。库函数中对于位置的确认是通过图片的左上角与图片的大小来界定范围,所以,我们需要创建一个二维数组来存储所有需要在这张地图上显示的素材图片
int map[13][13] =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,16,1,4,8,8,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,
0,6,1,1,2,1,0,0,1,1,1,1,0,
0,4,11,1,0,1,0,0,13,0,0,1,0,
0,0,2,0,0,1,2,10,18,5,0,1,0,
0,4,1,1,0,1,0,0,0,0,0,1,0,
0,1,11,1,0,1,0,0,0,0,0,1,0,
0,0,2,0,0,1,1,0,0,0,0,1,0,
0,1,1,1,0,0,2,0,0,0,0,2,0,
0,6,17,4,0,4,1,4,0,1,10,1,0,
0,6,1,4,0,1,15,1,0,9,7,9,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
};
或许有人就要问了,这些0,1,2,3,数字能表示什么? 难道说要在界面上打印出一个二维矩阵? 可惜,并不是这样,这些数字就体现了我将素材图片全部起名为数字序列的好处,我们不必关心需要输出哪一张图片,只需要记得某个素材的图片名字叫什么就行了。 当然,这中间还需要一个数字到字符串的转换函数,因为我们的IMAG函数需要的参数是字符串类型。
void loadResource()
{
//加载资源
loadimage(&roleInfo, "info.jpg");
for (int i = 0; i < 19; i++)
{
char fileName[20] = "";
sprintf(fileName, "%d.jpg", i);
loadimage(img + i, fileName, 55, 55);//界定位图大小
}
}
//把整形转换为字符串
char str[20] = "";
char *intToWchar(int xNum)
{
sprintf(str, "%d", xNum);
return str;
}
如此一来,是不是很轻松的就将素材转化成一种更加简单的使用方式了? 这次撰写和开发的精华部分也就在这里,巧妙的利用数字转化字符串,使得地图的图画有了可能,不然地图的撰写是一个极大的问题。 当然,填充完毕之后,我们就开始将素材打印在界面上。
//将数据转格式 用以输出在图形界面山上
void drawMap()
{
int i, j;
int x, y;
for (i = 0; i < 13; i++)
{
for (j = 0; j < 13; j++)
{
x = 55 * j;
y = 55 * i;
putimage(x, y, &img[map[i][j]]);
}
}
putimage(55 * 13, 0, &roleInfo);
outtextxy(55 * 13 + 12, 100 - 8, role.RoleName);
outtextxy(55 * 13 + 12, 165, intToWchar(role.LV));
outtextxy(55 * 13 + 12, 214, intToWchar(role.JY));
outtextxy(55 * 13 + 12, 336, intToWchar(role.HP));
outtextxy(55 * 13 + 12, 383, intToWchar(role.MP));
outtextxy(55 * 13 + 12, 475, intToWchar(role.Attrack));
outtextxy(55 * 13 + 12, 520, intToWchar(role.Defender));
outtextxy(55 * 13 + 12, 630, intToWchar(role.Yellow));
outtextxy(55 * 13 + 12, 693, intToWchar(role.Bule));
}
至此,一张地图就画了出来,贴张图看看效果