批注:博文标题中的日期标记此文为我在当时发表在csai上的博客cgao.csai.cn,今搬至此处,同时我的位于csai的博客将停止更新,改用优快云博客
之前我己有一篇文章关于3D引擎行移植到NDS上的内容,可能有些网友不知道NDS为何物,这里我简单说一下,NDS其实就是Nintendo DS的简称,是任天堂开发的一款掌上游戏机,它有两个分辨率为256*192的显示屏,其中一个带有触摸板,硬件上还有麦克风,双CPU:ARM9和ARM7,向下兼容任天堂上一代掌上游戏机GBA,它上面默认没有操作系统(不过国外一个非官方组织将uCLinux移植到了NDS上DSLinux),sourceforge上有一个开发工具,叫devkitpro可以为NDS开发软件.
前几天在NDS上随手试玩了一下GBA上的美版(美语版)<<最终幻想5>>(简称FF V),正传的游戏情节(相比很多游戏的外传)确实非常棒,感觉里面的字体非常漂亮,于是有一个冲动,想把这个字体做到NDS程序上.但由于没有从游戏ROM中分离字库的经验,暂时还没有将<<最终幻想5>>的字体导出.打算暂时写点算法,暂时用别的字库代替,之后再用FF V的字体.
devkitpro开发包本身支持字体输出,只不过它默认输出的字体为8*8点阵等宽字体,个人觉得不是很好看,于是在网上搜了一个也是8*8点阵格式存储的ASCII子集的字体数据先来练手.程序见下面.
由于英文字母本身有瘦有胖,比如字母
I 和
W 这两个.很明显前者宽度比后者要小很多,如果当显示一个单词如Well时,每个字母一样宽则肯定是非常不好看的,所以包括MS Word等很多软件里基本都是用不等宽字体.于是我决定也要这么做.这样一来,我想大致有两个方法:
方法一: 使用不等宽字体字模数据,并记录每个字符数据的起始地址,这样就可以解决因为每个字符所占字模数据大小不同而难以确定字符地址偏移量的问题.而对于显示文字的代码就不用为字体的宽度操心了.这样就需要一个额外的偏移地址查找表,这个查找表既可以通过数组实现:
unsigned char char_table[256]
那么数组下标就是这个字符的ASCII码值,如字符'A'的起始地址为
start_addr+
char_table['A']或
start_addr+
char_table[65] ,也可以不用数组而用哈希表,不过在这里还是数组方便.
方法二: 使用等宽字体的字模数据,这时因为每个字符所占字模容量均相等,对于8*8黑白字模需8*8bit=8Btyes,这样对于每个字符在字模数据中的起始地址就可以很方便的通过ASCII码来计算,比如字母'C'的偏移地址为
'C'*8或67*8 个字节,于是它的起始地址为
start_addr+