みなさんあけましてお願いします。今年もよろしくお願いします。
さて、今回はC#/DXライブラリでLuaを呼び出して使おうと思います。
準備編
今回はLuaのライブラリとして、NLua
を使います。あとVS2019をつかっています。
導入方法は、NuGetで、NLua
と検索していただくと出てくるはずです。
一番上の奴ですね。
実装編
C#からluaを呼び出す
NLuaを使用するには、using NLua
を先頭に記述してください。
C#/NLuaでのLuaの使用は以下の通りです。
今回はオブジェクト指向らしく(?)main関数から始めます。
class luaTest
{
Lua lua = new Lua();
LuaFunction main;
public void Init()
{
lua.DoFile("script.lua");//実行するluaファイル
main = lua.GetFunction("main");//実行する関数名
}
public void Main()
{
main.Call();
}
public void Finalize()
{
lua.Close();
}
}
using DxLibDLL;
namespace Program{
class Program
{
static void Main()
{
DX.ChangeWindowMode(1);
DX.DxLib_Init();
DX.SetDrawScreen(DX.DX_SCREEN_BACK);
luaTest LuaTest = new luaTest();
LuaTest.Init();
while (true)
{
DX.ClearDrawScreen();
LuaTest.Main();
DX.ScreenFlip();
if (DX.ProcessMessage() < 0) break;
}
LuaTest.Finalize();
DX.DxLib_End();
}
}
}
これで、C#側からの準備はできました。
次に、Lua側を準備しましょう。といっても普通に書くだけです。
function main()
--ここに処理をかく
end
ですが、これではDxLibの関数をなにも使えません。なので、Luaに追加しましょう。
LuaからDxLibを使えるようにする
まぁこいつがなかなか面倒くさくて、C#側で関数を一つずつ登録しなきゃならんのです。いい方法があったら教えてほしいです。
using DxLibDLL;
class Func
{
public bool KeyLeftPress()
{
if(DX.CheckHitKey(DX.KEY_INPUT_LEFT) != 0)
{
return true;
}
else
{
return false;
}
}
public bool KeyRightPress()
{
if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) != 0)
{
return true;
}
else
{
return false;
}
}
public bool KeyDownPress()
{
if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) != 0)
{
return true;
}
else
{
return false;
}
}
public bool KeyUpPress()
{
if (DX.CheckHitKey(DX.KEY_INPUT_UP) != 0)
{
return true;
}
else
{
return false;
}
}
public void DrawCircle(int x, int y, int r, uint color)
{
DX.DrawCircle(x, y, r, color);
}
// 以下省略 必要に応じて追加
}
と、こんな感じでいちいち書かんといかんのです・・・。めんどくさいこと極まりない。我慢してください。
これをまとめてLuaに追加しましょう。
Lua.cs
を次のように変更して下さい。
public void Init()
{
lua["Func"] = new Func(); //関数を追加
lua.DoFile("script.lua");//実行するluaファイル
main = lua.GetFunction("main");//実行する関数名
}
これで、LuaからDxLibの関数を使えるようになりました。
x = 255
y = 255
function main()
if Func:KeyLeftPress() == true then
x = x - 4;
elseif Func:KeyRightPress() == true then
x = x + 4;
end
if Func:KeyUpPress() == true then
y = y - 4;
elseif Func:KeyDownPress() == true then
y = y + 4;
end
Func:DrawCircle(x, y, 16, 0x00ff00);
end
では実行してみましょう
十字キーを押すと円が移動するのが確認できたかと思います。
あとは関数を追加したりして頑張ってください。
最後に
調べてもあまり出てこなかったので、困ってる人がいたら何かの助けになれば幸いです。指摘、改善点などコメント待ってます。