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

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

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
1行目: 1行目:
[[ComputerCraft_API|ComputerCraft API]] >
+
{{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からperipheral.call()でメソッドを呼び出せる周辺機器ブロックを追加します。
+
ComputerやTurtleからperipheral.call関数でメソッドを呼び出せる周辺機器ブロックを追加する。
 
 
*IPeripheral.getMethodNames()とIPeripheral.callMethod()の実装
 
  
 
=== ソースコード ===
 
=== ソースコード ===
[[ComputerCraft API/1.65/周辺機器の追加|MC1.7 周辺機器の追加]]」または「[[ComputerCraft_API/1.76/周辺機器の追加|MC1.8 周辺機器の追加]]」のソースコードを元にして、変更部分のみを解説します。
+
「[[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 ====
周辺機器のメソッドの名前を返すgetMethodNames()と、呼び出されたメソッドを実際に処理するcallMethod()を実装します。
 
  
*getMethodNames()
+
まず、接続されたComputerやTurtleへ呼出し可能なメソッドの名前を渡すためにIPeripheral.getMethodNames()を実装する。
接続されたComputerから呼出し可能なメソッドの名前をString型の配列として返します。
 
 
<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>
この配列内でのメソッド名の順番は、callMethod()で重要な意味を持ちます。また、この戻り値は常に同じ内容を返すようにします。<br>
+
↑呼出し可能なメソッド名をString型配列として返す。この戻り値はゲーム中、常に同じ内容を返すようにする。
今回は'''fn1'''と'''fn2'''という2つのメソッドを実装します。
 
  
*callMethod()
+
ComputerやTurtleがメソッドを呼び出した時の処理はIPeripheral.callMethod()で実装する。
Computerからメソッドが呼び出されたときの処理を実装します。
 
 
<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>
引数computerにはメソッドを呼び出したComputerのIComputerAccessインスタンスが渡されます。<br>
+
↑ここではどのメソッドが呼び出されたのかを示すmothodの値がポイントで、これはgetMethodNames()の戻り値のString型配列のインデックスに対応している。この例では、"fn1"が呼び出された時にはmethod = 0、"fn2"が呼び出された時にはmethod = 1となる。methodの値をswitch文で分岐させれば簡潔に各メソッドの処理を書く事が出来る。
'''引数mothodは呼び出されたメソッドの番号で、これはgetMethodNames()で返した配列のインデックスに対応しています。'''<br>
 
今回の例では、'''fn1'''が呼び出されたときにはmethod = 0、'''fn2'''が呼び出されたときにはmethod = 1となります。<br>
 
methodの値をswitch文で分岐させれば各メソッドの処理を簡潔に書くことができます。<br>
 
引数argumentsにはメソッド呼出し時に指定された引数がオブジェクト型配列で渡されます。<br>
 
メソッドの戻り値はオブジェクト型の配列です。もしも返すべき値がなかった場合は空のオブジェクト型配列を返します。
 
  
サンプルの'''fn1'''では、単純に"fn1 called!"という文字列を返しています。
+
メソッドの戻り値はオブジェクト型の配列。返すべき値が無い時は空のオブジェクト型配列を返せばよい。
 
<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を行っている。
サンプルの'''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側での型名を返しています。
+
↑引数なしでメソッドが呼び出されたなら例外LuaException("Expected argument")を発生、第一引数にJava側で受け取れない値が指定されていたら例外LuaException("Illegal argument")を発生させている。戻り値は指定した第一引数そのものと、そのJava側でのクラス名を返している。
 
 
==== 引数や戻り値の型 ====
 
メソッドの引数や戻り値の型はComputerCraftによって自動的に変換されます。
 
  
 +
*引数や戻り値の型
 +
メソッド呼出し時の引数はオブジェクト型配列argumentsで渡される。引数や戻り値の型は自動的に変換される。<br>
 +
Lua→Java、Java→Luaでの型変換は以下の通り。
 
{| class="wikitable"
 
{| class="wikitable"
|+Lua⇔Javaでの型変換
+
!colspan="2"|呼出し
!colspan="2"|引数 L→J
+
!colspan="2"|戻り値
!colspan="2"|戻り値 J→L
 
 
|-
 
|-
 
!Lua
 
!Lua
155行目: 145行目:
 
|number
 
|number
 
|Double
 
|Double
|Number
+
|Integer<br>Float<br>Double
 
|number
 
|number
 
|-
 
|-
166行目: 156行目:
 
|HashMap
 
|HashMap
 
|HashMap
 
|HashMap
|table
 
|-
 
|
 
|
 
|[[ComputerCraft_API/1.75/ILuaObjectの利用|ILuaObject]]
 
 
|table
 
|table
 
|-
 
|-
179行目: 164行目:
 
|}
 
|}
  
Luaのtable型はJava側ではHashMapになります。キーおよび値の型もそれぞれ上表に従って変換されます。<br>
+
*例外 LuaException
Luaのtableを使った配列は1オリジンです。キー0に値を代入することは可能ですが、キー0はLuaのipairs()や#演算子の対象にはなりません。
+
callMethod()の処理中で例外LuaExceptionをthrowすると、そこで'''処理を中止'''してComputerやTurtleの画面にエラーメッセージを表示する。ComputerCraftの周辺機器では主にメソッドの引数の不備を指摘する時に用いられているようだ。
 
 
==== 例外 LuaException ====
 
callMethod()の処理中で例外LuaExceptionをthrowすると、そこで'''処理を中止'''してComputerの画面にエラーメッセージを表示します。ComputerCraftの周辺機器では主にメソッドの引数の不備を指摘する時に用いられているようです。
 
 
<source lang = "java">
 
<source lang = "java">
 
throw new LuaException("Expected argument");
 
throw new LuaException("Expected argument");
 
</source>
 
</source>
この例外が発生した場合、その時点でプログラムの処理は中止され、Computerの画面上には、<br>
+
↑サンプルの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>''' です。<br>
+
のように表示される。lua:の後ろの数字はLuaスクリプトの行番号。
この例では"lua"というLuaプログラム内の1行目のperipheral.call()で呼ばれた周辺機器メソッドの処理中にLuaException("Expected argument")がthrowされたことを表します。
 
 
 
==== Minecraftとの競合 ====
 
''※今回のサンプルでは問題ありません''
 
  
callMethod()はComputerCraftのLuaスレッドから呼び出されているため、callMethod()の処理中に、Minecraftのスレッドからアクセスされる可能性のあるフィールドへアクセスすると、競合が発生する可能性があります。従って、そのような処理では適宜synchronizedなどで排他制御する必要があります。
+
*Minecraftとの競合
 +
今回の例では問題ないが、callMethod()はComputerCraftのLuaスレッドから呼び出されているため、callMethod()からの一連の処理中において、Minecraftスレッドから変更され得るフィールドへのアクセスは競合が発生する可能性がある。従ってそのような処理では適宜synchronized等で排他制御する必要がある。

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

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

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

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