2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C#/DxLIbでNLuaを動かす

Posted at

みなさんあけましてお願いします。今年もよろしくお願いします。
さて、今回はC#/DXライブラリでLuaを呼び出して使おうと思います。

準備編

今回はLuaのライブラリとして、NLuaを使います。あとVS2019をつかっています。
導入方法は、NuGetで、NLuaと検索していただくと出てくるはずです。
image.png
一番上の奴ですね。

実装編

C#からluaを呼び出す

NLuaを使用するには、using NLuaを先頭に記述してください。
C#/NLuaでのLuaの使用は以下の通りです。
今回はオブジェクト指向らしく(?)main関数から始めます。

Lua.cs
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();
		}
	}
Main.cs
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側を準備しましょう。といっても普通に書くだけです。

Script.lua
function main()
	--ここに処理をかく
end

ですが、これではDxLibの関数をなにも使えません。なので、Luaに追加しましょう。

LuaからDxLibを使えるようにする

まぁこいつがなかなか面倒くさくて、C#側で関数を一つずつ登録しなきゃならんのです。いい方法があったら教えてほしいです。

Function.cs
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を次のように変更して下さい。

Lua.cs
public void Init()
	{
			lua["Func"] = new Func(); //関数を追加
			lua.DoFile("script.lua");//実行するluaファイル
			main = lua.GetFunction("main");//実行する関数名
	}

これで、LuaからDxLibの関数を使えるようになりました。

Script.lua
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

では実行してみましょう
image.png
十字キーを押すと円が移動するのが確認できたかと思います。
あとは関数を追加したりして頑張ってください。

最後に

調べてもあまり出てこなかったので、困ってる人がいたら何かの助けになれば幸いです。指摘、改善点などコメント待ってます。

2
2
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?