今も自分用のADVシステムを持っていますが、後々改良したり、他からシステム開発の依頼を受けることを考えてスクリプトシステムの刷新を行おうと考えまして、予習の意味でLuaを勉強してみることにしました。
でも他からシステム開発なんてまず回ってこないですよね・・・。能力はあっても売り込めないなら意味はない、と。
まあ、それ以外でもスクリプトを使用して何かを行うように設計するときに信頼性があり高速な組み込みスクリプトを使用できるのは有利ですからね。
今回は本体から直接使用することを前提に使っていきたいと思います。
一応WindowsでVisualStudioを使いますが、Luaのソースコード自身はC言語のコンパイラが動作する環境ならコンパイルできると思います。
(Makefileも同梱されていますのでライブラリ作成は簡単だと思います。)
まずはソースコードをダウンロード
Luaのホームページより最新のソースコードをダウンロードします。
ちなみに、Windows用のバイナリが公開されているとか何とか書いてありますが一切無視してかまいません。
本体のコードをコンパイルして使用していった方が後々有効だと思います。
この記事を書いている段階での最新はLua5.2.2です。
コンパイルしてライブラリを作成
ダウンロードしたアーカイブを適当な場所に展開します。例としてC:\hogeに展開すると
C:\hoge └─lua-5.2.2 ├─doc └─src
のようになります。私の場合はバージョン表記が微妙なので消してしまい、C:\hoge\lua\としますが・・・。
あとはVisualStudioでライブラリ作成のプロジェクトを構築します。
プロジェクトの種類は
- テンプレート:Win32プロジェクト
- アプリケーションの種類:スタティックライブラリ
- 追加のオプション:[プリコンパイル済みヘッダー]のチェックを解除
となります。
作成が完了すれば後は
- ソースファイル:src以下にあるcファイルをすべて追加
- ヘッダーファイル:src以下にあるhファイルをすべて追加(hppは追加しなくても良い)
でコンパイルを行えば多少警告は出ますが(CRTのセキュリティ警告)あっさりと構築できます。
なお、luaのファイル内にはテスト用のmain関数があるので気になる場合はコメントアウトしてしまうのがいいと思います。
というか、lua.cとluac.cはテスト用なので最悪コンパイル対象から除外してもあまり問題はなかったりします。
DLLの作成も難しくは全くない
内部でシンボルを定義することでDLLも簡単に作成できます。
プロジェクトの種類は
- テンプレート:Win32プロジェクト
- アプリケーションの種類:DLL
で作成し、ライブラリ生成と同じようにファイルを追加した後で
- DLLのプロジェクトのプロパティを開く
- [構成プロパティ]=>[C/C++]=>[プリプロセッサ]を開く
- [プリプロセッサの定義]に「LUA_BUILD_AS_DLL」を追加
とするだけでビルドを行えばちゃんとDLLが生成されます。
プリプロセッサの定義を忘れるとルーチンのエントリポイントがないDLLが出来てしまい意味がありませんので注意です。
で、それを使用してみる
C:\hogeにluatestを作成してテストします。ただのコンソールアプリケーションです。
#include <iostream> #include "../lua/src/lua.hpp" #ifdef _DEBUG #pragma comment(lib,"../lua/debug/lualib.lib") #else #pragma comment(lib,"../lua/release/lualib.lib") #endif //_DEBUG using namespace std; int main(void) { lua_State *L = luaL_newstate(); luaL_openlibs(L); int ret = luaL_dostring(L, "i = 1 while i <= 5 do print(i) i = i + 1 end"); if(ret != 0){ cout << "error : " << lua_tostring(L, -1) << endl; lua_pop(L, 1); } lua_close(L); return 0; } [/cpp] <p>Luaの一行スクリプトを実行して見るところまでをやっています。</p> <p>初期化から実行、解放までを流れとしています。</p> <br> <p>これに関して注意点があります。特にLinuxなどC++のコンパイル環境ではない場合に微妙な注意があります。</p> <br> <h3>Luaを使用するときのインクルードファイルに注意</h3> <p>C++が使える場合は上記の例のように</p> #include "../lua/src/lua.hpp"
と、lua.hppをインクルードします。
が、C言語しか使用できない場合は
#include "../lua/src/lua.h" #include "../lua/src/lualib.h" #include "../lua/src/lauxlib.h"
のように、必要なライブラリを直接インクルードする必要があります。
これについてはlua.hppを見れば分かると思いますが、Lua本体はC言語として書かれているので関数の名前規則が合わなくなると言う問題を解消しています。
その部分を間違えないようにしましょう。
ちなみに、VisualStudioのように、C++の場合は__cplusplusが宣言される、と言う場合であればlua.hppの内容を
#ifdef __cplusplus extern "C"{ #endif //__cplusplus #include "../lua/src/lua.h" #include "../lua/src/lualib.h" #include "../lua/src/lauxlib.h" #ifdef __cplusplus } #endif //__cplusplus
とすればあまり気にする必要はなかったりします。
と言うわけで簡単なルーチン
でした。
一応目的は「ADVエンジンのスクリプト部で使用できるようにLuaを使う」ことにありますのでその部分に気をつけながらやっていきます。
次回はLuaをADVエンジンスクリプト部として使うときの利点、欠点やそれに対する考え方をやっていきます。