[[翻訳作業場トップページ]]
このドキュメントは $FG_ROOT/Docs/Readme.Joysticks.htmlの日本語訳です。
----
#contents
#br
*ジョイスティック・キーボードの設定方法 [#d239370e]
version 0.9.8.1 13/10/2005 Author John Check (FlightGear1.9.1添付バージョン)

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


#br
*いくつかの歴史 [#ye2ba402]

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

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

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

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

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

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

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

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

#br
*[Help]>[Joystick Information]の情報からジョイスティックの情報を集める [#ma517d6c]
注意:この項は原文が現状に追いついていないため、sambarが追加したものです。

今まではjs_demoでしかジョイスティックの情報を得ることが出来ませんでしたが、1.9.0ではもっと楽な方法があります。現在の段階ではまだ限られた情報しか得られませんが、いずれ改善されるでしょう。
+ジョイスティックの各軸、特にスロットルレバーを0点としたい位置にしてください。
エルロンやエレベータは何もしなくても勝手に中心に来るでしょう。
+FlightGearを起動してください。
+FlightGearの画面の上部にあるメニューバーの、 [Help]を開き、その中の[Joystick Information]を選択してください。
+すると、以下のようなメニューが出るはずです。
(画像をここに貼り付ける予定。)

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


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

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

 <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」と文字化けして表示された時の対処法 [#zac264d4]
$FGROOT/Joysticks.xmlを以下の要領で修正し、読み込むべきジョイスティック定義ファイルを手動で指定すると良いでしょう。
 <js n="0" include="Input/Joysticks/Saitek/ST290-Pro.xml"/>

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

**ジョイスティック定義ファイルが無い場合 [#o0c52817]

$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」の数値を監視しながら、色々な軸を操作してください。

#br
*js_demoを使用して、ジョイスティックの出力をどのプロパティに割り当てるか決める [#c43303c1]
FlightGearには、かつてjs_demoユーティリティが同梱されていました。(1.9.0以降は同梱されていませんが、toshiさんのご好意により、[[FlightGear JPにアップロードされています:http://flightgear.jpn.org/modules/d3downloads/index.php?page=visit&cid=6&lid=20]]) これは、ジョイスティックの数と能力について調査する強力なツールです。
ジョイスティックを操作しながら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進数での表現(参考)
,0001,button 0,000000000000001
,0002,button 1,000000000000010
,0004,button 2,000000000000100
,0008,button 3,000000000001000
,0010,button 4,000000000010000
,0020,button 5,000000000100000
,0040,button 6,000000001000000
,0080,button 7,000000010000000
,000a,button 1 と button 3 の同時押し,000000000001010

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

#br
*デフォルトでのジョイスティックのプロパティ [#f5c9d9eb]

-Axis 0    =  エルロン
-Axis 1    =  エレベータ
-Axis 2    =  ラダー
-Axis 3    =  スロットル 
-Button 0  =  両車輪のブレーキ
-Button 1  =  エレベータトリム (up)
-Button 2  =  エレベータトリム (down)

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

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

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

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

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

軸のプロパティは以下の通りです。
#br
**dead-band [#sb679174]
 
 -1      0      1
  ...............
 -1     | |     1
         ^
     dead-band

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

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

軸の操作範囲を広げたい場合に使用します。スロットル等、0が最小値になる場合で、ラダー等とは違ってセンターが無い場合に使用します。標準的には-1.0を使用します。
#br
**tolerance [#n6d52d91]
ジョイスティックのジッターの補償に使われて、toleranceの本質は「gate」です。
それに満たないジョイスティックの動きは無視されます。dead-bandとは異なり、toleranceは軸がいったいどこで落ち着いているか、で決まります。
#br
**factor [#l2b4f852]
軸の操作量に対する「倍数」です。この値が小さいと、FGFS上での操作限界に達しないコントロールしかできなくなります。
負の数を設定すると、軸の操作とFGFS上での動きが反対になります。デフォルト値は1.0です。
筆者のケースでは、スロットルを逆向き(手前に引くとスロットルを開く設定)にしたかったため、-1.0を設定しました。
(訳注:第二次世界大戦の頃まではフランス機のように「スロットルレバーを手前に引いて開き、奥に押して閉じる」機種もあったので、それを再現するためだと思われる。ちなみに、旧日本軍は陸海軍でそれぞれ違ったそうな。)
#br
*コマンドマネージャ: [#ba642863]
以前のFGFSはジョイスティックの出力で直接プロパティマネージャーを操作していました。FGFS v0.7.7以降は、操作した時にイベントを発生させてコマンドを実行するように変更されました。バインディングは効果があるようなコマンドを「指定しなければなりません」。都合が良いことに、コマンドのリストは大体2種類に分けられます。
(訳注:nasalスクリプトを組み込んだ場合、大抵飛行機の制御に使われるので、とりあえず後者に分類します)

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

-(注1)セーブ/ロードは現在の作業ディレクトリに依存します。
-(注2)パスはあなたがロードしたいファイルを含んでいて、$FG_ROOTを基準にしています。そして、それはベースパッケージの位置でもあります。デフォルト値は、/sim/panel/path (preferences.xmlより) か、preferences.xmlにセットしていないならPanel/Default/default.xmlです。デフォルト値はpreferences.xmlで設定したものになります。 
-(注3)これは、何もバインディングされていないので、初めに実験するには良いかもしれません。設定を再ロードすることで、FGFSのリスタートをすることなく、色々な設定をテストすることができます。あなたは、後でそれを移動/削除することができます。
#br
**飛行機の制御 [#z3a44764]
, コマンド , オプション , 効果 
, property-toggle , property , 指定したプロパティの値のオン/オフ(true/false)の切り替え 
, property-assign , property &#44; value , 指定したプロパティの値を指定したものに変える 
, property-adjust , property &#44; step , 一度操作する毎にstepだけ増やす 
, property-swap , property[0] &#44; property[1] , 2つのプロパティの値を入れ替える 
, property-scale ,property &#44; offset &#44; factor , 生のジョイスティックの値を先述通り処理してプロパティに与える 
, nasal , script , nasalスクリプトを実行します。nasalについての詳細は[[Nasal マニュアル]]を参照してください。

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

#br
*ジョイスティックの軸 [#qd615b25]

これは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の設定は簡単で、(訳注:何かを作ってくれる事が)ユーザー全員のためにもなります。
#br
本題に戻りましょう。"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についての重要事項 [#sef7dec7]

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

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

**<repeatable> [#udf46e42]
-trueかfalseを指定します。trueだった場合、ボタン(orキー)を押している間、繰り返しイベントが発生します。下記の例では、押している間中イベントが発生し続け、その結果、押している間中トリムが変化します。falseだった場合、押し続けても、1度だけイベントが発生します。デフォルトではfalseです。

**<step> [#qc7c8989]
-proparty-adjustコマンドに、一度ボタンを押すごとに変化する量を指定します。下記の例ではイベントが1度発生するごとにエレベータトリムを0.1%動かします。(リピートしなければ、指がかなり痛くなるでしょう。)

**<value> [#w73e617d]
-繰り返しイベントでない場合、押した結果プロパティに与えられる値を指定します。

**<mod-up> [#xd6179bd]
-これは、"modifier 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

#br
*デジタルHATスイッチ [#u268fad3]
多くのジョイスティックには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スイッチを使用したいなら、あなたは&lt;high&gt;と&lt;low&gt;を使用できます。

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

 <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の間の位置を使うことができます(フルブレーキ)


*キーボードの設定 [#k1d54a0b]
キーボードのキーバインディングは、以下の例のようにジョイスティックのボタンのバインディングとほとんど同じです(コンテキストは/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>

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

  --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>

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

 <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スクリプトの使い方 [#rfd4c248]
注意:この項は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