備忘録

プログラムやゲーム関連に関すること

【Lua】C++環境の関数をLuaで使用する

参考:その5 LuaからC言語の関数を呼び出す

test.cpp

#include <iostream>
#include <lua.hpp>

void test()
{
	// Luaステートを生成する
	auto L = luaL_newstate();

	// Luaに登録する関数(線形補完)を定義する
	// Luaに登録できる関数は lua_CFunction と同じ型でなければならない
	// typedef int (*lua_CFunction)(lua_State* L);
	auto lerp = [](lua_State* L)
	{
		// 引数をスタックから取得する
		auto from = static_cast<float>(lua_tonumber(L, 1)); // 第1引数
		auto to = static_cast<float>(lua_tonumber(L, 2));   // 第2引数
		auto time = static_cast<float>(lua_tonumber(L, 3)); // 第3引数

		// 引数の取得後は戻り値をスタックさせるので全て破棄する
		lua_pop(L, lua_gettop(L));

		// 補間値をスタックする
		lua_pushnumber(L, from + time * (to - from));

		return 1; // 戻り値の数を返却する(int型)
	};

	// 定義した関数を登録する
	lua_register(L, "lerp", lerp);

	// LuaステートにLuaライブラリを使用可能にする
	luaL_openlibs(L);

	// Luaファイルをロードして実行する
	if (luaL_dofile(L, "test.lua"))
	{
		std::cout << lua_tostring(L, lua_gettop(L));
		lua_close(L);
		return;
	}

	// Luaステートを破棄する
	lua_close(L);
}

int main(int argc, char* argv[])
{
	test();
	getchar(); // 入力待ち用

	return 0;
}

test.lua

-- C環境側で登録したlerp関数を
-- 呼び出して戻り値を表示させる
for i = 0, 10 do
	print(lerp(0, 10, i * 0.1))
end