2017年8月24日木曜日

【OpenComputers】Component(構成パーツ)のAPIを利用する方法

※これは、公式Wikiのページ(http://ocdoc.cil.li/component:component_access)を翻訳し、一部補足を加えたたものです。(2017/08/24)
Component APIの一覧は、http://ocdoc.cil.li/api:componentを参照してください。
以下、※はおもに訳注を表します。

<本文>
このページでは、Component(構成パーツ)のAPIをLua内で利用する方法を説明しています。おさらい:Componentとは、接続されたコンピューターで実行されているLuaプログラムにたいして、何らかのAPIを提供する、ブロックやアイテムのことを指します。

(※Computer APIやRobot APIなどはここでいう構成パーツには含まれないと思われます。これらを利用するには、require("xxx")を用いてください。)

アドレス

Componentには、それぞれアドレスが設定されています。このアドレスはUUID、すなわちほかの機器とかぶることのない、オンリーワンなものです。多くの場合、アドレスは短縮表記することが可能です。(※つまり、同一コンピューターに接続されたものの中でかぶらなければ、先頭の数文字のみで元のアドレスと同等の意味を持ちます。イメージはかるたの決まり字のようなものです。)たとえば、短縮表記されたアドレスから、元のアドレスを取得するには、component.get()を用います。特定のブロックのアドレスを調べるには、Ctrlキーを押しながら、Analyzerをもって右クリックしてください。

コンピューターに接続されたComponentの一覧を取得するには、次の通り実行してください。http://ocdoc.cil.li/_export/code/component:component_access?codeblock=0

アイテムは、通常、コンピューターから取り外されたあとでもアドレスを保持します。よって、Hard Driveを一度取り外し再び挿入してもアドレスは変化しません。ただし、これは、ブロックには適用されません。ブロックは破壊し、再度設置すると、毎回新たなアドレスへと変化します。

プライマリーコンポーネント

1種類につき1つのComponentが、プライマリーコンポーネントとして登録されます。もし同種類のコンポーネントが複数ある場合は、プライマリーコンポーネントはランダムに決まります。プライマリーコンポーネントにアクセスするには、component.xxx(xxxにはComponentの種類をいれてください)を用います。
たとえば:http://ocdoc.cil.li/_export/code/component:component_access?codeblock=1

なお、かわりに、component.getPrimary("xxx")を用いることもできます。(※component.xxxはcomponent.getPrimary("xxx")のシンタックスシュガーです。)
もし、プライマリーコンポーネントが存在しない場合(指定された種類のComponentが一つも接続されていない場合)、これはエラーを返すことに注意してください。先に、component.isAvailable("xxx")を用いて、確認することをお勧めします。

プロキシ

さて、Componentのアドレスの取得方法はわかりましたから、次は、Componentの利用方法について学びましょう。これには、2通りの方法があります。第一に、component.invoke(address, method, ...)を呼び出す方法です。たとえば、http://ocdoc.cil.li/_export/code/component:component_access?codeblock=2

しかし、推奨されている方法は、もう一つの方法、プロキシを取得する方法です。プロキシは、簡単に言えば、API callbackごとに一つの関数を提供するテーブルです。(※この文は原文が理解できませんでした。おそらく、プロキシは関数のテーブルである、という意味だと推測します。)加えて、それぞれのプロキシは2つの要素変数をもちます。addressとtypeです。プロキシは次のように、取得することができます。http://ocdoc.cil.li/_export/code/component:component_access?codeblock=3

component.getPrimaryやcomponent.xxxは実際にはこのプロキシを取得する関数です。


(※以下は、個人的には知らなくてもあまり困らない情報だと思います)

Direct Calls

一部のcomponentのcallbackはdirect callsとして実行されます。Direct Callsはコンピューターのworkerスレッド内で実行されるため、素早く応答します。通常の呼出しでは、競合やその他のスレッドの問題が起こるのを避けるため、メインのサーバースレッドにおいて実行されます。この場合、1tick(50ms)を必要とします。ただしこれはComponent APIのみに適用されることに注意してください。

Signals

componentを利用する際に重要なものに、Signals(原文)があります。これは、componentが外部環境の変化やイベントをコンピューターに知らせるために送るものです。たとえば、ユーザーによる入力はsignalsを利用してcomputerに伝えられます。コンピューターは、自身のsignalsを送ることもできます。これは、コードの再利用やコード内の別の部分に対して非同期的に情報を送るのに役に立つことがあります。

0 件のコメント:

コメントを投稿