提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
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の実装 | *ILuaObjectの実装 | ||
+ | *ILuaObjectの利用 | ||
*Lua側での利用 | *Lua側での利用 | ||
+ | |||
=== ILuaObjectの実装 === | === ILuaObjectの実装 === | ||
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。 | ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。 | ||
− | |||
− | |||
− | |||
− | + | 実装例(周辺機器メソッドの戻り値からLuaへ渡す場合): | |
<source lang = "java"> | <source lang = "java"> | ||
− | public class | + | public class MyPeripheral implements IPeripheral { |
− | + | /* 略 */ | |
− | |||
− | |||
− | |||
@Override | @Override | ||
− | public | + | public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { |
− | + | /* 略 */ | |
− | |||
− | + | MyObject myObject = new MyObject(); // ILuaObjectで扱うオブジェクト | |
− | + | return new Object[] { wrapMyObject(myObject) }; | |
− | |||
− | |||
− | MyObject myObject = new MyObject(); | ||
− | return new Object[] { wrapMyObject(myObject) }; | ||
− | |||
− | + | /* 略 */ | |
} | } | ||
− | private ILuaObject wrapMyObject(final MyObject myObject) { | + | private ILuaObject wrapMyObject(final MyObject myObject) { |
return new ILuaObject() { | return new ILuaObject() { | ||
@Override | @Override | ||
public String[] getMethodNames() { | public String[] getMethodNames() { | ||
− | return new String[] { /* | + | return new String[] { /* メソッド名の配列 */ }; |
} | } | ||
@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: | + | // TODO: myObject を扱うためのメソッドを実装 |
return null; | return null; | ||
} | } | ||
55行目: | 48行目: | ||
}; | }; | ||
} | } | ||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
− | + | この例では無名クラスでILuaObjectを実装しましたが、もちろん通常のクラスで実装しても構いません。 | |
− | + | Java側のオブジェクトをLua側から扱うためのメソッドは、ILuaObject.getMethodNames()とILuaObject.callMethod()で実装します。<br /> | |
− | + | 実装方法についてはIPeripheral.getMethodNames()及びIPeripheral.callMethod()と同じなので、「[[ComputerCraft_API/1.65/メソッドの追加|周辺機器メソッドの追加]]」を参考にしてください。 | |
− | === | + | === ILuaObjectの利用 === |
− | + | 実装したILuaObjectオブジェクトは、以下のようなメソッドの引数・戻り値(のObject配列の要素)としてLua側へ渡すことができます。 | |
− | * | + | *IPeripheral.getMethodNames()の戻り値 |
− | * | + | *IComputerAccess.queueEvent()の引数 |
− | * | + | *TurtleCommandResult.success()の引数 |
=== Lua側での利用 === | === Lua側での利用 === | ||
− | + | ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |