Home > Tags > Lua

Lua

開始實作引擎的基本類別

話說之前想做 Collada 滙入,便最基本要有一個內部存放 Collada 滙入後的資料。這個「雙休日」(內地常用語) 就留在家中乖乖寫程式……寫不出的時候也看了十幾集動畫。

架構上參考了之前看過的 Unity,採用 Component 型式。目前實現的幾個類別的關係如下圖:

採用 Component 架構的一個好處是,減少了傳統 Scene Graph 的類別繼承和節點 (node) 數目。一個實體 (entity, 有些引擎稱為 Game Object) 可以有 Mesh 元件,也可以同時加入腳本、碰撞物件等元件。

實作過程中出現許多問題,和大家 (及將來的自己) 分享一下。

Continue reading

使用 Custom Build Tool 執行 SWIG

今晚完成了近期的第三個目標,加入 Script Module 的 Binding (其實只是一個叫 Runtime 的類別),利用 C# 去執行之前的 Lua 的程序 (test1.lua)。

今早 Edwin 的回應啟發了一些想法,所以著手更改 SWIG 在 Visual Studio 的編譯方法。

現在採用了Visual Studio 的 Custom Build Rule。由於 Lua 和 C# 需要不同的規則,所以要兩個 file extensions,我設定 Lua 的 Swig Interface 檔案為 .li,C# 則是 .ci。

Lua

swig
 -c++
 -lua
 -o $(OutDir)/$(InputName)Lua.cxx
 "$(InputPath)"

C#

swig
 -c++
 -csharp
 -o $(OutDir)/$(InputName)Cs.cxx
 -outdir $(OutDir)
 -namespace Mil.$(InputName)
 -dllimport $(TargetName)
 "$(InputPath)"

生成的檔案會放置於 Debug 或 Release 的輸出目錄,解決之前兩個 configuration 會互相影響的問題。

兩個規則分別生成 $(OutDir)/$(InputName)Lua.cxx 和 $(OutDir)/$(InputName)Cs.cxx,這些檔案需要加入 Project 裡。但因為一個項目不應該同時加入 Debug 和 Release 版的這些檔案,我想到的方法是寫一個 .cpp 去 #include 這些檔案,例如:

// MathCs.cpp
#include "stdafx.h"
#include "MathCs.cxx"

之後再把 Project 的 Include path 加入 “$(OutDir)”,那麼,就可以正確地編譯現時 Configuration 的 Swig 生成檔案。

後來再試驗檔案的 Additional Dependencies 屬性,設定單一檔案仍然不成功。之後我把 .li 和 .ci 裡 include 的檔案改名為 .lii 和 .cii,希望只要可設置 dependencies 為 *.lii 和 *.cii 就可以了,但都不成功。或許可以用 Pre-Build Event 去檢查這些檔案,如比輸出檔案新就 touch 那個 .li 或 .ci。不過未嘗試。

最後,還有一個問題是 C# 的 Proxy 需要編譯多個由 SWIG 生成 .cs 檔案。我找了一回才發現 C# 沒有 #include、也似乎沒有機制可以編譯 *.cs 等多個檔案。最後暫時用 C++ Project 的 Post-Build Event 把適當 Configuration 的檔案拷貝到 C# 的項目裡,再人手加入這些檔案。

copy $(OutDir)\*.cs ..\MilCs

Lua 的渲染測試

今日順利完成3月6日訂下的第二個目標,把昨天的 C# 測試程式用 C++ 及 Lua 實現。圖像輸出和昨天的測試程式一模一樣,就不上傳了。

C++ 負責創建視窗和呼叫 Device::Open(Hwnd),Lua 做渲染的部份。(其實在遊戲中是不會用 Lua 做這麼低階的工作,這裡只是當作測試 Lua Binding。)

除了編寫 Lua 的 SWIG interface 檔案外,今天主要的工作是考慮如何從 C++ 呼叫 Lua 的類別。發覺對 Lua 的語法還是很不熟識。

有興趣的話可以比較以下的C++/Lua代碼和昨天的C#代碼

Continue reading

開始實作圖像引擎

昨晚只是寫 Blog 已經花了幾小時。不過這也是值得的,因為我可以從寫的過程中把思路弄清楚一點。今晚終於開始編程。

詳細的設計留待一兩天才說吧,今天基本上只寫了一些數學部分、Direct3D9 的起動、一個叫 Geometry 的類別和一個 Chamfer Box。但全部都通過編譯但未進行測試。

我希望在這幾天內實現以下的產出 (deliverables):

  1. 在 C# 創建的視窗中渲染一個旋轉 Chamfer Box,只有直線光源。
  2. 用 C++ 和 Lua 寫同一個和 (1) 相同的程序。
  3. 用 C# 創建的視窗中運行 (2) 中的 Lua 的程序。
  4. 在 cygwin 上執行 (2),使用 gcc 和 OpenGL。

過了這一步,就可以加入輸入和嘗試做一些遊戲性相關的實驗。有時間的話,也想找一部 PSP 用開源的 SDK 試試移植。

解構 CryEngine2 的 Script 物件模型(一)

這幾天看了一點 Crysis 的 Script。CryEngine2 和 CryEngine 一樣是使用 Lua 為 Script 語言。CryEngine2 把 Lua 升級上 5.x 的版本。

雖然 CryEngine2 的功能實在比 CryEngine 進步許多,可是,有點失望的是 Crysis 的說明文檔比 Farcry 少,甚至最近才釋出的 SDK 也沒有 Script 的 API 參考文檔。暫時只看了一篇官方的 “Creating a new entity”文章和 Crysis 遊戲裡的 Script,所以很多以下的內容是未經証實的猜想。

這是部份 Script 物件模型的 UML 類別圖:

crysis.png

由於 CryEngine 的 Script 是 loosely typed,實際上並沒有真正的 Base、EntityBase 等類別和繼承存在。這圖所顯示的,只是我從例子中找到的一些共同部分,把它組合成類別及繼承。由於時間關係,我需要分開數天研究不同的「類別」,今天主要集中看 Entity。

Continue reading

Lua 的 Unit Testing

今天成功把 Lua 嵌入Engine (其實只是十數行代碼及設定連結等),之後開了一個新 C++ project 執行一個 Lua 檔案去測試 Engine 提供的介面。

在網上找了一會,選擇了 luaUnit 來做 Unit Testing。luaUnit 的好處是使用 Lua 的 “Reflection” (其實只是找 table 吧),自動找尋所有 test suites。使用起來真的很簡單。以下是我做的 unit test。

Continue reading

混合語言的遊戲開發系統架構

用甚麼程式語言來做軟件是一個大問題,思考了一個周末,現時想做一個混合語言的遊戲開發系統架構。暫時只考慮三種程式語言: C++、C# 及 Lua。以下首先分析這三種語言的特性,之後再提出一個系統架構科案。

Continue reading

試驗SWIG (一) C++ 連接C#和Lua

今晚初次嘗試使用 SWIG (Simple Wrapper Interface Generator)。SWIG 是一個能為 C/C++ 程式生成各種 Script 語言 Wrapper 的工具。簡單地說,就是有了一個 C++ 程式,用 SWIG 來連結這個程式和 Script,使腳本語言可以呼叫 C++ 的函數及類別等等。

SWIG 支持大部份 C++ 的功能,甚至 template 也能支持。同時可以生成十數種腳本語言的 wrapper,包括我正在考慮使用的 Lua、Python 和 C# 等。

跟據我的目標,先做一個 3D Vector 的測試。以下是一部份C++代碼 (Vector3.h):

Continue reading

Home > Tags > Lua

Search
Feeds
Meta

Return to page top