提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | + | {{Stb}} | |
{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.65~"}} | {{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.65~"}} | ||
− | == | + | == イベントの追加 == |
− | + | ComputerやTurtleからperipheral.call関数でメソッドを呼び出せる周辺機器ブロックを追加する。 | |
− | |||
− | |||
=== ソースコード === | === ソースコード === | ||
− | 「 | + | 「[[ComputerCraft_API/周辺機器の追加|周辺機器の追加]]」のソースコードを元にして、変更部分のみを解説する。 |
*TileSamplePeripheral.java | *TileSamplePeripheral.java | ||
29行目: | 27行目: | ||
@Override | @Override | ||
public String[] getMethodNames() { | public String[] getMethodNames() { | ||
− | return new String[] {"fn1", "fn2"}; | + | return new String[] {"fn1","fn2"}; |
} | } | ||
37行目: | 35行目: | ||
InterruptedException { | InterruptedException { | ||
switch(method) { | switch(method) { | ||
+ | |||
case 0: // fn1 | case 0: // fn1 | ||
return new Object[] {"fn1 called!"}; | return new Object[] {"fn1 called!"}; | ||
76行目: | 75行目: | ||
=== 解説 === | === 解説 === | ||
==== TileSamplePeripheral.java ==== | ==== TileSamplePeripheral.java ==== | ||
− | |||
− | + | まず、接続されたComputerやTurtleへ呼出し可能なメソッドの名前を渡すためにIPeripheral.getMethodNames()を実装する。 | |
− | |||
<source lang = "java"> | <source lang = "java"> | ||
@Override | @Override | ||
public String[] getMethodNames() { | public String[] getMethodNames() { | ||
− | return new String[] {"fn1", "fn2"}; | + | return new String[] {"fn1","fn2"}; |
} | } | ||
</source> | </source> | ||
− | + | ↑呼出し可能なメソッド名をString型配列として返す。この戻り値はゲーム中、常に同じ内容を返すようにする。 | |
− | |||
− | + | ComputerやTurtleがメソッドを呼び出した時の処理はIPeripheral.callMethod()で実装する。 | |
− | |||
<source lang = "java"> | <source lang = "java"> | ||
@Override | @Override | ||
97行目: | 92行目: | ||
InterruptedException { | InterruptedException { | ||
switch(method) { | switch(method) { | ||
+ | |||
case 0: | case 0: | ||
// fn1が呼び出された時の処理 | // fn1が呼び出された時の処理 | ||
108行目: | 104行目: | ||
} | } | ||
</source> | </source> | ||
− | + | ↑ここではどのメソッドが呼び出されたのかを示すmothodの値がポイントで、これはgetMethodNames()の戻り値のString型配列のインデックスに対応している。この例では、"fn1"が呼び出された時にはmethod = 0、"fn2"が呼び出された時にはmethod = 1となる。methodの値をswitch文で分岐させれば簡潔に各メソッドの処理を書く事が出来る。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | メソッドの戻り値はオブジェクト型の配列。返すべき値が無い時は空のオブジェクト型配列を返せばよい。 | |
<source lang = "java"> | <source lang = "java"> | ||
case 0: // fn1 | case 0: // fn1 | ||
return new Object[] {"fn1 called!"}; | return new Object[] {"fn1 called!"}; | ||
</source> | </source> | ||
+ | ↑サンプルのfn1では、単純に"fn1 called!"という文字列を返している。 | ||
− | + | サンプルのfn2では引数の取得、例外のthrow、変数のreturnを行っている。 | |
− | |||
<source lang = "java"> | <source lang = "java"> | ||
case 1: // fn2 | case 1: // fn2 | ||
133行目: | 124行目: | ||
return new Object[] {arguments[0], arguments[0].getClass().getName()}; | return new Object[] {arguments[0], arguments[0].getClass().getName()}; | ||
</source> | </source> | ||
− | + | ↑引数なしでメソッドが呼び出されたなら例外LuaException("Expected argument")を発生、第一引数にJava側で受け取れない値が指定されていたら例外LuaException("Illegal argument")を発生させている。戻り値は指定した第一引数そのものと、そのJava側でのクラス名を返している。 | |
− | |||
− | |||
− | |||
+ | *引数や戻り値の型 | ||
+ | メソッド呼出し時の引数はオブジェクト型配列argumentsで渡される。引数や戻り値の型は自動的に変換される。<br> | ||
+ | Lua→Java、Java→Luaでの型変換は以下の通り。 | ||
{| class="wikitable" | {| class="wikitable" | ||
− | + | !colspan="2"|呼出し | |
− | !colspan="2"| | + | !colspan="2"|戻り値 |
− | !colspan="2"|戻り値 | ||
|- | |- | ||
!Lua | !Lua | ||
155行目: | 145行目: | ||
|number | |number | ||
|Double | |Double | ||
− | | | + | |Integer<br>Float<br>Double |
|number | |number | ||
|- | |- | ||
166行目: | 156行目: | ||
|HashMap | |HashMap | ||
|HashMap | |HashMap | ||
− | |||
− | |||
− | |||
− | |||
− | |||
|table | |table | ||
|- | |- | ||
179行目: | 164行目: | ||
|} | |} | ||
− | + | *例外 LuaException | |
− | + | callMethod()の処理中で例外LuaExceptionをthrowすると、そこで'''処理を中止'''してComputerやTurtleの画面にエラーメッセージを表示する。ComputerCraftの周辺機器では主にメソッドの引数の不備を指摘する時に用いられているようだ。 | |
− | |||
− | |||
− | callMethod()の処理中で例外LuaExceptionをthrowすると、そこで'''処理を中止''' | ||
<source lang = "java"> | <source lang = "java"> | ||
throw new LuaException("Expected argument"); | throw new LuaException("Expected argument"); | ||
</source> | </source> | ||
− | + | ↑サンプルのfn2で、引数が何も指定されずに呼び出された時に発生させている例外。ComputerやTurtleの画面上には、<br> | |
<code style="color: red">'''lua:1: Expected argument'''</code><br> | <code style="color: red">'''lua:1: Expected argument'''</code><br> | ||
− | + | のように表示される。フォーマットは、<code>プログラム名:行番号:内容</code>。 | |
− | |||
− | |||
− | |||
− | |||
− | + | *Minecraftとの競合 | |
+ | 今回の例では問題ないが、callMethod()はComputerCraftのLuaスレッドから呼び出されているため、callMethod()からの一連の処理中において、Minecraftスレッドから変更され得るフィールドへのアクセスは競合が発生する可能性がある。従ってそのような処理では適宜synchronized等で排他制御する必要がある。 |