提供: 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~"}} | ||
− | |||
− | |||
− | |||
== ILuaObjectの利用 == | == ILuaObjectの利用 == | ||
− | + | ILuaObjectを利用してJava側のオブジェクトをLua側から扱えるようにする方法について解説します。 | |
*ILuaObjectの実装 | *ILuaObjectの実装 | ||
− | |||
*Lua側での利用 | *Lua側での利用 | ||
16行目: | 12行目: | ||
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。 | ILuaObjectとは、通常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(); // | + | 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を匿名クラス(無名クラス)で実装しましたが、もちろん通常のクラスで実装しても構いません。 | |
− | + | Java側のオブジェクトをLua側から扱うためのメソッドを ILuaObject.getMethodNames() 及び ILuaObject.callMethod() で実装します。<br /> | |
− | + | 実装方法については IPeripheral.getMethodNames() 及び IPeripheral.callMethod() と同じなので、「[[ComputerCraft_API/1.65/メソッドの追加|周辺機器メソッドの追加]]」を参考にしてください。 | |
− | === | + | === ILuaObjectの引き渡し === |
− | + | 実装したILuaObjectオブジェクトは、以下のようなメソッドでLua側へ渡すことができます。 | |
− | *IPeripheral. | + | *'''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時点における版
この記事は"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; }