0.设想

       自己写的小游戏多了,早想设计个专属的游戏引擎方便以后开发。而且有了一点点MVC架构的概念,就开始设计自己的Game Engine了(大家可以认为游戏引擎是个很高级的东西,事实上在网络能找到的都是比较实用的,有自己的算法用来进行渲染;但其实也有能看懂的,我看过一本Windows游戏设计的书就只是把Win32创建窗口等API封装起来而已,这次我能写的也不过是用interface把游戏状态和游戏流程封装一下罢了)


1.实现

        于是早上花了5个小时来设计这个,首先是Model、View、Controller三个interface放在三个不同的package(忘了说了,我用的是Java,不过这个引擎设计是希望把游戏逻辑和界面分开,进而实现跨语言)。然后在Model包加了一个utility包,提供诸如Point等常用工具类。

       然后为三个MVC接口设计游戏状态游戏流程(这里有个插曲,因为每个model都有自己的状态,例如是否显示,但当我企图在Controller中修改这个状态时,才发现interface的属性是final的。于是我愚蠢地把它们都改为abstract class,但是想想觉得是有点不太合适。后来写到View时要继承JFrame就不管用了,于是傻傻地又改回interface,只在里面定义些static的状态常量)

       第三步当然是要找个例子来试试,于是写了个弹板游戏。讲到这里,不知道大家对这个GameEngine有木有了解,实际上它并没有定义太多东西,主要就三个interface,里面有一些STATE_RUN等状态属性和run()等必须重写的纯虚函数,主要是为了规范编码方式采用MVC架构。然后自己新建几个Ball类、Stick类、Brick类和GameView类去实现那些接口,不同作用的class分别放到三个不同的包。

       最后是实现整个游戏。这样就相当于用到了这个Game Engine来开发,同时为它补充必要的接口属性。


2.问题

       写代码的时候发现了不少问题,这里也说一说供大家讨论讨论:首先是代码没有实现完全的解耦,有些类要用到其他类的东西就很牵强地new一个对象;其次就是对象的问题,因为我们写的都是class,那实际上用到的object该放在哪呢,懵懂的我是在Model里用Singleton设计模式新建个GameData类来解决的;然后是界面类功能过多,因为要用Swing来绘图,所以什么KeyListener和Timer要用到的ActionListener都不能独立成类,毕竟还要用到Model里的数据来绘图啊。


3.总结

        用了整个早上来写这个,现在发现,没什么用啊。首先因为它不能很好的完成解耦的工作,用它来写游戏还是那么复杂;其次因为其代码量就很少(所以也就不好意思把源码发出来,不过我是挺Open Source的,可以的话互相学习一下),实现的作用极其有限;最后是因为工具类太少,而且真正要用起来也不容易。不过说真的,我个人收获还是挺那个的,希望大家都能多动手试试,游戏引擎是可以很简单的,只要你发现自己写的游戏用交集,就DRY吧(Don't Repeat Yourself)!