游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4703|回复: 1

GEF first runnable demo on Nov. 13, 2011

[复制链接]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2011-11-20 00:46:00 | 显示全部楼层 |阅读模式
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里写。

9

主题

28

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2011-11-20 12:20:00 | 显示全部楼层

Re:GEF first runnable demo on Nov. 13, 2011

不知道楼主想干嘛,是想做游戏编辑器么?可你这demo离编辑器还差的远呢,看不出有什么亮点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 14:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表