本文将介绍一种巧妙的方法,让点阵图形编程更加直观。
下面以一个16*16的点阵图形为例:
常用的表示方法是定义一个数组(逐行扫描的方式),
比如第一行,用二进制表示为:0001000000001000 ,用十六进制表示为:0x1008 。如此类推,得到如下数组:
unsigned short pic[] = {
0x1008,
0x2814,
0x4422,
0x8241,
0x8181,
0x8001,
0x4002,
0x4002,
0x,
0x,
0x1008,
0x0810,
0x0420,
0x0240,
0x0180,
0x0000
};
这样的形式,非常不直观。你根本没法从这组数据里看出实际图形的模样。
请看以下方法:
这里有一个非常牛B的#define定义,使得代码数据看上去像是屏幕上的图形一样,十分直观。
#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 /* 用来构建16位宽的图形 */
有了这三个宏定义后,只需要“画”出所需要的图形,程序会自动帮你生成相应的十六进制数据。
上面的例子可以转变为:
unsigned short pic[] = {
s _ _ _ X _ _ _ _ _ _ _ _ X _ _ _ ,
s _ _ X _ X _ _ _ _ _ _ X _ X _ _ ,
s _ X _ _ _ X _ _ _ _ X _ _ _ X _ ,
s X _ _ _ _ _ X _ _ X _ _ _ _ _ X ,
s X _ _ _ _ _ _ X X _ _ _ _ _ _ X ,
s X _ _ _ _ _ _ _ _ _ _ _ _ _ _ X ,
s _ X _ _ _ _ _ _ _ _ _ _ _ _ X _ ,
s _ X _ _ _ _ _ _ _ _ _ _ _ _ X _ ,
s _ _ X _ _ _ _ _ _ _ _ _ _ X _ _ ,
s _ _ X _ _ _ _ _ _ _ _ _ _ X _ _ ,
s _ _ _ X _ _ _ _ _ _ _ _ X _ _ _ ,
s _ _ _ _ X _ _ _ _ _ _ X _ _ _ _ ,
s _ _ _ _ _ X _ _ _ _ X _ _ _ _ _ ,
s _ _ _ _ _ _ X _ _ X _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ X X _ _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};
程序会自动解析 "s" "_" "X" 这三个宏定义,最终得到你想要的十六进制数。
拿第一行来做个解释说明:
s _ _ _ X _ _ _ _ _ _ _ _ X _ _ _ 用相应的宏定义替代后,变成如下的形式:
((((((((((((((((0)*2)*2)*2)*2+1)*2)*2)*2)*2)*2)*2)*2)*2)*2+1)*2)*2)*2 =0x1008
其他的行也是同样的道理。以此类推,就可以得到你想要的数啦。
显然,与前面的代码相比,它的意义更为明显。
特别注意:
程序绘制完图像之后,记得取消这里的三个#define(使用#undef来取消定义),否则将会影响后面程序的运行。
#undef X
#undef _
#undef s
当然,你也可以定义其他的符号,这样代码上会有不一样的显示效果。