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周期。
66 void Boxes::init()
67 {
68 CL_SetupCore::init();
69 CL_SetupDisplay::init();
70 CL_SetupGL::init();
71 CL_SetupSound::init();
72 CL_SetupVorbis::init();
73
74 CL_DisplayWindow window("Boxes", winsize, winsize);
75 CL_SoundOutput output(44100); //选择44Khz采样
76
77 CL_Surface *cursimg = new CL_Surface("cursor.tga");
78 cursimg->set_alignment(origin_center);
79 CL_Surface *redpict = new CL_Surface("handtransp.tga");
80 redpict->set_alignment(origin_center);
81 redpict->set_scale(float(spacing)/float(redpict->get_width()),
本文来自数据大全网 82 float(spacing)/float(redpict->get_height()));
83 CL_Surface *bluepict = new CL_Surface("circlehandtransp.tga");
84 bluepict->set_alignment(origin_center);
85 bluepict->set_scale(float(spacing) / float(bluepict->get_width()),
86 float(spacing) / float(bluepict->get_height()));
87
这里的init()方法完成大部分的游戏初始化工作。当然,在此需要ClanLib子系统以用于处理图形和声音(行68-72),然后构建一个窗口用于显示所有的图形(行75)。
CL_Surface(行77-87)是一个2D位图类,用于绘制光标,用蓝色填充的方格和用红色填充的方格。
TGA文件是一种位图文件格式。ClanLib有一个集成的PNG库,因此它可以读写最流行的位图文件格式化。
下一步,你必须把板子初始化成一个空状态(行87-103)并执行类似的其它的清理工作以实现新的游戏计数器。
89
90 redturn = true;
91 curs.vert = false;
92 fullup = false;
93 curs.x = curs.y = 1;
94
95 srand(CL_System::get_time()); //启动随机数字生成器
96
97 for (int x = 0; x < boardsize - 1; x++) {
98 for (int y = 0; y < boardsize; y++)
99 hor[x][y] = ver[y][x] = false;
100
101 for (int y = 0; y < boardsize - 1; y++)
102 squares[x][y] = off;
103
104
本文来自数据大全网
ClanLib的一个特别突出的方面是它避开传统型应用于许多框架中的回调模型,而引入了"信号和槽"模型。这种模型广泛应用于Boost C++库中,并在QT中得到实现。信号代表具有多个目标的回调函数,又在一些类似的系统中称作"出版者"或者"事件"。信号被连接到一些槽上,它们是回调函数接收器(也称作事件目标或者订户),当信号被"发出"时即被调用。信号具有类型安全的优点,它们避开了在传统型的框架中的不可避免的cast操作。 【网站首页】 【关于我们】 【合作说明】 【广告指南】 【联系方式】 【版权声明】 【网站地图】 【收藏本站】 【设为首页】
数据大全网、数据联盟网:www.sql163.com E-Mail:oksql@126.com 备案号:皖ICP备06001263号
本站所有资源 均是网上搜集或私下交流学习之用,只供学习,不得用于商业,如有侵犯版权请联系告知,来信请务必附上版权申明及相关证据,我们将第一时间删除!
数据大全网、数据联盟网、共享数据、分享技术!我们的宗旨:拼搏进取、用心服务、打造品牌!官方QQ群:61748178
Powered by SQL163.COM © 2004-2009 数据大全 版权所有 推荐使用分辨率1024*768
数据统计中!!