提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
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の利用 ==
ILuaObjectを利用してJava側のオブジェクトをLua側から扱えるようにする方法について解説します。
+
Java側の独自オブジェクトをLua側から扱えるようにする方法について解説します。
  
 
*ILuaObjectの実装
 
*ILuaObjectの実装
 +
*ILuaObjectの利用
 
*Lua側での利用
 
*Lua側での利用
 +
  
 
=== ILuaObjectの実装 ===
 
=== ILuaObjectの実装 ===
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
ILuaObjectの実装クラスのインスタンスをLua側へ渡すことで、Lua側からは実装したメソッドを通してJava側のオブジェクトを操作することができます。
 
 
次の例では、MyObjectというJava側で作成したオブジェクトをILuaObjectを用いてLua側で扱えるようにしています。
 
  
実装例(IPeripheral.callMethod()の戻り値でLua側へ渡す場合):
+
実装例(周辺機器メソッドの戻り値からLuaへ渡す場合):
 
<source lang = "java">
 
<source lang = "java">
public class SamplePeripheral implements IPeripheral {
+
public class MyPeripheral implements IPeripheral {
  
@Override
+
/* 略 */
public String getType() {
 
return "sample";
 
}
 
  
 
@Override
 
@Override
public String[] getMethodNames() {
+
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
return new String[] { "createMyObject" }
+
/* 略 */
}
 
  
@Override
+
MyObject myObject = new MyObject(); // ILuaObjectで扱うオブジェクト
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException {
+
return new Object[] { wrapMyObject(myObject) };
switch (method) {
 
case 0:  // createMyObject
 
MyObject myObject = new MyObject(); // ILuaObjectで扱うJava側のオブジェクトの例
 
return new Object[] { wrapMyObject(myObject) }; // myObjectをILuaObjectでラップしてLua側へ渡す
 
}
 
  
return null;
+
/* 略 */
 
}
 
}
  
private ILuaObject wrapMyObject(final MyObject myObject) { // 匿名クラス内で利用するためにfinalにする
+
private ILuaObject wrapMyObject(final MyObject myObject) {
 
return new ILuaObject() {
 
return new ILuaObject() {
  
 
@Override
 
@Override
 
public String[] getMethodNames() {
 
public String[] getMethodNames() {
return new String[] { /* TODO: myObjectを扱うためのメソッド名の配列 */ };
+
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: myObjectを扱うための各メソッドの処理を実装
+
// TODO: myObject を扱うためのメソッドを実装
 
return null;
 
return null;
 
}
 
}
55行目: 48行目:
 
};
 
};
 
}
 
}
 
/* 略 */
 
  
 
}
 
}
 
</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の実装クラスのインスタンスは、以下のようなメソッドでLua側へ渡すことができます。
+
実装したILuaObjectオブジェクトは、以下のようなメソッドの引数・戻り値(のObject配列の要素)としてLua側へ渡すことができます。
*'''IPeripheral.callMethod()'''の戻り値のObject[]の要素
+
*IPeripheral.getMethodNames()の戻り値
*'''IComputerAccess.queueEvent()'''の引数のObject[]の要素
+
*IComputerAccess.queueEvent()の引数
*'''TurtleCommandResult.success()'''の引数のObject[]の要素
+
*TurtleCommandResult.success()の引数
  
 
=== Lua側での利用 ===
 
=== Lua側での利用 ===
  
ILuaObjectの実装クラスのインスタンスはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
+
ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
 
 
ここでは、上の例で実装した周辺機器を元に、ILuaObjectの実装部分に手を加えて解説します。
 
 
 
例えば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:
 
-- 周辺機器からILuaObjectを取得
 
local tSample = peripheral.find("sample")
 
local tMyObject = tSample.createMyObject()
 
-- 取得したILuaObjectのメソッド呼び出し
 
tMyObject.getType()
 
tMyObject.getPos()
 
tMyObject.getName()
 
tMyObject.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>
 
以上の仕組みにより、Lua側から呼び出されたメソッドによって、Java側のオブジェクトを操作したり、値を返したりすることができます。
 

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート: