ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

Luaやってみた

今回は何かスクリプト言語やりたいと思ってLuaC++組み合わせてやったので、まとめも含めて色々書いていこうと思います。

・参考にした所
導入部分はマルペケさんのゲームつくろー!のLua組込み編を見ながらやりました。
Lua組み込み編


今日やったほとんどコードはQiitaのこの記事を真似てやってました。
qiita.com


今日1番初めにやったゲームつくろーさんのサンプルを元に色々書きます。


Luaコード

windowWidth = 640
windowHeight = 480
windowName = "daria"


C++コード

   #include <lua.hpp>
   void main()
   {
        lua_State* L = luaL_newstate();
	if (luaL_dofile(L, "initParam01.lua"))
	{
		//ファイルが無かったり記述ミスがあるとスタックにエラー文字列が積まれるので表示
		std::cout <<  lua_tostring(L, lua_gettop(L)) << std::endl;
		lua_close(L);
		return;
	}
	//Luaに記述してあるグローバル変数をLに積んでいく
	lua_getglobal(L, "windowWidth");
	lua_getglobal(L, "windowHeight");
	lua_getglobal(L, "windowName");

	printStack(L);

	//スタックを削除
	int num = lua_gettop(L);
	lua_pop(L, num);
    
    //使い終わったので削除する
    lua_close(L);
    }

まずLua側からの説明を。
Luaには型定義がないらしく、いきなり変数を代入しても問題ないみたいです。
なので上からwindowWidth,windowHeightはdouble(数値は基本的にdouble型)に、
windowNameはstringになります。
他にもセミコロンを別につけてもつけなくてもどちらでもいいなど、
これだけでもだいぶ戸惑いました。


Lua側は以上になるので、これをC++側から値を取得してみます。


C++側の方ではまずLua_State*型の変数が必要になります。
この変数にLua側の変数や関数の情報を保持して、
C++とやりとりするための橋渡し的な存在になっています。
スタックなので最初に入れたものの上にどんどん積み重なっていくので
最後に追加されたものが一番上に行くようになっています。
詳しい説明はゲームつくろーに書いてあるのでそちらをご参照ください。


次にluaL_dofileでLuaStateにluaファイルの情報を渡します。
読み込みに失敗したりファイルに記述ミスがあると
LuaStateの一番上にエラー文字列が積まれるので、
それで原因を確認するように表示して処理を終了するようにしてます。


次にlua_getglobalでLua側から指定した文字列の変数名の情報を取得してLuaStateに積んでいきます。


次にprintStackというLuaStateに積まれてるスタック分だけ表示する関数をマルペケさんのコードを真似て表示してます。


結果はこちら

f:id:daria_sieben:20151228225046p:plain


左にある三桁の数字はそれぞれ自分が何番目の要素なのか表し、
次に変数の型、最後にその変数の値が表示されるようになっています
先ほど書いたようにどんどん積み重なっていくので、
最初に入ったwindowWidthが一番下になり、最後に入ったwindowNameが一番上になります。


最後に積んである要素をlua_popで削除して、
lua_closeで削除(削除しないとメモリに残り続ける)して終わりです。


以上がコードの一連の流れです。
他にも色々とありますが今回はここまで。
今回書いたのは初歩だったので、
次回に続きを書こうと思います。