TGE引擎中,ConsoleObject类是所有核心类的基类,所有在脚本中用到的类都必须继承于该类。该类主要提供脚本动态创建对象、类属性脚本初始化等功能。在前面的脚本入门介绍中,我们知道在TGE脚本中通过“new”关键字来创建动态对象,并进行初始化。那么在ConsoleObject class中是如何实现这一点的呢?
当脚本想要创建一个对象时会把一个类名字符串传递到引擎中,比如当脚本中调用 new Player{}时,类名就是“Player”字符串。于是问题就在于怎么通过这个类名字符串new出该类的一个对象。我们很自然的会想到必须建立一个类名和类的关联表,创建的时候通过类名映射到类,进行创建。TGE引擎的思想基本也是如此,但是在实现上做的很有技巧。
TGE中使用了代理模式,当我们定义一个脚本类(在脚本中能够访问的类)时,需要加入一个宏:IMPLEMENT_CONOBJECT(className),可不要小看这个宏。通过它,引擎会生成一个代理类,并把这个代理类注册到一个链表中。ConcreteClassRep代理类是一个类模板,模板参数就是实体类的类名。于是,当我们需要创建对象时,只需要通过类名在链表中查到给类名对应的代理类,然后通过该代理类利用模板机制就可以进行创建了。
我们在脚本中创建游戏对象的同时,必须给对象进行初始化。引擎通过initPersistFields()函数给脚本公布类属性接口consoleObject的每个子类都必须重写该方法。另外我们还可以通过consoleInit()函数给脚本公布全局变量接口。给脚本公布类函数使用:ConsoleMethod(className,name,returnType,minArgs,maxArgs,usage1) 宏。公布全局函数使用:ConsoleFunction(name,returnType,minArgs,maxArgs,usage1) 宏。
总结:在TGE中,任何你需要在脚本中用到的类都必须继承鱼ConsoleObject类,它实现了引擎和脚本的接口。后面,我会继续分析它的重要子类。(未完待续)