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類,它實現了引擎和指令碼的介面。後面,我會繼續分析它的重要子類。(未完待續)