提供: Minecraft Modding Wiki
移動先: 案内検索
(ページ作成。まだ書きかけです。)
 
(ひとまずLua側での利用まで)
1行目: 1行目:
 
[[ComputerCraft_API|ComputerCraft API]] >
 
[[ComputerCraft_API|ComputerCraft API]] >
 
{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.75~"}}
 
{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.75~"}}
 
 
{{Stb}}
 
  
 
== ILuaObjectの利用 ==
 
== ILuaObjectの利用 ==
Java側の独自オブジェクトをLua側から扱えるようにする方法について解説します。
+
ILuaObjectを利用してJava側のオブジェクトをLua側から扱えるようにする方法について解説します。
  
 
*ILuaObjectの実装
 
*ILuaObjectの実装
*ILuaObjectの利用
 
 
*Lua側での利用
 
*Lua側での利用
  
16行目: 12行目:
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
  
実装例(周辺機器メソッドの戻り値からLuaへ渡す場合):
+
実装例(IPeripheral.callMethod()の戻り値でLua側へ渡す場合):
 
<source lang = "java">
 
<source lang = "java">
 
public class MyPeripheral implements IPeripheral {
 
public class MyPeripheral implements IPeripheral {
26行目: 22行目:
 
/* 略 */
 
/* 略 */
  
MyObject myObject = new MyObject(); // ILuaObjectで扱うオブジェクト
+
MyObject myObject = new MyObject(); // ILuaObjectで扱うオブジェクトの例
 
return new Object[] { wrapMyObject(myObject) };
 
return new Object[] { wrapMyObject(myObject) };
  
37行目: 33行目:
 
@Override
 
@Override
 
public String[] getMethodNames() {
 
public String[] getMethodNames() {
return new String[] { /* メソッド名の配列 */ };
+
return new String[] { /* myObject を扱うためのメソッド名の配列 */ };
 
}
 
}
  
 
@Override
 
@Override
 
public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
 
public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
// TODO: myObject を扱うためのメソッドを実装
+
// TODO: myObject を扱うためのメソッドの処理を実装
 
return null;
 
return null;
 
}
 
}
51行目: 47行目:
 
}
 
}
 
</source>
 
</source>
この例では無名クラスでILuaObjectを実装しましたが、もちろん通常のクラスで実装しても構いません。
+
この例ではILuaObjectを匿名クラス(無名クラス)で実装しましたが、もちろん通常のクラスで実装しても構いません。
  
Java側のオブジェクトをLua側から扱うためのメソッドは、ILuaObject.getMethodNames()とILuaObject.callMethod()で実装します。<br />
+
Java側のオブジェクトをLua側から扱うためのメソッドを ILuaObject.getMethodNames() 及び ILuaObject.callMethod() で実装します。<br />
実装方法についてはIPeripheral.getMethodNames()及びIPeripheral.callMethod()と同じなので、「[[ComputerCraft_API/1.65/メソッドの追加|周辺機器メソッドの追加]]」を参考にしてください。
+
実装方法については IPeripheral.getMethodNames() 及び IPeripheral.callMethod() と同じなので、「[[ComputerCraft_API/1.65/メソッドの追加|周辺機器メソッドの追加]]」を参考にしてください。
  
=== ILuaObjectの利用 ===
+
=== ILuaObjectの引き渡し ===
  
実装したILuaObjectオブジェクトは、以下のようなメソッドの引数・戻り値(のObject配列の要素)としてLua側へ渡すことができます。
+
実装したILuaObjectオブジェクトは、以下のようなメソッドでLua側へ渡すことができます。
*IPeripheral.getMethodNames()の戻り値
+
*'''IPeripheral.callMethod()'''の戻り値のObject[]の要素
*IComputerAccess.queueEvent()の引数
+
*'''IComputerAccess.queueEvent()'''の引数のObject[]の要素
*TurtleCommandResult.success()の引数
+
*'''TurtleCommandResult.success()'''の引数のObject[]の要素
  
 
=== Lua側での利用 ===
 
