Home > Tags > Lua
Lua
開始實作引擎的基本類別
話說之前想做 Collada 滙入,便最基本要有一個內部存放 Collada 滙入後的資料。這個「雙休日」(內地常用語) 就留在家中乖乖寫程式……寫不出的時候也看了十幾集動畫。
架構上參考了之前看過的 Unity,採用 Component 型式。目前實現的幾個類別的關係如下圖:
採用 Component 架構的一個好處是,減少了傳統 Scene Graph 的類別繼承和節點 (node) 數目。一個實體 (entity, 有些引擎稱為 Game Object) 可以有 Mesh 元件,也可以同時加入腳本、碰撞物件等元件。
實作過程中出現許多問題,和大家 (及將來的自己) 分享一下。
- Comments: 2
- Trackbacks: 0
使用 Custom Build Tool 執行 SWIG
- 2008-03-19 (三)
- 腳本編程
今晚完成了近期的第三個目標,加入 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
- Comments: 1
- Trackbacks: 0
Lua 的渲染測試
今日順利完成3月6日訂下的第二個目標,把昨天的 C# 測試程式用 C++ 及 Lua 實現。圖像輸出和昨天的測試程式一模一樣,就不上傳了。
C++ 負責創建視窗和呼叫 Device::Open(Hwnd),Lua 做渲染的部份。(其實在遊戲中是不會用 Lua 做這麼低階的工作,這裡只是當作測試 Lua Binding。)
除了編寫 Lua 的 SWIG interface 檔案外,今天主要的工作是考慮如何從 C++ 呼叫 Lua 的類別。發覺對 Lua 的語法還是很不熟識。
有興趣的話可以比較以下的C++/Lua代碼和昨天的C#代碼。
- Comments: 6
- Trackbacks: 0
開始實作圖像引擎
- 2008-03-06 (四)
- 圖像編程
昨晚只是寫 Blog 已經花了幾小時。不過這也是值得的,因為我可以從寫的過程中把思路弄清楚一點。今晚終於開始編程。
詳細的設計留待一兩天才說吧,今天基本上只寫了一些數學部分、Direct3D9 的起動、一個叫 Geometry 的類別和一個 Chamfer Box。但全部都通過編譯但未進行測試。
我希望在這幾天內實現以下的產出 (deliverables):
- 在 C# 創建的視窗中渲染一個旋轉 Chamfer Box,只有直線光源。
- 用 C++ 和 Lua 寫同一個和 (1) 相同的程序。
- 用 C# 創建的視窗中運行 (2) 中的 Lua 的程序。
- 在 cygwin 上執行 (2),使用 gcc 和 OpenGL。
過了這一步,就可以加入輸入和嘗試做一些遊戲性相關的實驗。有時間的話,也想找一部 PSP 用開源的 SDK 試試移植。
- Comments: 2
- Trackbacks: 0
解構 CryEngine2 的 Script 物件模型(一)
- 2008-03-04 (二)
- 腳本編程
這幾天看了一點 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 類別圖:
由於 CryEngine 的 Script 是 loosely typed,實際上並沒有真正的 Base、EntityBase 等類別和繼承存在。這圖所顯示的,只是我從例子中找到的一些共同部分,把它組合成類別及繼承。由於時間關係,我需要分開數天研究不同的「類別」,今天主要集中看 Entity。
- Comments: 1
- Trackbacks: 0
Lua 的 Unit Testing
- 2008-02-25 (一)
- 遊戲編程
今天成功把 Lua 嵌入Engine (其實只是十數行代碼及設定連結等),之後開了一個新 C++ project 執行一個 Lua 檔案去測試 Engine 提供的介面。
在網上找了一會,選擇了 luaUnit 來做 Unit Testing。luaUnit 的好處是使用 Lua 的 “Reflection” (其實只是找 table 吧),自動找尋所有 test suites。使用起來真的很簡單。以下是我做的 unit test。
- Comments: 0
- Trackbacks: 0
混合語言的遊戲開發系統架構
用甚麼程式語言來做軟件是一個大問題,思考了一個周末,現時想做一個混合語言的遊戲開發系統架構。暫時只考慮三種程式語言: C++、C# 及 Lua。以下首先分析這三種語言的特性,之後再提出一個系統架構科案。
- Comments: 2
- Trackbacks: 0
試驗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):
- Comments: 2
- Trackbacks: 0
Home > Tags > Lua
- Search
- Feeds
- Meta