注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

太阳神上的博客

青青子衿,悠悠我心,但为君故,沉吟至今。

 
 
 

日志

 
 
 
 

SDL使用有感  

2007-12-27 22:00:35|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  SDL是一个轻量级的C语言游戏开发库,它是可以跨平台的。我最近研究了一下,觉得很不错,以前我常玩的一个很低级的游戏“SuperTux”就是基于这个库,很早以前我就下载了它的Dev-C++的开发包,不过一直没怎么用,后来我在为我的Tenshi语言增加相应的多媒体库时,我才想到它。
  本来我主要想用FLTK来作为主要的开发库,后来觉得FLTK主要是做一些比较简单的界面,它的界面实在是太丑,如果要主要以游戏开发为主的话,还是选用专门的游戏库会比较好。而SDL是开源界比较好用的,所以就拿来研究了一下。
  SDL的绘图功能不错,不过刚开始时我用一个例子总是试不出来,原因就是在于图像的格式有一些问题,核心的SDL只支持BMP图像,要想使用更多的图像格式就要用到SDL_image这个扩展库,不过这个库一用,相应的动态库又要多好几个如libpng和tiff等。
  SDL的事件处理还是比较好懂的,它和Windows API的原理一样,都是基于事件队列,只不过封装得好一些。用SDL_PollEvent或SDL_WaitEvent就可以了。然后来个switch-case语句进行事件判断再处理,不过感觉这个方法非常原始,很底层,例如我要控制一个小人移动,就得在键盘或鼠标的各个事件里写相关控制代码,而且是写在主循环里,而不是专门写在人物的事件处理上,这样一来就麻烦了很多。谁叫SDL是那么底层的库呢?
  不过我后来又找到了一个基于SDL的Kyra库,是用C++写的,这是一个精灵引擎,由于是用C++写的,所以用起来要应该要方便一些。这个库也是原来我从SourceForge那里下载的Dev-C++开发包之一,闻其名久,但一直不大清楚是干什么用的,原是一个引擎,我刚知道时很兴奋,后来一看它又引入了一套自己的机制,还有专门的机制,例如将图像编码,还有相关的XML配置文件等,一看它的帮助文档,看起来就有些累。我想到时把Tenshi完善得差不多了再说吧,不过我很可能自己来写,毕竟这些东西用自己写要灵活得多,我不想把自己约束到它那一套工具里,再说它那个工具非常简陋,界面很丑,我一看就觉得不是很方便,再说我现在也非吴下阿蒙,我自己也完全可以搞出一个框架,再设计相应的IDE来简化开发,这也是完全可能的,而且对自己的锻炼也更大。
  SDL的字体显示是一个大麻烦,它有一个SDL_ttf的库,不过这个库真是比较奇怪,因为SDL所有的绘图对象都是一个SDL_Surface,因此如果要显示一段文字,也是使用TTF_RenderText_Solid方法来动态生成一个SDL_Surface对象,然后再使用SDL_BlitSurface贴到背景surface上面去,如果我要使用一个记时器,岂不是每次都要生成一个文字surface?或是一次生成很多字符的小surface,然后再使用相关的算法来组合?本来我从网上说SDL_ttf这个库虽然号称支持UTF8,但实际上还是不能显示汉字,如果要显示汉字,还等用专门的点阵字符才行,那太麻烦了,不过我后来使用了TTF_RenderUTF8_Solid这个方面,觉得不是这么回事,汉字,日语假名都能显示,只不过注意要用UTF8的编码保存才行,用Dev-C++的那个IDE不行,不过虽然能显示,但是字体很丑。
  SDL的扩展库除上面的SDL_image和SDL_ttf外,还有一个专门处理声频的SDL_mixer和网络相关的SDL_net,这些东西我现在还没研究到。其实还有一个叫allegro的库,看起来作用跟SDL差不多,也是C/C++的跨平台的游戏编程库,在SourceForge上也有一堆相关的开发包,如果以后再有时间就去研究一下吧。

  评论这张
 
阅读(355)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017