=== Lua側での利用 ===
  
 
ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
 
ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
 +
 +
例えばJava側で以下のようにILuaObjectを実装した場合、
 +
<source lang = "java">
 +
// Java:
 +
// ILuaObject.getMethodNames()
 +
@Override
 +
public String[] getMethodNames() {
 +
return new String[] { "getType", "getPos", "getName", "kill" };
 +
}
 +
</source>
 +
Lua側では以下のようにメソッドを呼び出すことができます。
 +
<source lang = "lua">
 +
-- Lua:
 +
-- 以下 tObject に、実装した ILuaObject が入っているものとする
 +
tObject.getType()
 +
tObject.getPos()
 +
tObject.getName()
 +
tObject.kill()
 +
</source>
 +
Lua側でメソッドを呼び出した場合、Java側では実装したcallMethod()が呼び出されます。
 +
<source lang = "java">
 +
// Java:
 +
// ILuaObject.callMethod()
 +
@Override
 +
public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
 +
switch(method) {
 +
case 0:
 +
// getType の処理
 +
case 1:
 +
// getPos の処理
 +
case 2:
 +
// getName の処理
 +
case 3:
 +
// kill の処理
 +
}
 +
 +
return null;
 +
}
 +
</source>

2017年4月5日 (水) 22:44時点における版

ComputerCraft API >

この記事は"Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.75~"を前提MODとしています。

ILuaObjectの利用

ILuaObjectを利用してJava側のオブジェクトをLua側から扱えるようにする方法について解説します。

  • ILuaObjectの実装
  • Lua側での利用


ILuaObjectの実装

ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。

実装例(IPeripheral.callMethod()の戻り値でLua側へ渡す場合):

public class MyPeripheral implements IPeripheral {

	/* 略 */

	@Override
	public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
		/* 略 */

			MyObject myObject = new MyObject();	// ILuaObjectで扱うオブジェクトの例
			return new Object[] { wrapMyObject(myObject) };

		/* 略 */
	}

	private ILuaObject wrapMyObject(final MyObject myObject) {
		return new ILuaObject() {

			@Override
			public String[] getMethodNames() {
				return new String[] { /* myObject を扱うためのメソッド名の配列 */ };
			}

			@Override
			public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
				// TODO: myObject を扱うためのメソッドの処理を実装
				return null;
			}

		};
	}

}

この例ではILuaObjectを匿名クラス(無名クラス)で実装しましたが、もちろん通常のクラスで実装しても構いません。

Java側のオブジェクトをLua側から扱うためのメソッドを ILuaObject.getMethodNames() 及び ILuaObject.callMethod() で実装します。
実装方法については IPeripheral.getMethodNames() 及び IPeripheral.callMethod() と同じなので、「周辺機器メソッドの追加」を参考にしてください。

ILuaObjectの引き渡し

実装したILuaObjectオブジェクトは、以下のようなメソッドでLua側へ渡すことができます。

  • IPeripheral.callMethod()の戻り値のObject[]の要素
  • IComputerAccess.queueEvent()の引数のObject[]の要素
  • TurtleCommandResult.success()の引数のObject[]の要素

Lua側での利用

ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。

例えばJava側で以下のようにILuaObjectを実装した場合、

// Java:
// ILuaObject.getMethodNames()
@Override
public String[] getMethodNames() {
	return new String[] { "getType", "getPos", "getName", "kill" };
}

Lua側では以下のようにメソッドを呼び出すことができます。

-- Lua:
-- 以下 tObject に、実装した ILuaObject が入っているものとする
tObject.getType()
tObject.getPos()
tObject.getName()
tObject.kill()

Lua側でメソッドを呼び出した場合、Java側では実装したcallMethod()が呼び出されます。

// Java:
// ILuaObject.callMethod()
@Override
public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
	switch(method) {
	case 0:
		// getType の処理
	case 1:
		// getPos の処理
	case 2:
		// getName の処理
	case 3:
		// kill の処理
	}

	return null;
}