C 跨平台游戏研发之ClanLib SDK
2008-02-23 05:24:07来源:互联网 阅读 ()
ClanLib是个主要针对游戏研发者的跨平台C 框架。尽管API主要为游戏研发设计,您照样能够容易地使用ClanLib来研发一个科学的3D可视化工具或多媒体应用程式(例如Gecko多媒体系统)。
ClanLib拥有各种API-2D和3D图像,声音,网络,I/O,输入,GUI连同资源管理。他还提供透明的OpenGL支持,因此您能够使用本机OpenGL命令而让ClanLib处理依赖于操作系统的窗口管理和其他一切事情。ClanLib通过DirectX或简单的Direct Media Layer(一平台单独的多媒体库)生成2D图像。ClanLib游戏主页上列举了约50多个研发很成功的游戏,包括以2D和3D形式完成的难题、策略连同射手类游戏。例如,Asteroid Arena(见图1)使用了ClanLib和OpenGL技术,实现了胜人一筹的经典街机游戏。
图1.Asteroid Arena屏幕快照 |
ClanLib能够工作在Windows,Linux和MacOS操作系统之上,并且提供源码级的zip或tar文档支持。Windows研发者能够使用微软Visual Studio,Borland C 或MinGW(小型GNU for Windows)编译器和环境。第三方的对于Ruby和Perl语言的绑定支持也是可用的。可选的特效程式包括一个Lua插件(流行的小脚本编程语言)和FreeType(一个免费的TrueType字体库)。
二、 ClanLib特征集
在具体使用API之前,让我们看一下ClanLib的主要特征:
·基本跨平台运行时刻库(GUI,多线程,文档I/O,等等)
·基于模板的C 信号/槽库(类型安全的回调/代理)
·综合的资源管理
·声音混合器支持。WAV文档,Ogg Vorbis,连同由MikMod库(MOD,S3M,XM,等等)支持的任何类型文档
·文档对象模型(DOM)XML分析器支持
·高级2D图像API,支持OpenGL,DirectX和SDL作为着色目标
·高性能的批量着色引擎,当用OpenGL着色2D时
·2D碰撞检测
·2D精灵动画支持
·高度可定制的GUI框架
·从低级到高级的网络库接口
三、 ClanLib基本的游戏模型
现在,让我们仔细分析一下ClanLib API模型。我发现最好的教程是个完全自解释的示例程式。具体地,让我们分析一下Luke Worth的盒子游戏,这是个有两个玩家的纸和铅笔游戏(见图2)。这个盒子游戏包含一些格子点,在任意两点间玩家都能够画线。谁用最后一条线画成一个封装的矩形,谁就得一分,并进入到下一轮中。
图2.一个进行中的盒子游戏,得分情况是蓝8/红3 |
我特意使程式的main函数尽可能简短,这样我们可能集中注意力于高亮处的"游戏循环":
1 #include <iostream> 2 #include <ClanLib/application.h> 3 #include <ClanLib/core.h> 4 #include <ClanLib/display.h> 5 #include <ClanLib/gl.h> 6 #include <ClanLib/sound.h> 7 #include <ClanLib/vorbis.h> 8 9 const int boardsize = 6, spacing = 50, border = 20; 10 const int numsquares = int(pow(float(boardsize - 1), 2)); 11 12 enum coloursquare { off, blue, red }; 13 struct cursor { 14 int x, y; 15 bool vert; 16 }; 17 18 class Boxes: public CL_ClanApplication { 19 bool ver[boardsize][boardsize - 1]; 20 bool hor[boardsize - 1][boardsize]; 21 coloursquare squares[boardsize - 1][boardsize - 1]; 22 bool redturn; 23 bool fullup; 24 cursor curs; 25 26 void inputHandler(const CL_InputEvent &i); 27 bool findsquares(void); 28 inline int numaroundsquare(int x, int y); 29 void init(); 30 void drawBoard(); 31 void endOfGame(); 32 33 public: 34 virtual int Boxes::main(int, char **); 35 } app; 36 37 using namespace std; 40 41 int Boxes::main(int, char **) 42 { 43 int winsize = spacing * (boardsize - 1) border * 2; 44 try { 45 Boxes::init(); 46 while (!CL_Keyboard::get_keycode(CL_KEY_ESCAPE)) { 47 Boxes::drawBoard(); 48 if (fullup) break; 49 CL_System::keep_alive(20); 50 } 51 Boxes::endOfGame(); 52 53 CL_SetupVorbis::deinit(); 54 CL_SetupSound::deinit(); 55 CL_SetupGL::deinit(); 56 CL_SetupDisplay::deinit(); 57 CL_SetupCore::deinit(); 58 } 59 catch (CL_Error err) { 60 std::cout << "Exception caught: "<< err.message.c_str() << std::endl; 61 } 62 63 return 0; 64 } |
关于这个应用程式,应注意的第一事情是main()函数(见行41)并不是个最顶层的函数,而是嵌入到一个从CL_ClanApplication派生的对象中。该对象封装了不少难以避免的平台依赖性-这可能包含一个传统的::main()实现(例如在Win32应用程式中必须使用WinMain())。
而且还应注意,事实上任何的可执行的代码(行43-58)被封装在一个try{}/catch{}异常处理器块中。假如需要的话,ClanLib将引发异常,您能够重启一游戏,等等。基本上,任何的游戏逻辑包含在init(),drawBoard(),endOfGame()和inputHandler()这几个方法中。假如board不再移动(fullup==true),则退出游戏循环(行48)。CL_System::keep_alive()更新任何的输入和系统事件(象关闭窗口或移动他)。这在老式的Win16 API ::Yield()或Linux上的sleep()中将会释放CPU周期。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C 箴言:接口继承和实现继承
下一篇: 学生管理系统框架
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash