Posted on 2008-11-08 23:52
剑孤寒 阅读(558)
评论(0) 编辑 收藏 引用 所属分类:
Galaxy2D 游戏引擎发布
最近依然很忙,项目太紧已经很久没写东西了。今天难得得空,把以前写的一个RPG代码翻出来看了看,发现很多设计上的问题,所以准备重写了。这个游戏本来已接近完成,只要整合完各个系统就是一个完整的游戏了,现在推掉重写老实说心里是很不愿意的,但我更不愿意把一个自己都不满意的东西发出来,所以前思后想还是决定重写了,还好自己的东西没有项目压力,有时间就弄弄。
好了,闲话就不多说了,我在看代码时首先注意到的一个问题是,Galaxy2D游戏引擎的GUI系统适用范围太窄,以至于在这个RPG中又写了一个GUI系统,这是因为GUI系统控件之间的联系太“散”了,也没有一个层的概念,所以在遇到比较复杂的需求时就没法用了。Galaxy2D的GUI系统是参考HGE写的,在HGE的GUI系统里,所有的控件都是平级的,所以当要控制GUIManager里的所有控件的一个界面上的某些控件时就变得非常麻烦,虽然后来写了一个Window控件来建立一个“层”的关系,但后来发现还是不好用,而且由于很多功能与GUIManager相似,导致产生了大量的冗余代码。另外,由于以前的GUI没有消息路由机制,所以当一个消息传到一个最末端的控件上时就“死”掉了,根本没机会再通知其他可以处理它的控件,这也使一些像某个控件被点击后将另一个控件高亮等操作要实行硬编码了,如果那一天那个控件改了名字或ID,这边的代码也要跟着改。以上这两点都违背了设计模式里的“开放-封闭”原则,这样的代码是非常不好维护的,所以准备做如下修改:
首先,把GUIManager中控件List的管理移到Window控件里去,GUIManager只负责把各种事件消息传到顶层Window控件,而不再管理和维护控件列表,Window控件上可挂其他控件或再挂个Window控件。这样就把层的关系建立起来了,而且GUIManager和Window控件的职责也清楚了,不会再有代码冗余,以后如果还要再添功能也只要改Window控件就行了,GUIManager不用做修改。
其次,给Window控件添加消息路由机制,该机制分两种模式:Send和Post。Send为立即模式,Post为缓存模式,消息将在下一帧中处理。消息传递路径为:自身子控件->同级控件的子控件->同级控件->父控件。这样如果一个控件被点击了,要高亮另一控件,只要发送一个消息即可,响应控件在接到消息后把自己高亮起来就可以了。