Category Archives: SDL
IN:SDL, 编程相关 Comments:1前一篇文章提到的是SDL中的英文点阵显示,原理上汉字的显示也是相同的,不过由于汉字较多,有不同的编码方式,因此花了些时间写了GBK和UTF-8两种编码的点阵显示,网上有很多文章介绍SDL中显示GBK编码的汉字,基本上是按搬DOS下汉字显示的方式,我主要说一下Linux的UTF-8编码的汉字显示。
由于点阵字库的排序都是按照区位码的方式在HZK16这样的文件中保存,因此如果需要显示汉字必须先得到汉字的区位码,由于GBK编码的汉字转换区位码比较简单:
char *s = “中”;
区码:(unsigned char)s[0]-161;
位码:(unsigned char)s[1] – 161;
你至少得明白GBK编码的汉字是由两个字节组成。但是UTF-8与区位码之间的转换就比较麻烦,我到现在具体的实现还不清楚,大概就是先把UTF-8转换为GBK(使用查表的方式可能比较好),然后再由GBK转换为区位码。在网上找了好长时间只找到了VB的实现,看不懂就先用了Linux下的ivcon这个库来进行编码转换,这个库应该是一般Linux系统都有的吧,如果没有的话我还得考虑自己实现这个编码转换。
具体的代码我就不贴出来了,因为还不完善,谁有兴趣可以给我发邮件索取。
IN:SDL, 编程相关 Comments:1以前的文章中已经提到SDL是相对比较底层的一个开发库,因此需要自己手动写一些比较常用的功能库,前段时间完成了绘图库,这两天写程序时突然发现我还需要一个显示字符的函数,在SDL邮件列表里问了一下,大家的回答都是使用一个bmp的图像文件,把ASCII码的可见字符存在这幅图片中,然后读取图片中的信息,但这样不能灵活的控制字符的大小、颜色,那应该怎么办呢?点阵字库,就是这个东西,以前做DOS下的游戏时也接触到过比较熟悉,只是在寻找字库时花了好大功夫,最后还是从DOS98系统中找到了asc16这个ASCII的点阵字库文件。这个字库的大小是16×8,还有些点阵字库的生成程序但都需要注册不然只能生成最大16×16的字库,郁闷,有时间我自己研究下这个字库生成,写个Linux下的。
当然SDL还有相应的SDL_ttf可以使用,不过如果你对画面中字体要求不是很高的话没必要使用的。
我简单的说一下ASC16这个字库的使用:
unsigned char match[16];
FILE *ASC;
unsigned char temp = 0×80;
unsigned int addr = 0; /*offset of a character*/
int x1 = x;
int y1 = y;
if (size == 16) {
;
}
if ((ASC = fopen(“ASC16″,”rb”)) == NULL) {
fprintf(stderr,”Open ASC16 error!\n”);
return -1;
}
addr = c << 4;/*设置读取偏移量,offset = 字符的ascii值x16 + 字库首地址(一般为0);*/
fseek(ASC,addr,SEEK_SET);
fread(match,16,1,ASC);/*每次读一个16bytes大小的块,ASC16中每个字符所使用的空间大小是16bytes*/
for(int i = 0;i<16;i++)
{
if (i > 0){
x = x1;
y++;
}
temp = 0×80;/*二进制的10000000*/
for(int k = 0; k < 8; k++)
{
if (match[i] & temp) {
Draw_Pixel(surface,x,y,color);/*当这一位为1时在此处显示一点*/
x++;
}
else {
x++;
}
temp = temp>>1;/*右移,比较下一位*/
}
}
IN:C, SDL, 编程相关 Comments:3SDL是跨平台的开发库,因此移植到WIN下只需要重新编译一次就可以了,源代码我基本没做修改,只是把SDL的包含方式改为了:
#include <SDL/SDL.h>
因为我不知道在WIN下如何使用-I/usr/include/SDL
使用的是Dev-C++ 4.9.2.2编译的,还做了个图标,呵呵,练练手,为了SuperMario的WIN版,没办法啊,有人期待WIN的啊!
源码下载
游戏下载
IN:C, SDL, 编程相关 Comments:5较上次更新:
- 对各模块主要代码加入注释
- 加入避免食物产生在蛇身上
- 加入蛇是否碰到自己身体的检查
- 一些其它优化工作
下载地址:
DouSnake1.0 by cocobear
IN:C, SDL, 编程相关 Comments:7根据小林子同学的建议,写了个加强版的贪吃蛇:
同时有两条蛇存在,分别有不同的方向键操作,两个蛇不可以碰撞,也不可以吃对方的食物。两条蛇的速度会随着它们所吃的食物数量的增加而加快。
调用了上次写的draw.c。
存在的问题:
新生成的食物可能会在蛇的身上
DouSnake下载
IN:C, SDL, 编程相关 Comments:4SDL本身并没有提供绘图的函数,不过已经有第三方的实现,比如SDL_draw。我看了它的一些代码,感觉很乱,里面宏的应用应该说是到了“滥用”的地步,(也许作者为了显示自己高超的架御宏的能力吧)。
只好自己去实现这些基本的绘图函数,目前已经可以实现点,线段,矩形,圆,椭圆的函数。这些基本上已经够用了,不过里面有个斜线的实现使用了别人的代码,没看懂他的实现方法,有时间再想想吧。
给个截图:

BTW:SDL还是算比较底层的吧,这些很基本的东西也得自己写函数实现:-)
代码可以在这里下载。