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

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

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
11行目: 11行目:
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
 
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
 
ILuaObjectの実装クラスのインスタンスをLua側へ渡すことで、Lua側からは実装したメソッドを通してJava側のオブジェクトを操作することができます。
 
ILuaObjectの実装クラスのインスタンスをLua側へ渡すことで、Lua側からは実装したメソッドを通してJava側のオブジェクトを操作することができます。
 
次の例では、MyObjectというJava側で作成したオブジェクトをILuaObjectを用いてLua側で扱えるようにしています。
 
  
 
実装例(IPeripheral.callMethod()の戻り値でLua側へ渡す場合):
 
実装例(IPeripheral.callMethod()の戻り値で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[] { /* 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;
 
}
 
}
55行目: 44行目:
 
};
 
};
 
}
 
}
 
/* 略 */
 
  
 
}
 
}
75行目: 62行目:
  
 
ILuaObjectの実装クラスのインスタンスはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
 
ILuaObjectの実装クラスのインスタンスはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。
 
ここでは、上の例で実装した周辺機器を元に、ILuaObjectの実装部分に手を加えて解説します。
 
  
 
例えばJava側で以下のようにILuaObjectを実装した場合、
 
例えばJava側で以下のようにILuaObjectを実装した場合、
90行目: 75行目:
 
<source lang = "lua">
 
<source lang = "lua">
 
-- Lua:
 
-- Lua:
-- 周辺機器からILuaObjectを取得
+
-- 以下 tObject に、実装した ILuaObject が入っているものとする
local tSample = peripheral.find("sample")
+
tObject.getType()
local tMyObject = tSample.createMyObject()
+
tObject.getPos()
-- 取得したILuaObjectのメソッド呼び出し
+
tObject.getName()
tMyObject.getType()
+
tObject.kill()
tMyObject.getPos()
 
tMyObject.getName()
 
tMyObject.kill()
 
 
</source>
 
</source>
 
Lua側でメソッドを呼び出した場合、Java側では実装したcallMethod()が呼び出されます。
 
Lua側でメソッドを呼び出した場合、Java側では実装したcallMethod()が呼び出されます。
119行目: 101行目:
 
}
 
}
 
</source>
 
</source>
以上の仕組みにより、Lua側から呼び出されたメソッドによって、Java側のオブジェクトを操作したり、値を返したりすることができます。
 

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

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

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

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