[ZLG-ARM] 如何在Linux上玩游戏(玩游戏,首先需要移植游戏)

[复制链接]
3596|2
 楼主| lpczcy 发表于 2009-6-22 13:56 | 显示全部楼层 |阅读模式
Sam&nbsp;Lantinga&nbsp;是&nbsp;Simple&nbsp;DirectMedia&nbsp;Layer&nbsp;(SDL)&nbsp;库的作者和&nbsp;Loki&nbsp;Entertainment&nbsp;的首席开发人员,他将向您介绍一种将游戏移植到&nbsp;Linux&nbsp;上的优秀工具。SDL&nbsp;是一个跨平台代码移植的理想工具,它支持许多平台,如&nbsp;Linux、Solaris、IRIX、FreeBSD&nbsp;和&nbsp;MacOS,这对于那些认为可以在&nbsp;Linux&nbsp;上开发商业软件的&nbsp;Linux&nbsp;开发者来说是一大进步。他向社区的前辈之一讨教&nbsp;SDL&nbsp;如何使&nbsp;Linux&nbsp;用户享受任何平台上最好的游戏,SDL&nbsp;如何帮助开发者跟上下一代计算机游戏迷的要求。<br /><br />自从&nbsp;Linus&nbsp;首先开发出&nbsp;Linux&nbsp;时开始,到现在&nbsp;Linux&nbsp;成为所有黑客的梦想并且遍及全世界,Linux&nbsp;开发最重要的元素之一就是&nbsp;OS&nbsp;上游戏的质量和可用性。游戏是我们用来娱乐和休闲的。它们可以提高创造力并拓展思路。游戏还可以用来测量操作系统的性能。由于游戏越来越复杂,它们迫使每个子系统逼近极限。每当我装配一个系统时,首先要做的就是装入一个游戏并试玩,以'测试'每一项的性能。<br /><br />Linux&nbsp;上的游戏已经存在了很长时间。从早期的&nbsp;NetTrek,到受高度赞扬的&nbsp;DOOM!&nbsp;和雷神&nbsp;(Quake),人们已经可以在&nbsp;Linux&nbsp;上玩游戏了。但问题是没有足够的游戏。没有哪家大公司为&nbsp;Linux&nbsp;创作能产生轰动效应的游戏。但是,由于该操作系统变得日益流行,这种情况正开始改善。<br /><br />Linux&nbsp;上最早期的游戏使用&nbsp;X11&nbsp;协议。但是对于游戏来说,X11&nbsp;实在太慢了,因为它是针对在网络上透明运行的基于菜单的应用而设计的协议。使用它的游戏通常没有绚丽的画面,而且运行得相当慢。DOOM!&nbsp;是一个值得注意的例外,虽然它使用&nbsp;X11,但是它通过使用&nbsp;MIT&nbsp;共享内存扩展可以使动画更流畅,并提供了逼真的三维效果。还有一些游戏使用&nbsp;SVGA&nbsp;图形库,SVGAlib。我最喜欢的一个老游戏是重力战争&nbsp;(Gravity&nbsp;Wars),它对其模拟的老&nbsp;Amiga&nbsp;游戏&nbsp;Gravity&nbsp;Force&nbsp;做了重大改动。但使用&nbsp;SVGAlib&nbsp;的程序只能适用于少数受支持的显卡。&nbsp;<br /><br /><br /><br />早期&nbsp;X11&nbsp;游戏,争霸&nbsp;(Craft)&nbsp;的图片<br /><br /><br /><br /><br />1.JPG<br /><br />神话&nbsp;2&nbsp;(Myth&nbsp;2)&nbsp;的图片,Loki&nbsp;出品<br /><br /><br /><br />2.JPG<br /><br /><br /><br />今天,游戏开发者有了更多的选择。仍然可以使用&nbsp;X&nbsp;工具箱或全屏&nbsp;API,如&nbsp;SVGAlib&nbsp;或&nbsp;fbcon,来编写游戏,但他们现在还有许多游戏库可以使用。Simple&nbsp;DirectMedia&nbsp;Layer&nbsp;库是&nbsp;Linux&nbsp;上最好的低层游戏开发&nbsp;API&nbsp;之一。<br />&nbsp;<br /> &nbsp;&nbsp;<br />SDL&nbsp;是什么?&nbsp;<br />Simple&nbsp;DirectMedia&nbsp;Layer&nbsp;库,简称&nbsp;SDL,是为数不多的商业游戏开发公司使用的免费软件库之一。它提供跨平台的二维帧缓冲区图形和音频服务,它支持&nbsp;Linux、Win32&nbsp;和&nbsp;BeOS。也不同程度地支持其它平台,包括&nbsp;Solaris、IRIX、FreeBSD&nbsp;和&nbsp;MacOS。除了大量的服务,包括线程、独立于字节存储次序的宏和&nbsp;CD&nbsp;音频,SDL&nbsp;还提供了一个简单的&nbsp;API,它允许您尽可能接近本机硬件。使用&nbsp;SDL&nbsp;有三重优点:稳定、简单和灵活。&nbsp;<br />稳定。如果&nbsp;SDL&nbsp;不向&nbsp;API&nbsp;提供可靠的支持,那么那些爱好者和商业公司就不能使用它。因为使用了&nbsp;SDL,就添加了错误修正并增强了性能,也就加强了&nbsp;API&nbsp;的强健性。就像内核开发是分步进行的,SDL&nbsp;的开发也是分步进行的,其中一部分是可靠稳定的&nbsp;API,其它部分是新功能和构思的沙箱。&nbsp;<br />简单。SDL&nbsp;被设计成一个简单的&nbsp;API,以最少的代码实现您的构思。比如,我最近从&nbsp;Linux&nbsp;演示组&nbsp;Optimum&nbsp;中移植了一些演示程序,我将它们的&nbsp;X11&nbsp;代码替换成&nbsp;SDL&nbsp;代码(请参见下面的列表)。您可以看到,SDL&nbsp;代码非常易于编写和理解。<br /><br />SDL&nbsp;代码<br /><br /><br />代码:<br />int&nbsp;init_x&nbsp;(int&nbsp;X,&nbsp;int&nbsp;Y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;W,&nbsp;int&nbsp;H,&nbsp;int&nbsp;bpp,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*Name)&nbsp;{&nbsp;int&nbsp;i;&nbsp;if&nbsp;(&nbsp;SDL_Init(SDL_INIT_VIDEO)&nbsp;&lt&nbsp;0&nbsp;)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'Erreur&nbsp;:\n'&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Impossible&nbsp;de&nbsp;se&nbsp;connecter&nbsp;au&nbsp;Display\n');&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;&nbsp;&nbsp;}&nbsp;screen&nbsp;=&nbsp;SDL_SetVideoMode(W,&nbsp;H,&nbsp;bpp,&nbsp;SDL_SWSURFACE|SDL_HWPALETTE);&nbsp;if&nbsp;(&nbsp;screen&nbsp;==&nbsp;NULL&nbsp;)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'Erreur&nbsp;:\n'&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Impossible&nbsp;de&nbsp;se&nbsp;connecter&nbsp;au&nbsp;Display\n');&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;&nbsp;&nbsp;}&nbsp;SDL_WM_SetCaption&nbsp;(&nbsp;Name,&nbsp;Name&nbsp;);&nbsp;for&nbsp;(&nbsp;i=SDL_NOEVENT;&nbsp;iformat-&gtBitsPerPixel;&nbsp;width&nbsp;=&nbsp;screen-&gtw;&nbsp;height&nbsp;=&nbsp;screen-&gth;&nbsp;buffer&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)screen-&gtpixels;&nbsp;return&nbsp;(depth);}<br /><br />X11&nbsp;代码<br /><br /><br />代码:<br />&nbsp;int&nbsp;init_x&nbsp;(int&nbsp;X,&nbsp;int&nbsp;Y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;W,&nbsp;int&nbsp;H,&nbsp;int&nbsp;bpp,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*Name)&nbsp;{&nbsp;XPixmapFormatValues&nbsp;*formatList;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatCount;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatOk;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanlineLength;&nbsp;XGCValues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcVal;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcMask;&nbsp;dis&nbsp;&nbsp;&nbsp;=&nbsp;XOpenDisplay&nbsp;(&nbsp;NULL&nbsp;);&nbsp;if&nbsp;(&nbsp;dis&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'Error&nbsp;:\n'&nbsp;);&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Cannot&nbsp;connect&nbsp;to&nbsp;Display.\n');&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;}&nbsp;screen&nbsp;=&nbsp;DefaultScreen&nbsp;(&nbsp;dis&nbsp;);&nbsp;depth&nbsp;=&nbsp;DefaultDepth&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;width&nbsp;=&nbsp;DisplayWidth&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;height&nbsp;=&nbsp;DisplayHeight&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;winRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;DefaultRootWindow&nbsp;(&nbsp;dis&nbsp;);&nbsp;winAttr.border_pixel&nbsp;&nbsp;&nbsp;=&nbsp;BlackPixel&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;winAttr.background_pixel&nbsp;=&nbsp;BlackPixel&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;winMask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;CWBackPixel&nbsp;|&nbsp;CWBorderPixel;&nbsp;&nbsp;formatList&nbsp;=&nbsp;XListPixmapFormats(&nbsp;dis,&nbsp;&formatCount);&nbsp;if&nbsp;(formatList&nbsp;==&nbsp;NULL){&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Cannot&nbsp;get&nbsp;pixmap&nbsp;list\n');&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;}&nbsp;formatOk=-1;&nbsp;for&nbsp;(i=0;&nbsp;ibytes_per_line*xim-&gtheight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPC_CREAT|0777);&nbsp;xim-&gtdata&nbsp;=&nbsp;SHMInfo.shmaddr&nbsp;=&nbsp;(char&nbsp;*)shmat(SHMInfo.shmid,&nbsp;0,&nbsp;0);&nbsp;SHMInfo.readOnly&nbsp;=&nbsp;False;&nbsp;XShmAttach(dis,&nbsp;&SHMInfo);&nbsp;XSync(dis,&nbsp;False);&nbsp;buffer=(unsigned&nbsp;char&nbsp;*)xim-&gtdata;#else&nbsp;buffer&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)calloc(W*H,&nbsp;pixmapFormat.bits_per_pixel/8);&nbsp;&nbsp;xim&nbsp;=&nbsp;XCreateImage&nbsp;(&nbsp;dis&nbsp;,&nbsp;CopyFromParent&nbsp;,&nbsp;depth&nbsp;,&nbsp;ZPixmap&nbsp;,&nbsp;0&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(char&nbsp;*)&nbsp;buffer&nbsp;,&nbsp;W&nbsp;,&nbsp;H&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixmapFormat.scanline_pad,&nbsp;scanlineLength);&nbsp;if&nbsp;(xim&nbsp;==&nbsp;NULL){&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;'&nbsp;Couldnt&nbsp;create&nbsp;Ximage..\n');&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;}#endif&nbsp;gcVal.foreground&nbsp;=&nbsp;0;&nbsp;gcVal.background&nbsp;=&nbsp;0;&nbsp;gcMask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;GCForeground&nbsp;|&nbsp;GCBackground;&nbsp;gc&nbsp;=&nbsp;XCreateGC&nbsp;(&nbsp;dis&nbsp;,&nbsp;win&nbsp;,&nbsp;gcMask&nbsp;,&nbsp;&gcVal&nbsp;);&nbsp;if&nbsp;(depth==24)&nbsp;&nbsp;&nbsp;depth&nbsp;=&nbsp;pixmapFormat.bits_per_pixel;&nbsp;return&nbsp;(depth);}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;init_x&nbsp;(int&nbsp;X,&nbsp;int&nbsp;Y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;W,&nbsp;int&nbsp;H,&nbsp;int&nbsp;bpp,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*Name)&nbsp;{&nbsp;XPixmapFormatValues&nbsp;*formatList;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatCount;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formatOk;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanlineLength;&nbsp;XGCValues&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcVal;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcMask;&nbsp;dis&nbsp;&nbsp;&nbsp;=&nbsp;XOpenDisplay&nbsp;(&nbsp;NULL&nbsp;);&nbsp;if&nbsp;(&nbsp;dis&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'Error&nbsp;:\n'&nbsp;);&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Cannot&nbsp;connect&nbsp;to&nbsp;Display.\n');&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;}&nbsp;screen&nbsp;=&nbsp;DefaultScreen&nbsp;(&nbsp;dis&nbsp;);&nbsp;depth&nbsp;=&nbsp;DefaultDepth&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;width&nbsp;=&nbsp;DisplayWidth&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;height&nbsp;=&nbsp;DisplayHeight&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;&nbsp;winRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;DefaultRootWindow&nbsp;(&nbsp;dis&nbsp;);&nbsp;winAttr.border_pixel&nbsp;&nbsp;&nbsp;=&nbsp;BlackPixel&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;winAttr.background_pixel&nbsp;=&nbsp;BlackPixel&nbsp;(&nbsp;dis&nbsp;,&nbsp;screen&nbsp;);&nbsp;winMask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;CWBackPixel&nbsp;|&nbsp;CWBorderPixel;&nbsp;&nbsp;formatList&nbsp;=&nbsp;XListPixmapFormats(&nbsp;dis,&nbsp;&formatCount);&nbsp;if&nbsp;(formatList&nbsp;==&nbsp;NULL){&nbsp;&nbsp;&nbsp;fprintf&nbsp;(&nbsp;stderr&nbsp;,&nbsp;'&nbsp;Cannot&nbsp;get&nbsp;pixmap&nbsp;list\n');&nbsp;&nbsp;&nbsp;exit&nbsp;(1);&nbsp;}&nbsp;formatOk=-1;&nbsp;for&nbsp;(i=0;&nbsp;ibytes_per_line*xim-&gtheight,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPC_CREAT|0777);&nbsp;xim-&gtdata&nbsp;=&nbsp;SHMInfo.shmaddr&nbsp;=&nbsp;(char&nbsp;*)shmat(SHMInfo.shmid,&nbsp;0,&nbsp;0);&nbsp;SHMInfo.readOnly&nbsp;=&nbsp;False;&nbsp;XShmAttach(dis,&nbsp;&SHMInfo);&nbsp;XSync(dis,&nbsp;False);&nbsp;buffer=(unsigned&nbsp;char&nbsp;*)xim-&gtdata;#else&nbsp;buffer&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)calloc(W*H,&nbsp;pixmapFormat.bits_per_pixel/8);&nbsp;&nbsp;xim&nbsp;=&nbsp;XCreateImage&nbsp;(&nbsp;dis&nbsp;,&nbsp;CopyFromParent&nbsp;,&nbsp;depth&nbsp;,&nbsp;ZPixmap&nbsp;,&nbsp;0&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(char&nbsp;*)&nbsp;buffer&nbsp;,&nbsp;W&nbsp;,&nbsp;H&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixmapFormat.scanline_pad,&nbsp;scanlineLength);&nbsp;if&nbsp;(xim&nbsp;==&nbsp;NULL){&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;'&nbsp;Couldnt&nbsp;create&nbsp;Ximage..\n');&nbsp;&nbsp;&nbsp;exit(-1);&nbsp;}#endif&nbsp;gcVal.foreground&nbsp;=&nbsp;0;&nbsp;gcVal.background&nbsp;=&nbsp;0;&nbsp;gcMask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;GCForeground&nbsp;|&nbsp;GCBackground;&nbsp;gc&nbsp;=&nbsp;XCreateGC&nbsp;(&nbsp;dis&nbsp;,&nbsp;win&nbsp;,&nbsp;gcMask&nbsp;,&nbsp;&gcVal&nbsp;);&nbsp;if&nbsp;(depth==24)&nbsp;&nbsp;&nbsp;depth&nbsp;=&nbsp;pixmapFormat.bits_per_pixel;&nbsp;return&nbsp;(depth);}<br /><br />灵活。返回到上面的&nbsp;Optimum&nbsp;演示代码示例,只要移植到&nbsp;SDL,并确定一些数据假设,那么根本不必改动代码,演示就可以在&nbsp;Win32、BeOS&nbsp;和&nbsp;Linux&nbsp;控制台上运行了。灵活性的另一方面体现在尽管代码完全是跨平台的,但不会把您和底层实现隔开。SDL&nbsp;提供了函数&nbsp;SDL_GetWMInfo(),该函数可以让您访问底层驱动程序的专用窗口信息。Loki&nbsp;Entertainment&nbsp;Software&nbsp;广泛使用这一技术为它们的游戏智能窗口管理器交互。<br /><br />Optimum&nbsp;演示版的屏幕快照&nbsp;<br /><br /><br /><br />3.JPG<br /><br />4.JPG<br /><br />5.JPG<br /><br /><br /><br />文明:力量的呼唤&nbsp;(Civilization:&nbsp;Call&nbsp;To&nbsp;Power)&nbsp;的图片&nbsp;&nbsp;<br /><br /><br /><br /><br />6.JPG[/center天旋地]转&nbsp;2&nbsp;(Descent&nbsp;2)&nbsp;的图片<br /><br /><br /><br /><br />7.JPG<br /><br />SDL&nbsp;的起源&nbsp;<br /><br />SDL&nbsp;在两年前问世,当时我正致力于从&nbsp;Macintosh&nbsp;仿真器&nbsp;Executor&nbsp;到&nbsp;Win32&nbsp;的移植工作。我注意到同一个功能在几个平台上基本上都是以相同的方式实现的。所有目标都要求可以访问屏幕、映射鼠标和键盘输入,以及播放声音。我想:为什么不写一个跨平台的库来提供这些许多人会用到的基本服务?应用程序开发者只需要写一个&nbsp;API,这样就大大简化了他们的工作,还可以使他们的代码可以迅速在多个平台上运行,以吸引尽可能多的观众。我开始着手进行,一年多以后,第一个稳定的&nbsp;SDL&nbsp;发行版诞生了。&nbsp;<br />创建&nbsp;SDL&nbsp;的第一步就是要标识所需的功能。根据分析&nbsp;Executor&nbsp;和以往的移植经验,我已经有了一个好的想法。下一步就是构建在&nbsp;Win32&nbsp;和&nbsp;Linux&nbsp;上运行的有效原型。我知道对于&nbsp;API,最大的考验就是在实际的应用程序下工作,因此我所做的第一件事就是使用它来完成从&nbsp;Executor&nbsp;到&nbsp;Win32&nbsp;的移植。在这段时间里,我不断添加&nbsp;API&nbsp;的主体,并将它移植到&nbsp;BeOS。然后,采用最新得到的&nbsp;DOOM!&nbsp;源码,在短短三天时间内,就使它可以在所有三个受支持的平台上顺畅地运行。<br /><br />一年以后,我现在使用它来将世界上最好的一些游戏移植到世界上最受欢迎的操作系统&nbsp;Linux&nbsp;上。虽然我就职于商业公司,但这个库本身是免费的,并且它是开放源码概念力量的体现。<br /><br />相关的库&nbsp;<br />SDL&nbsp;是一个可用的大型工具集。作为一个视频&nbsp;API,SDL&nbsp;提供了一个简单的帧缓冲区,适用于定制位图例程或特殊效果。使用&nbsp;SDL&nbsp;可以完成一个完整的具有特殊演示效果和视觉享受的档案文件,但您也可以试一下&nbsp;GGI&nbsp;和&nbsp;PTC&nbsp;库,它们在游戏和演示界也是非常流行的。作为声音&nbsp;API,SDL&nbsp;支持自动音频转换和透明&nbsp;ESound&nbsp;支持。在示例档案中,甚至还有一个完整的样本混音实现,但您还可以试用一下&nbsp;ALSA&nbsp;和&nbsp;GSI&nbsp;库。对于三维图像生成,使用&nbsp;Mesa&nbsp;绝对是好办法。作为窗口化工具箱,GTk&nbsp;非常流行。Linux&nbsp;中的自由,其中一部分是选择的自由,贡献的自由。它是&nbsp;Linux&nbsp;理想和自由的证明。&nbsp;向&nbsp;SDL&nbsp;贡献&nbsp;<br />SDL&nbsp;按&nbsp;GNU&nbsp;Lesser&nbsp;General&nbsp;Public&nbsp;License&nbsp;提供,这意味着免费软件和商业程序都可以使用它,并且对源代码的更改加到公共源码之后,每个人都可以共享这个更改。欢迎向&nbsp;SDL&nbsp;贡献,将补丁发送给我以加到&nbsp;SDL&nbsp;的开发版本中。为开发者提供了一个邮件列表,可以通过将含有&nbsp;'subscribe&nbsp;sdl'&nbsp;字样的邮件发送到&nbsp;majordomo@lokigames.com&nbsp;来订阅该邮件列表。该邮件列表镜像为&nbsp;news://news.lokigames.com/loki.open-source.sdl&nbsp;上的一个新闻组。加入这个邮件列表以获取关于使用&nbsp;SDL&nbsp;的提示,错误修正的最新公告和新的功能,及使用&nbsp;SDL&nbsp;的项目的预览版本。&nbsp;SDL&nbsp;的未来&nbsp;<br />以下是下年度中&nbsp;SDL&nbsp;某些新令人振奋的发展方向:&nbsp;<br />游戏控制杆支持。Linux&nbsp;的最新内核中构建了一个非常棒的游戏控制杆&nbsp;API。我打算将该支持集成到&nbsp;SDL&nbsp;事件模型中,它允许任意事件过滤、回调和异步事件分派。Garrett&nbsp;Banuk&nbsp;已经编写了最始实现,它将添加到最新的&nbsp;SDL&nbsp;开发分支。&nbsp;<br />Linux&nbsp;帧缓冲区控制台支持。最新的&nbsp;Linux&nbsp;内核以帧缓冲区驱动程序的形式包含了本机图形的控制台支持,其创作者是&nbsp;Geert&nbsp;Uytterhoeven。SDL&nbsp;有一个初始驱动程序具有本机控制台键盘和&nbsp;PS/2&nbsp;鼠标驱动程序,它可以执行该项支持。&nbsp;<br />SciTech&nbsp;MGL&nbsp;支持。SciTech&nbsp;有一个非常棒的用于&nbsp;Win32、DOS、Linux、OS/2&nbsp;和&nbsp;QNX&nbsp;的图形库。但它是一个商业库,而&nbsp;VESA&nbsp;控制台驱动程序对于&nbsp;Linux&nbsp;是免费的。因此,可以支持&nbsp;SDL&nbsp;中的&nbsp;VESA&nbsp;控制台驱动程序。&nbsp;<br />Mesa&nbsp;集成为一个&nbsp;GLX&nbsp;层。OpenGL&nbsp;绝对是将来在&nbsp;Linux&nbsp;上开发三维游戏的方法。但是,GLX&nbsp;API&nbsp;处理事件的方法不如&nbsp;SDL&nbsp;那样灵活。有人要求将类似于&nbsp;GLX&nbsp;的扩展集成到&nbsp;SDL,以将它用作基于&nbsp;GL&nbsp;的游戏的输入接口。&nbsp;<br />重新设计体系结构以允许多重显示和多重输入。当前的体系结构将&nbsp;SDL&nbsp;函数以存根模块编译,并在运行时动态装入低级驱动程序。这种跨平台执行方式将导致一个难于使用的构建过程,并产生一个复杂的头文件。对我来说,最要紧的一件事就是重新设计构建过程,这样所有驱动程序都可以编译到一个库中,然后在运行时动态选择。这样做的好处就是可以同时有多个活动的显示和输入方法。想像一下游戏同时在控制台和远程&nbsp;X11&nbsp;显示器上运行!&nbsp;<br />更多游戏!SDL&nbsp;的改进将使越来越多的人使用这个库,而越来越多的游戏将会出现在&nbsp;Linux&nbsp;上。在&nbsp;http://www.devolution.com/~slouken/SDL/intro/toc.html&nbsp;上可以找到&nbsp;SDL&nbsp;API&nbsp;的非常好的介绍,以及使用&nbsp;SDL&nbsp;API&nbsp;的项目列表。&nbsp;<br />能够涉足&nbsp;Linux&nbsp;游戏,我感到非常激动,我希望能够继续工作为&nbsp;Linux&nbsp;世界带来欢乐,因为&nbsp;Linux&nbsp;待我太好了。正如他们所说的,企鹅也喜欢寻开心。<br /><br />我很快会写一篇后续**,它将带给您有关如何使用&nbsp;SDL&nbsp;写游戏的教程。<br /><br />关于作者&nbsp;<br />Sam&nbsp;Lantinga&nbsp;是&nbsp;Simple&nbsp;DirectMedia&nbsp;Layer&nbsp;库的作者,现在是&nbsp;Loki&nbsp;Entertainment&nbsp;Software&nbsp;的首席程序员,这家公司致力于生产最畅销的&nbsp;Linux&nbsp;游戏。他与&nbsp;Linux&nbsp;和游戏打交道是从&nbsp;1995&nbsp;年开始的,从事各种&nbsp;DOOM!&nbsp;工具移植,以及将&nbsp;Macintosh&nbsp;游戏&nbsp;Maelstrom&nbsp;移植到&nbsp;Linux。现在,他正在移植铁路大亨&nbsp;2&nbsp;(Railroad&nbsp;Tycoon&nbsp;II),这是个大量使用&nbsp;SDL&nbsp;技术的游戏,很快将由&nbsp;Loki&nbsp;Entertainment&nbsp;Software&nbsp;出品。<br />&nbsp;<br /> &nbsp;&nbsp;<br />下面是引用jiuzhuaxiong的安装编译的过程,大家可以参考参考:<br /><br />由于需要希望能够把SDL交叉编译到我的AT91&nbsp;armlinux平台上,经过一番折腾最后成功在AT91SAM9261EK上运行了SDL步骤如下:<br /><br />1.下载SDL-1.2.13.tar.gz&nbsp;<br /><br />2.解压缩<br /><br />3.运行配置<br />&nbsp;&nbsp;&nbsp;&nbsp;./configure&nbsp;--prefix=/home/xinlian/rootfs/home/sdl&nbsp;&nbsp;--disable-video-qtopia&nbsp;&nbsp;--disable-video-dummy&nbsp;&nbsp;--disable-video-fbcon&nbsp;&nbsp;--disable-video-dga&nbsp;&nbsp;--disable-arts&nbsp;&nbsp;--disable-esd&nbsp;&nbsp;--disable-alsa&nbsp;&nbsp;--disable-cdrom&nbsp;&nbsp;--disable-video-x11&nbsp;&nbsp;--disable-nasm&nbsp;&nbsp;--target=arm-linux&nbsp;&nbsp;--host=arm-linux&nbsp;&nbsp;--enable-video-fbcon<br /><br />配置中指定使用帧缓冲设备,使用arm-linux-gcc交叉编译,编译后的库和头文件安装路径是/home/xinlian/rootfs/home/sdl<br /><br />4.&nbsp;运行make进行编译<br /><br />5.&nbsp;测试,编译demo项目软件<br /><br />进入test目录运行configue<br /><br />修改Makefile的编译选项如下:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;arm-linux-gcc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFLAGS&nbsp;&nbsp;=&nbsp;-g&nbsp;-O2&nbsp;-I/home/xinlian/rootfs/home/sdl/include/SDL&nbsp;-D_GNU_SOURCE=1&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D_REENTRANT&nbsp;-DHAVE_OPENGL&nbsp;&nbsp;&nbsp;LIBS&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;-L/home/xinlian/rootfs/home/sdl/lib&nbsp;-Wl,-rpath,/usr/local/lib&nbsp;-lSDL&nbsp;-lpthread<br /><br />6.&nbsp;拷贝demo到板子运行ok<br /><br />7.&nbsp;编译时还遇到一个PAGE_SIZE没有定义的错误提示,但是在内核的头文件里有定义,只是sdl是应用没有办法引用,我是直接&nbsp;写作&nbsp;0x1000。<br />&nbsp;<br /> &nbsp;&nbsp;<br />
arminfo 发表于 2009-6-22 14:05 | 显示全部楼层

很新鲜的帖子

  
miclinux 发表于 2009-6-24 13:14 | 显示全部楼层

图片怎么看不到呢

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

77

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部