2007-3-6 ---3-18 工作日志
Kevin Lynx
到3月7号左右,完成了 Space Demon 的关卡编辑器。该编辑器使用Qt开发GUI界面,也算是作为复习Qt的一个练习。关于详细技术信息,该编辑器主要使用了 Qt 商业版中的Canvas模块,使用QCanvas类管理各种QCanvasItem,QCanvasItem就包括各种文字信息,基本图元信息,以及图片信息(QCanvasSprite),然后再用QCanvasView显示出来。基于Canvas模块的方便性,对于图片选择,移动之类的问题很容易处理。不过对于这种非游戏循环的渲染模型,我还是不怎么习惯。
关于Space Demon最新的版本,可以从这里DOWN到,包括关卡编辑器:
http://blog.blogwhy.com/kevinlynx/upload/spacedemon%20v1.1.part1.rar
http://blog.blogwhy.com/kevinlynx/upload/spacedemon%20v1.1.part2.rar
http://blog.blogwhy.com/kevinlynx/upload/spacedemon%20v1.1.part3.rar
http://blog.blogwhy.com/kevinlynx/upload/patch%20for%20space%20demon.rar
草草完成了 Space Demon后,认识到的第一个问题是我对于游戏中的人工智能了解不够。虽然这只是个飞机射击游戏,但是要把其中的敌机做到商业级的水平,其AI得首先达到商业级的水准!而我显然对此把握不够。于是,在完成了Space Demon后,我开始阅读
<Ai technique for game programming> 这本书。
本书基本上可以分为两部分:遗传算法和神经网络。
我读的是英文原版,初步感觉其语言障碍不大,相对于其他英文书来说行文要容易理解些。作者把各种看似很复杂的算法写的很简单(我也不知道怎么回事,确实觉得很容易理解),再也不是各种复杂的数学理论,强烈推荐这本书。
到11号左右我逛图书馆,结果被我看到了这本书的中文版!
然后当我把第一部分遗传算法看完后,我正决定做些练习。对于计算机,如果不把理论用于实践,会很容易忘掉。可是我发现我无从下手,别告诉我去做题,那是中国教育制度下产生的书呆子干的事情。后部分的神经网络打算暂时放一下下,大量地吸收太多理论太不容易消化了。
然后这个时候开始感冒,一感冒头就发昏,害的我在几天时间里都不能正常学习。感冒期间在网上瞎逛,看到一个简单的GUI库。这个库正是我从去年就开始构思的一个GUI库。
对于GUI库,我一直想设计个跨引擎的库。意思是说,我想把这个库一切与具体平台相关的东西隔离开来,以使得该库可以被结合进其他很多引擎使用。后来我思考了下GUI库的一些与平台相关的特征,这些特征包括:
一个渲染器,该渲染器需要负责渲染图片文字之类的信息(受启发于Popcap Framework)
一个输入管理器,它可以处理各种鼠标和键盘输入。
一个文字对象,它用来负责显示文字信息等,因为按钮标签之类的控件需要文字信息。
一些其他辅助对象,例如能表示图片的对象。
然后很神奇的是,我发现我找到的这个GUI库正是这样做的!这就是Guichan。它采用了一种adapter模式,很容易地把GUI库与实际的平台(引擎等)分离开来。如果要让这个库与某个具体的平台(引擎)结合使用,就需要写一些adapter类来改装平台的API接口,以让GUI库可以使用。
在大致观察了一下Guichan的机制后,我就决定把Guichan结合进HGE引擎。因为我觉得HGE引擎确实是个很不错的2D引擎,但是其GUI库不行,不但很简单,而且其框架也不好。HGE社区很多人都有自己的一套扩展HGE GUI控件。我自己就有我自己写的三状态按纽,模态对话框等。如果能把Guichan结合进HGE,HGE就会有一个很适合它的GUI库,并且有强大的社区支持。有些人把CEGUI结合进了HGE,但是我个人觉得CEGUI并不适合HGE,因为CEGUI相对于HGE来说过于庞大,并且其API也很复杂。相对于HGE简单的接口而言,CEGUI显得主次颠倒了。所以,结合Guichan 进HGE是很有意义的。
然后我开始着手这项工作。第一个版本做的很顺利,毕竟我只需要组织HGE的一些接口到另一种Guichan识别的接口即可。第一个版本后,我把它提交给了Guichan的作者。然后这个瑞典老外逐一地数出这个程序的所有BUG!让我非常吃惊!并且要求我如果要把这个HGE版本真正地结合进Guichan,还需要我把代码的注释改成doxygen识别的形式,这样利于后面产生文档。
于是我继续修改这个版本,后来连续提交了几次,那个瑞典老外总能找出我的毛病。尤其是后期,他居然能告诉我程序里哪里多了一个象素哪里少了一个象素。然后我继续改,这个时候我发现HGE的那些绘制图元的函数是存在错误的,尤其是那个画线函数,老是定位不准确,后来我只好使用一些偏门技巧来避免那些坐标错位。这中间的过程有些难过,我差点放弃。
后来我为了对比,我还问那个老外要了一个Guichan的SDL DEMO版本。最后我还真改出了一个一模一样的HGE版本,算是终于完成了。
然后那个老外决定把我这个结合进Guichan放到官方网站上。可是在他拿到代码时,他又让我把代码风格改成他们要求的风格!狂汗!对于他们的代码风格我真的觉得还没我的风格好。不过没办法,他们是老大啊,要想让我这几天的工作有意义,我只能继续做下去。目前还正在审核代码风格中。
之前把HGE的粒子系统移植进了Popcap Framework,放到了Popcap framework 的论坛上。倒也得到了一些人的赞赏。现在有个人(还是Popcap上的牛人)正在开发另一个HGE粒子系统编辑器,更为强大。今天他给我发论坛消息告诉我他在发布这个编辑器时会在credits里面加入我的名字(哈哈,应该的)。
其他方面,我开始学C++的GP编程。我看的书是<c++ template>英文原版,感觉行文风格比<ai technique for game programming>难一些。到目前为止我才看到第8章。而前7章都是些基础知识----但是还是有些在一般的C++书上找不到的模板方面的信息。初步感觉是这些理论还是没多大实用价值,并且很多特征存在编译器依赖性,意思是说在这个编译器上可以通过的技巧,在另一个编译器上就会被认为是语法错误。这样的纯理论研究让我开始觉得这是否存在继续学习下去的意义了。
在网上买了<inside the c++ object model>英文版,感觉行文风格比前两本书更困难了,加上其本身技术信息就很困难,看来有得啃了。
今后一段时间打算把JAVA编程和WinCE编程纳入学习计划,真的是时候分一部分时间给这两个东西了。工作室那边实在抽不出时间,有点对不起美工兄弟了。