paladin career
博客:http://blog.sina.com.cn/auroratony

  上一篇《富有弹性的通用游戏工具框架(一)》写了些骨架性的东西,今天把first runnable的截图和demo发出来。名字就叫GEF(Game Editor Framework),其实把它用作非游戏领域的软件开发也是完全可行的,前几天老婆决定把GEF用到她的网络仿真毕业设计中。我以后写编译器的IDE也可以拿这个玩意直接用了。话说Visual Studio这种现代IDE的扩展性非常好,用VS做shell来开发游戏工具也是可行的,VS插件写起来不难,不过开发资料相对少得多。什么现成的都不如自己专门定制的用起来顺手和爽快啊。
 
  简单的从网上抠了块几何体渲染代码写了个OpenGL渲染测试,消息流程都跑通了,undo/redo的command模式还没有加上,一些必要的消息处理还没有写完。第一版的截图如下:



  此篇为《富》一文的补充。因为GEF是和底层引擎无关的,所以《富》没有涉及一些细节问题而只注重描述通用的流程性的东西。这些细节包括:
 
(1) 渲染窗口。实现在插件中,只需要一个空的UserControl即可,Control.Handle属性即为HWND,通过消息把此HWND传给底层作为自定义渲染窗口。
 
(2) 渲染驱动。有两种方式。一种是插件创建单独的线程,此线程跑常规游戏while(1) { update(); render(); }风格的主循环;另一种是插件中的一个Timer控件驱动,每次Tick事件传递一个消息到底层进行runOneFrame() { update(); render(); }风格的操作。实际中具体用哪种方式取决于实际工程的线程使用方案、资源加载方案等。
 
(3) 必要消息。窗口大小改变,焦点的丢失、获得事件需要发消息给底层引擎做相应处理。
 
(4) 消息hack。如果只把shell当成没有任何特定逻辑的空壳当然可以,但是一些特定消息在特定层做处理是最为方便的,因此有必要做些消息hack。比如shell掌管着所有的可停靠窗口等工具控件,故获取HWND的消息在些层做处理取到想要的结果后返回给底层,不再向上bubble;撤销、重做的消息只发到管理着command的wrapper一层做处理,不再向下sink;需要有一个总控插件,比如命名为System,不管当前激活状态的插件是哪一个,消息都会发送一份到此插件……
 
(5) 消息定义。因为消息group及type需要在不同层次多个工程里引用到,所以应当使用一定的手段避免写出不同版本多份相同定义(用Native C++/CLI C++/C#写内容相同,语法相似的东西)。我的解决方案是把消息的定义专门放到一个CLI C++工程中,group及type定义为枚举,并且用宏的方式定义枚举的定义语句,在CLI C++工程中编译为managed程序集,供DotNET工程引用使用,在Native C++工程中直接包含此消息定义头文件直接当成一个一般的native版本的定义,例如:
 
1 #ifndef __GEF_COMMON_MESSAGE_H__
2 #define __GEF_COMMON_MESSAGE_H__
3
4 #ifndef GEF_ENUM
5 # ifdef GEF_MSG_DOTNET_COMPILE
6 # define GEF_ENUM public enum class
7 # else // GEF_MSG_DOTNET_COMPILE
8 # define GEF_ENUM enum
9 # endif // GEF_MSG_DOTNET_COMPILE
10 #endif // GEF_ENUM
11
12 namespace gef {
13
14 #ifdef GEF_MSG_DOTNET_COMPILE
15 public enum class PluginTabPageOrder {
16 PO_HEAD = 0,
17 PO_FILE = 100,
18 PO_EDIT = 200,
19 PO_DEFAULT = 500,
20 PO_USER = 600,
21 };
22 #endif // GEF_MSG_DOTNET_COMPILE
23
24 GEF_ENUM MsgGroupTypes {
25 MGT_SYSTEM,
26 MGT_FILE,
27 MGT_EDIT,
28 MGT_USER,
29 };
30
31 GEF_ENUM MsgSystemTypes {
32 MST_SYS_EXIT, // sink
33 MST_SYS_REQ_HWND, // bubble
34 MST_SYS_RES_HWND, // sink
35 MST_SYS_RESIZE, // sink
36 MST_SYS_LOST_FOCUS, // sink
37 MST_SYS_GAIN_FOCUS, // sink
38 MST_SYS_TIMER, // sink
39 MST_SYS_REFRESH_CTRL, // bubble
40 MST_SYS_USER,
41 };
42
43 GEF_ENUM MsgFileTypes {
44 MFT_FILE_NEW,
45 MFT_FILE_OPEN,
46 MFT_FILE_SAVE,
47 MFT_FILE_SAVE_AS,
48 MFT_FILE_IMPORT,
49 MFT_FILE_EXPORT,
50 MFT_FILE_USER,
51 };
52
53 GEF_ENUM MsgEditTypes {
54 MET_EDIT_DELETE,
55 MET_EDIT_COPY,
56 MET_EDIT_CUT,
57 MET_EDIT_PASTE,
58 MET_EDIT_UNDO,
59 MET_EDIT_REDO,
60 MET_EDIT_USER,
61 };
62
63 }
64
65 #endif // __GEF_COMMON_MESSAGE_H__

  EXE可以从http://code.google.com/p/game-editor-framework/downloads/list下载,这个东西还远没有达到值得开源的地步,源代码就不放出了,最需要加进来的是RTTI及相关编辑功能,恰当的时机我会开放源代码。有问题或者反馈可以在此博客里留言或者在google code的issues里写。
锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