翻訳作業場トップページ このドキュメントは $FG_ROOT/Docs/Readme.Joysticks.htmlの日本語訳です。


 

ジョイスティック・キーボードの設定方法

version 0.9.8.1 13/10/2005 Author John Check (FlightGear1.9.1添付バージョン)

この文書はFlightGear0.7.7以降を対象として書かれています。 ジョイスティックがあなたのOS上で正常に認識され、動作しているという前提で書いています。この文書はLinuxユーザーの視点で書かれていますが、しかしこの情報は他のプラットフォームでも有効です。 (訳注:訳者はWindowsVistaユーザーです。 David Megginsonに感謝します。誰がXMLの実装をしたかはさておき、彼の解説資料はスマートに見えました。

 

いくつかの歴史

初期のFGFSのジョイスティックの軸(Axis)/ボタン(button)と、キーバインディングはハードコードされていました。もしデフォルトのジョイスティックの設定を使用しない、もしくは違うキーバインディングを使いたい場合、ソースコードを修正して再コンパイルする必要がありました。

幸運な事に、v0.7.5.aの頃に"プロパティマネージャ"が与えられ、ジョイスティックで簡単にパラメータをセットできるようになりました。 バージョン0.7.7ではプロパティマネージャの役割が拡張され、イベントとコマンドを束ねることが出来るようになりました。 このコードは、FGInputとして知られていて、ジョイスティックと同様にキーボードのコマンドバインディングを構成するのに使用されます。 バージョン0.7.9では条件付けが許容され、編集された決定ツリーを加えました。(修正希望)

 

最も重要な事:

私は、ジョイスティックとキーボードについては後で書くつもりです。 FGInputは一般的なものを十分に扱えます。それは、ジョイスティックのボタンとキーボードのイベントを同様に扱います。 さまざまな方法でキーボードまたはジョイスティックのバインディングを記憶できます。使える方法は以下のとおりです:

 ソース  場所  書式   有効範囲
command lineSTDINsee examplesそのセッションのみ
.fgfsrc~/コマンドラインオプション現在のユーザーのみ
system.fgfsrc$FG_ROOTコマンドラインオプションシステム全体
joystick.xml$FG_ROOTXMLプロパティリストシステム全体
keyboard.xml$FG_ROOTXMLプロパティリストシステム全体

訳者注:以降、joystick.xmlとkeyboard.xmlについての解説が主体となります。

 

XMLについて

あなたがこれを疑問に思っている時のために、XMLは「eXtensible Markup Language」と書いておきます。 これは、HTMLに非常に似ていますが、(訳者追記:XML文書に使う場合に限って言えば)あなた自身で定義したタグを使用できます。

さて、FGFSの場合では、私たちはあなたがジョイスティック/キーボードを構成するために必要とするタグを定義しました。XMLは階層的に組織化された構造を記述するのに適しています。FGFSで使用しているプロパティツリーのような、外部のアプリケーションへの内容です。あなたは、FGFSのためにXMLファイルを設定するには、以下の開始タグと終了タグをペアで記述しなければなりません。

<PropertyList>
 <!-- HTMLと同じように、<!-- -->で囲った部分はコメントです。 -->
</PropertyList>
 

[Help]>[Joystick Information]の情報からジョイスティックの情報を集める

注意:この項は原文が現状に追いついていないため、sambarが追加したものです。

今まではjs_demoでしかジョイスティックの情報を得ることが出来ませんでしたが、1.9.0ではもっと楽な方法があります。現在の段階ではまだ限られた情報しか得られませんが、いずれ改善されるでしょう。

  1. ジョイスティックの各軸、特にスロットルレバーを0点としたい位置にしてください。 エルロンやエレベータは何もしなくても勝手に中心に来るでしょう。
  2. FlightGearを起動してください。
  3. FlightGearの画面の上部にあるメニューバーの、 [Help]を開き、その中の[Joystick Information]を選択してください。
  4. すると、以下のようなメニューが出るはずです。 (画像をここに貼り付ける予定。)

これは、WindowsVista(x64)でCH Products製のヨークとラダーをジョイスティックに繋いだときの物です。WindowsVistaやXPでは、現在ジョイスティックの自動認識が正常に機能せず、日本語環境では「Joystick#0: Microsoft PC *W***C*X*e*B*b*N *h」と表示されることがあります。対処法は後述します。

幸運にも文字化けせずに、接続したジョイスティックの名前を検出できた場合は、それを元に自動で認識できるので、 読み込んだファイル名を確認して、正しいジョイスティック定義ファイルを読み込んでいるか確認してください。

もし正しいジョイスティック定義ファイルを読み込まず、デフォルトのジョイスティック定義ファイルを読み込んでいる場合

  1. まず、検出されたジョイスティック名をメモする。例えば、Saitek X45を「Saitek X45 Flight Controller」として検出している場合、それをメモしておきます。
  2. ジョイスティックのメーカー名と、検出された名前を元に、$FGROOT/Input/Joysticks/メーカー名/製品名.xml(この場合、$FGROOT/Input/Joysticks/Saitek/X45.xml)を探して、それを開いてください。無ければ「ジョイスティック定義ファイルが無い場合」へ進んでください。
  3. 「定義ファイルはあるし、ジョイスティック名も正常に検出しているにもかかわらず、自動でそれを読み込まない」状態ですので、先ほどメモしたジョイスティック名を以下の要領で追加してください。
<PropertyList>
<name>Saitek X45</name>
<name>Saitek Saitek X45</name>
<name>Saitek X45 Flight Controller USB</name>
<name>Saitek X45 Flight Control Stick </name>
<name>Saitek Saitek X45 Flight Control Stick </name>  <!--ここまで元々ある行-->
<name>Saitek X45 Flight Controller</name> <!--ここが追加した行 -->

「Joystick#0: Microsoft PC *W***C*X*e*B*b*N *h」と文字化けして表示された時の対処法

$FGROOT/Joysticks.xmlを以下の要領で修正し、読み込むべきジョイスティック定義ファイルを手動で指定すると良いでしょう。

<js n="0" include="Input/Joysticks/Saitek/ST290-Pro.xml"/>

もし適切なジョイスティック定義ファイルが見当たらない場合には「ジョイスティック定義ファイルが無い場合」を読んでください。

ジョイスティック定義ファイルが無い場合

$FGROOT/input/Joysticks/Default/four-axis-joystick.xml内の<name>タグを、先ほどの[Joystick Information]で取得した自分のジョイスティック名に書き換えれば、「一応」飛べるようになります。 ただし、ジョイスティック名が文字化けしていた場合には、このファイルは「とりあえず」何もしないでおき、$FGROOT/Joysticks.xmlを以下のように書き換えてください。

 <js n="0" include="Input/Joysticks/Default/four-axis-joystick.xml"/>

そして、画面上の「Aileron」「Elevator」「Throttle」「Rudder」の数値を監視しながら、色々な軸を操作してください。

 

js_demoを使用して、ジョイスティックの出力をどのプロパティに割り当てるか決める

FlightGearには、かつてjs_demoユーティリティが同梱されていました。(1.9.0以降は同梱されていませんが、toshiさんのご好意により、FlightGear JPにアップロードされています) これは、ジョイスティックの数と能力について調査する強力なツールです。 ジョイスティックを操作しながらjs_demoの出力を監視すれば、軸/ボタンに対して割り当てる操作を決める事ができます。一般的に、*NIX環境では付番がゼロから始まることに注意してください。 以下の例では、システムで、1個のジョイスティック(js0)を接続します。この出力は、4ボタンとスロットル付きのアナログGravis BlackHawkジョイスティックの物です。

js_demoの典型的な出力

Joystick test program.
~~~~~~~~~~~~~~~~~~~~~~
Joystick 1 not detected    <!-- ジョイスティック番号は0から始まります -->
Joystick 2 not detected
+--------------JS.0--------------+
| Btns    Ax:0   Ax:1    Ax:2    |                    
+--------------------------------+
| 0000    +0.0   +0.0    -1.0    |

js_demoの内部では、button0は2進数で1の位、button1は2の位、button2は4の位・・・と扱われますが、画面上では16進数で表されます。

画面表示(16進数)押したボタン2進数での表現(参考)
0001button 0000000000000001
0002button 1000000000000010
0004button 2000000000000100
0008button 3000000000001000
0010button 4000000000010000
0020button 5000000000100000
0040button 6000000001000000
0080button 7000000010000000
000abutton 1 と button 3 の同時押し000000000001010

・・・といった要領で8000(button 15)まで続きます。 (訳注:16進数で表示されることを強調するため、0014から000aに変更)

 

デフォルトでのジョイスティックのプロパティ

 

じゃあ、今度は何をするか

先ほど集めたUSBジョイスティック(orジョイスティックポート)からの出力が何であるか分かったので、あなたは多分FGInputを今すぐ使いたいと思っているでしょう。もしこれ以前のFGFSのバージョンでジョイスティックを設定するのに慣れているなら、あなたは「コマンドマネージャ」をセクションまでスキップできます。 もし、新しいFGFSユーザーなら、いくつかの概念を理解するために次の項を読んでください。それはまた、コマンドマネージャでまだ実装されていない、古いジョイスティックオプションをカバーします。

 

「生」のジョイスティックの値を修正する

これらのコンセプトは、ジョイスティックバインディングに理由付けする事です。 生の値をそのままジョイスティックの軸として使う事が適切でない場合があります。また、ベストパフォーマンスを得るために実験を重ねる場合、基本概念があなたを救うことを理解してください。また、全てのジョイスティックが同じ状態で作られるとは限りません。(訳注:必ず製造時に誤差を含んでいます)

軸のプロパティに対する修正順序はこのようになっています。

  1. 生のジョイスティックの値
  2. デッドゾーン(dead-band,入力を無視する範囲)をフィルタリングします。(deadbandは、コマンドマネージャの外で実行されます。)
  3. オフセット(offset,中心からのズレ)を修正します。
  4. 3までの値に、factorを乗算します。
  5. この結果が得られた値を、FlightGearのプロパティのコントロールに使用します。

別の表現をすれば、下記のようになります。 cooked_value = (( raw_value > dead-band ) + offset) * factor

軸のプロパティは以下の通りです。

 

dead-band

-1      0      1
 ...............
-1     | |     1
        ^
    dead-band

このエリア内の信号は無視されます。どんな信号も無視される範囲を作成することによってノイズや、品質の悪い電圧計/可変抵抗を補います。 dead-bandは0位置に依存します。 デフォルトの、エレベーターとエルロンのための0.1の設定はガク引きに対して寛容です。数値を小さくすると、よりきつい感じをもたらします。 スロットル等、いくつかの場合では、あなたはdead-bandを設定したがっていないかもしれません。 この場合0.0の値を使用してください。

 

offset

-1 0         1
 .............
-1 ^         1
 offset

軸の操作範囲を広げたい場合に使用します。スロットル等、0が最小値になる場合で、ラダー等とは違ってセンターが無い場合に使用します。標準的には-1.0を使用します。

 

tolerance

ジョイスティックのジッターの補償に使われて、toleranceの本質は「gate」です。 それに満たないジョイスティックの動きは無視されます。dead-bandとは異なり、toleranceは軸がいったいどこで落ち着いているか、で決まります。

 

factor

軸の操作量に対する「倍数」です。この値が小さいと、FGFS上での操作限界に達しないコントロールしかできなくなります。 負の数を設定すると、軸の操作とFGFS上での動きが反対になります。デフォルト値は1.0です。 筆者のケースでは、スロットルを逆向き(手前に引くとスロットルを開く設定)にしたかったため、-1.0を設定しました。 (訳注:第二次世界大戦の頃まではフランス機のように「スロットルレバーを手前に引いて開き、奥に押して閉じる」機種もあったので、それを再現するためだと思われる。ちなみに、旧日本軍は陸海軍でそれぞれ違ったそうな。)

 

コマンドマネージャ:

以前のFGFSはジョイスティックの出力で直接プロパティマネージャーを操作していました。FGFS v0.7.7以降は、操作した時にイベントを発生させてコマンドを実行するように変更されました。バインディングは効果があるようなコマンドを「指定しなければなりません」。都合が良いことに、コマンドのリストは大体2種類に分けられます。 (訳注:nasalスクリプトを組み込んだ場合、大抵飛行機の制御に使われるので、とりあえず後者に分類します)

 

描画・ファイル関連

コマンドオプション用途
nullなし前のバインディングをクリアします。(翻訳自身なし・・・まあ使う機会もあまり無いか)
exitなしFGFSを終了します。
loadファイル名(注1)フライトのロード
saveファイル名(注1)フライトのセーブ
load-panelパス(注2)パネルの変更/再読み込み
load-preferencesパス(注2)設定のロード (注3)
screen-captureなし./fgfs-screen.ppmにスクリーンショットの保存
view-cycleなしパイロットの視点の方向を変える

飛行機の制御

コマンドオプション効果
property-toggleproperty指定したプロパティの値のオン/オフ(true/false)の切り替え
property-assignproperty , value指定したプロパティの値を指定したものに変える
property-adjustproperty , step一度操作する毎にstepだけ増やす
property-swapproperty[0] , property[1]2つのプロパティの値を入れ替える
property-scaleproperty , offset , factor生のジョイスティックの値を先述通り処理してプロパティに与える
nasalscriptnasalスクリプトを実行します。nasalについての詳細はNasal マニュアルを参照してください。
 

バインディング

一つのコマンドを<binding> </binding>で束ねることで、1つのボタン/軸に複数のコマンドを割り当てる事ができます。 バインディングがXMLで指定されていると、インデックスがなぜか自動的に作成されます。もしXMLを避けたいならば、複数のバインディングをコマンドラインオプションで指定しなければいけません。

 

ジョイスティックの軸

これはXMLでのジョイスティックの軸の設定サンプルです:

<axis n="0">                   <!-- 設定したい軸の番号を指定します -->
 <desc>Aileron</desc>          <!-- 軸の概要について (無くても可) -->
 <binding>                     <!-- バインディングを開始します。 -->
  <command>property-scale</command>    <!-- コマンドを指定します -->
  <property>/controls/flight/aileron</property>   <!-- 割り当てたいプロパティを指定します -->
 </binding>                    <!-- バインディングタグを閉じます -->
</axis>                        <!-- axisタグを閉じます -->

先ほど、プロパティツリーが階層構造であると書いたことを覚えていますか? 注意深い人なら、構造を保つにはタグを入れ子にする必要がある事に気付くでしょう。 このバインディングが/input/joysticks/js/ のコンテキストに現れるので、同等のコマンドラインのオプションでは以下のようになり、省略可能な'desc'以外が現れると言う点で同じです。

 --prop:/input/joysticks/js[0]/axis[0]/binding/command=property-scale
 --prop:/input/joysticks/js[0]/axis[0]/binding/property=/controls/flight/aileron

コマンドラインオプションで階層構造を表現するためにどのようにパスを使用しているか見てみましょう。 すばらしいと思ったら、次はREADME.xmlpanelを読んでください。FGFSのXMLの設定は簡単で、(訳注:何かを作ってくれる事が)ユーザー全員のためにもなります。

 

本題に戻りましょう。"property-scale"コマンドは"offset"、"factor"の値を認識します。以下の例では"type"の値で、double形(倍精度浮動小数)を指定しています。 double形の方がよりステップがはっきり区別されていて、単なるfloat形よりも滑らかな動作をさせます。

<axis n="2">
 <desc>Throttle</desc>
 <!-- 下記の「dead-bandについての重要事項」も見てください -->
 <binding>
  <command>property-scale</command>
  <property>/controls/engines/engine[0]/throttle</property>
  <offset type="double">-1.0</offset>
  <factor type="double">-0.5</factor>
 </binding>
</axis>

もしくは

--prop:/input/joysticks/js[0]/axis[2]/binding/command=property-scale
--prop:/input/joysticks/js[0]/axis[2]/binding/property=/controls/engines/engine[0]/throttle
--prop:/input/joysticks/js[0]/axis[2]/binding/offset=-1.0
--prop:/input/joysticks/js[0]/axis[2]/binding/factor=-0.5

dead-bandについての重要事項

あなたは、先述の「ジョイスティックの値を修正する」セクションに書かれていた通り、dead-bandがコマンドマネージャの外で実行されることを思い出してください。 これは、デッドバンドを適用したいなら、dead-bandタグが他のタグに先行しなければならないことを意味します。もしコマンドラインを使用するなら、'binding'を省略し、同様に下記のようにしてください。

--prop:/input/joysticks/js[0]/axis[2]/dead-band=0.005
 

ジョイスティックのボタンのプロパティ

ボタンは本来ブーリアン型(true,falseの2つの値だけで表すデータ形式で、少しの事に使うことができます。これによって、瞬間的な動作、繰り替えし動作、普通の切り替え操作に使うことが出来ます。簡単にそれらができるように、ボタンの機能を変更するいくつかのタグがあります。

<repeatable>

<step>

<value>

<mod-up>

このサンプルは、XMLでのジョイスティックのボタンの宣言です。

<button n="1">                        <!-- どのボタンかを指定します -->
 <desc>Elevator trim up</desc>  <!-- ボタンの概要(必須ではありません) -->
 <repeatable>true</repeatable>  <!-- Ok, repeatableの指定はコマンドマネージャの外でも可能です -->
  <binding>                           <!-- バインディングを開始します-->
   <command>property-adjust</command>           <!-- コマンドを指定します。-->
   <property>/controls/flight/elevator-trim</property> <!-- 操作するプロパティを指定します-->
   <step type="double">0.001</step>
  </binding>
</button>

コマンドラインでは、以下のようになります。

 --prop:/input/joysticks/js[0]/button[1]/repeatable=true     <-- 見ての通り'binding'はありません -->
 --prop:/input/joysticks/js[0]/button[1]/binding/command=property-adjust
 --prop:/input/joysticks/js[0]/button[1]/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js[0]/button[1]/binding/step=0.001

これは多少高度な設定例で、ボタン4を押した時に左車輪だけブレーキをかけ、ボタンを離すと自動的にブレーキが解除されます。

<button n="4">
 <desc>Left brake</desc>
 <binding>
  <command>property-assign</command>
  <property>/controls/gear/brake-left</property>
  <value type="double">1.0</value>    <!-- ブレーキは1.0に設定されます -->
  </binding>
   <mod-up>                    <!-- パーキングブレーキではないので、ボタンを離したら解除される必要があります -->
    <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-left</property>
    <value type="double">0.0</value>       <!-- 1.0 がONで、0.0 がオフです -->
   </binding>
  </mod-up>
</button>

初めのバインディングは簡単です:ボタンを押したら、property-assignコマンドが左ブレーキのプロパティ(この例では、/controls/gear/brake-left)の持つ値を1.0(この場合、フルブレーキ)に設定します。 しかし、次のバインディングは"mod-up"要素の入れ子の中にあり、ボタンを離したときに'property-assign'コマンドが実行され、左ブレーキの値を0.0(この場合、解除)に設定します。 同じ値を何度も割り当てないように、"repeatable"はデフォルトでオフになっています。

コマンドラインのオプションで同じことをするなら:

 --prop:/input/joysticks/js[0]/button[4]/binding/command=property-assign
 --prop:/input/joysticks/js[0]/button[4]/binding/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[4]/binding/value=1.0
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/command=property-assign
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/value=0.0

各コンテキスト中に複数のバインディングを含むことができることを覚えておいてください。ここに、ボタン0が押された時に左右両方のブレーキを掛け、ボタンを離すと両方のブレーキが解除される、高度な例を挙げます。

 <button n="0">
  <desc>Brakes</desc>
  <binding>
   <command>property-assign</command>
   <property>/controls/gear/brake-left</property>
   <value type="double">1.0</value>
  </binding>
  <binding>
   <command>property-assign</command>
   <property>/controls/gear/brake-right</property>
   <value type="double">1.0</value>
  </binding>
  <mod-up>
   <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-left</property>
    <value type="double">0.0</value>
   </binding>
   <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-right</property>
    <value type="double">0.0</value>
   </binding>
  </mod-up>
</button>

これをXMLを使わず、同じことをコマンドラインオプションでやろうとするとこうなります。 (複数のバインディングを区別するための添え字に注意してください;XMLは、自動的にこれをやってくれます。):

 --prop:/input/joysticks/js[0]/button[0]/binding[0]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/binding[0]/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[0]/binding[0]/value=1.0
 --prop:/input/joysticks/js[0]/button[0]/binding[1]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/binding[1]/property=/controls/gear/brake-right
 --prop:/input/joysticks/js[0]/button[0]/binding[2]/value=1.0
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/property=brakes[0]
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/value=0.0
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/property=brakes[1]
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/value=0.0
 

デジタルHATスイッチ

多くのジョイスティックにはHATスイッチが付いています。これは軸というより、単に4つ(or8つ)のボタンですが、FGFSでは各軸の末端にそれぞれ仮想的なボタンを与えていて、これらの仮想ボタンは"low"と"high"の下位のプロパティを通して指定することができるので、一般のボタンのプロパティのどれでも受け入れることができます。

たとえば、あなたがちょうど表示方向をコントロールしたいならば、あなたは/sim/view/axes/long と /sim/view/axes/latのために、2本の軸を割り当てる事ができます。

<axis n="5">
 <binding>
  <command>property-adjust/command>
  <property>/sim/view/axes/lat</property>
  <step>2.0</step>
 </binding>
</axis>
<axis n="6">
 <binding>
  <command>property-adjust</command>
  <property>/sim/view/axes/long</property>
  <step>2.0</step>
 </binding>
</axis>
もしくは
 --prop:/input/joysticks/js/axis[5]/binding/command=property-scale
 --prop:/input/joysticks/js/axis[5]/binding/property=/sim/view/axes/lat
 --prop:/input/joysticks/js/axis[5]/binding/step=2.0
 --prop:/input/joysticks/js/axis[6]/binding/command=property-scale
 --prop:/input/joysticks/js/axis[6]/binding/property=/sim/view/axes/long
 --prop:/input/joysticks/js/axis[5]/binding/step=2.0
(訳注:この記述、特にプロパティ名は古いです。)

他にも、垂直/水平に2Dパネルをスクロールするために、ボタンとしてHATスイッチを使用したいなら、あなたは<high>と<low>を使用できます。

下記の例は、<high>と<low>を使って、軸をエレベータートリムの調整に使用する場合です。

<axis n="1">
 <low>
  <repeatable>true</repeatable>
  <binding>
   <command>property-adjust</command>
   <property>/controls/flight/elevator-trim</property>
   <step type="double">0.001</step>
  </binding>
 </low>
 <high>
  <repeatable>true</repeatable>
  <binding>
   <command>property-adjust</command>
   <property>/controls/flight/elevator-trim</property>
   <step type="double">-0.001</step>
  </binding>
 </high>
</axis>
 --prop:/input/joysticks/js/axis[1]/low/repeatable=true
 --prop:/input/joysticks/js/axis[1]/low/binding/command=property-adjust
 --prop:/input/joysticks/js/axis[1]/low/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js/axis[1]/low/binding/step=0.001
 --prop:/input/joysticks/js/axis[1]/high/repeatable=true
 --prop:/input/joysticks/js/axis[1]/high/binding/command=property-adjust
 --prop:/input/joysticks/js/axis[1]/high/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js/axis[1]/high/binding/step=-0.001

下のコマンドラインオプションで、リピート間隔を設定できます。リピート間隔を0.05秒にした場合、1秒間に20回繰り返されます。それには、下のオプションを追加してください。

 --prop:/input/joysticks/js/axis[1]/interval-sec=0.05

あなたは、いくつかの軸をブレーキに割り当てる事ができます。そのためには、0.0(ブレーキ無し)と1.0の間の位置を使うことができます(フルブレーキ)

キーボードの設定

キーボードのキーバインディングは、以下の例のようにジョイスティックのボタンのバインディングとほとんど同じです(コンテキストは/input/keyboardです):

<key n="1">
 <name>Ctrl-A</name>
 <desc>Toggle autopilot altitude lock.</desc>
 <binding>
  <command>property-toggle</command>
  <property>/autopilot/locks/altitude</property>
 </binding>
</key>

あなたはまず、いくつかの事に気が付くでしょう。 最初に、インデックス(<key n="m">)で、あなたがバインディングする主要なコードを指定します。この例では、1は<name>で指定しているように、Ctrl+Aに相当します。 一般的にキーコードは255まであり、256より上はファンクションキー(Fn)や矢印キー等の特別なキーを意味します。 下記に、同じ働きのコマンドラインオプションを書きます。

 --prop:/input/keyboard/key[1]/binding/command=property-toggle
 --prop:/input/keyboard/key[1]/binding/property=/autopilot/locks/altitude

('propaty-toggle'コマンドは、trueとfalseの切り替えを行います。従って、プロパティ値以外の物は要りません。)インデックスを省略しないでください!!!

2つ目は、キーの方がジョイスティックのボタンよりも多くの修飾が出来ます。"mod-up"(キーを離した時に作動)に加えて、キーの場合は"mod-alt", "mod-ctrl", "mod-shift" を使う事ができます。 下に例を示します。

<key n="49">
 <name>1</name>
  <mod-shift>
  <desc>Look back left</desc>
  <binding>
   <command>property-assign</command>
   <property>/sim/view/goal-offset</property>
   <value type="double">135</value>
  </binding>
 </mod-shift>
</key>

この例では、'1'キーとShiftキーを同時に押した場合に、左後ろを見るように視界を切り替えます。 注意:これはテンキーの1でしか動きません。テンキーで無く'q'キーの上にある'1'の場合、(当然ながら)'!'のキーコードを送ります

FightGearの使っているinputモジュールは、controlとshiftの同時押しを自動で取得するよう試みます。しかし、"mod-ctrl"の入れ子を使えば"ctrl-A"のバインディングが不要、というわけではなくて、キーコードは32の制御文字を含んでいます。 (翻訳自信なし)

また、新しい入力モジュールは、キーボードのkey-upイベントを検出できるので、タッチに敏感なブレーキ等もジョイスティックと同じように記述できます。

<key n="44">
 <name>,</name>
 <desc>Left brake</desc>
  <binding>
  <command>property-assign</command>
  <property>/controls/gear/brake-left</property>
  <value type="double">1.0</value>
 </binding>
 <mod-up>
  <binding>
  <command>property-assign</command>
  <property>/controls/gear/brake-left</property>
  <value type="double">0.0</value>
  </binding>
 </mod-up>
</key>

今度は、別の方法でブレーキの設定のバインディングをします。この例では、<mod-up>タグが無いので、パーキングブレーキのように働きます。

<key n="66"> 
 <name>B</name>
 <desc>Toggle parking brake on or off</desc>
 <binding>
  <command>property-toggle</command>
  <property>/controls/gear/brake-parking</property>
 </binding>
</key>

nasalスクリプトの使い方

注意:この項はsambarが勝手に追加したものです。

FlightGearには、Nasal というスクリプト言語が実装されていて、ジョイスティックやキーボードの設定ファイルに組み込んだり、あるいは設定ファイルから呼び出したりしてスクリプトを実行する事ができます。 ここでは、Nasalスクリプトそのものの詳しい説明は省略し、既にあるスクリプトの呼び出し方の解説に留めます。 Nasalについての詳しい説明はNasal マニュアルを参照してください。

これは、ボタン5にギアダウンを割り当てる時の設定です。(Input/Joysticks/CH/pro-yoke-usb.xmlより)

<button n="5">
 <desc>Gear down</desc>
 <repeatable>false</repeatable>
 <binding>
  <command>nasal</command>     <!--ここで、nasalを使用しますよ〜、と宣言 -->
  <script>controls.gearDown(1)</script> <!-- <script>と、</script>の間に実行したいスクリプトを書いてください。
 </binding>
 <mod-up>
  <binding>
   <command>nasal</command>
   <script>controls.gearDown(0)</script>
  </binding>
 </mod-up>
</button>

これは、$FGROOT/nasal/controls.nas内のgearDown関数に、ボタンを押した時に1、ボタンを離したら0を引数として与えて実行しています。

var gearDown = func(v) {
    if (v < 0) {
      setprop("/controls/gear/gear-down", 0);
    } elsif (v > 0) {
      setprop("/controls/gear/gear-down", 1);
    }
}

この関数では、与えた引数が正なら車輪を下げ、負なら車輪を上げます。なお、ゼロなら何もせず現状を維持します。

つまり、この例では"property-assign"を使って、同じ動作をさせるバインディングは以下のようにも書けます。

<button n="5>
 <desc>Gear down</desc>
 <repeatable>false</repeatable>
 <binding>
  <command>property-assign</command>
  <property>/controls/gear/gear-down</property>
  <value>1<value>
 </binding>
</button>

なお、「どちらのアプローチで書くのが良いか」については残念ながら「やりたい事次第」としかお答えできませんが、例えば「エレベータにGリミッターを付け加えたい」場合など、やや複雑な処理をしたい場合には後者のアプローチの方が良いでしょう。


翻訳開始 2009/03/22 sambar 仮翻訳終了。 2009/03/24 sambar 「[Help]>[Joystick Information]の情報からジョイスティックの情報を集める」を追加 2009/03/25 sambar 「nasalの使用方法」を追加 2009/03/26 sambar リンク忘れ修正 2009/03/28 sambar 表現の修正 2009/03/29


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS