武器の装着と連続発射(中) | virt_flyのブログ

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

イメージ 1


↑ロケット弾を断続的に繰り返し発射できるだけでなく、タッチパネル上でもロケット弾が使用できる状態を示していなければなりません。画像では、ロケット弾が使用できること、すでに片方の増槽が切り離されていることが、見てとれます.
 

武器の装着と連続発射(中)ーキーのコマンドに条件設定


  「厳密には」とか「正しくは」が口癖みたいになっていますが、ロケット弾ポッドは蜂の巣のように多数開いた穴の中に各1発装填されたロケット弾が、順繰りに発射されるのが本来のところ、FlightGear用の機体であるSu-25のロケット弾ポッドもJu EF128のそれも、いずれも一つの銃口からから何発も連続して弾丸が発射される機関銃のしくみをもって代用、つまりごまかしているのが実際です。

  他に、ちゃんとした方法があるのかも知れませんが、今回はこれを前提にしたJu EF128用のプログラムの作成についてです。

  機銃の断続的な発射を実現するweapons.nasの記述をそっくりまねて、ロケット弾用の記述をこれに書き加えます。

  もちろん、Sumbmodels.xmlにも発射後のロケット弾の挙動について書き加えておく必要があります。ここではrepeatをtrueとし、countを-1として、何回も繰り返しできるようにしておきます。

  問題は、Sumbmodels.xmlに書き込む発射のきっかけ、<trigger>であり、対応する発射キーの<command>の内容です。

  我がJu EF128では、機銃以外はすべての武器を使用するのにCtrl+Kキーを使っています。あらかじめ使用する武器を指定しておいて、このキーの<command>で実行しているわけです。

  既存の武器の記述を流用すればよさそうなのですが、そうもいきません。なぜなら、我がJu EF128では、1つのキーですべての武器をまかなうために、当該ハードポイントからの切り離しをtriggerとしており、もちろんそこの爆弾あるいはミサイルを使うのも1回こっきりなので、当該ハードポイントを再び使うことはなく、コクピットのボタンも使用不能になるようにしてあるからです。これでは、断続的な発射などには使用できず、ロケット弾には不向きです。

  やはりロケット弾の断続発射には、先のweapons.nasに記述のNasalプログラムの使用がどうしても必要になります。

  ロケット弾の発射に他のキーを割り当ててもいいのですが、使用する武器をパネルで指定してやるシステムになっている以上、ロケット弾ポッドだけ選択状態や使い切って使用不能の状態をディスプレイ表示できないのは具合悪い話。となれば、両立の方法を模索するしかありません。

  <binding>をいくつかもうけることで、複数の<command>を実行している例を見かけますから、これがキーでも使えれば、両立も不可能ではありません。ただし、キー1つですべてに対応しなければならないので、ある場合は断続発射を使い、また再使用できるように不能表示はさせないなどの使い分けに迫られます。

  そんな例は見かけたことがありませんが、<command>に条件設定を試みてみました。しかも、最初の<binding>では何も条件設定せずに共通して適用される<command>を記述しながら、次の<binding>では条件設定をして一部にしか適用されない<command>を記述しているのです。無知をいいことに闇雲に怪しげなプログラムを書いたのですが、驚いたことにこれが機能しているのですから。まあいいか。
  
【実例(juef128_custom-keyboard.xml)】

<?xml version="1.0" encoding="UTF-8"?>

<PropertyList>
        ・
        ・
     (中略)
        ・
        ・
  <key n="11">
    <name>Ctrl-K</name>
    <desc>Release selected store(s)</desc>
    <binding> ←第1の<binding>共通というか無限定に適用?
      <command>property-assign</command>
      <property>fdm/jsbsim/systems/armament/release</property>
      <value>1</value>
    </binding>
    <binding> ←第2の<binding>ロケット弾ポッドに限定
      <condition>
       <and>
        <equals>
         <property>fdm/jsbsim/systems/armament/station1/selected</property>
         <value>1</value>
        </equals>
        <not>
         <property>fdm/jsbsim/systems/armament/station1/released</property>
        </not>
       </and>
      </condition>
      <command>property-assign</command>
      <property>fdm/jsbsim/systems/armament/release</property>
      <value>0</value>
    </binding>
    <binding> ←第3の<binding>ロケット弾ポッドに限定して発射実行
      <condition>
       <and>
        <equals>
         <property>fdm/jsbsim/systems/armament/station1/selected</property>
         <value>1</value>
        </equals>
        <not>
        <property>fdm/jsbsim/systems/armament/station1/released</property>
        </not>
       </and>
      </condition>
      <command>nasal</command>
      <script>guns.fire_Rocket()</script>
    </binding>

    <mod-up>
    <binding> ←第1の<binding>
      <command>property-assign</command>
      <property>fdm/jsbsim/systems/armament/release</property>
      <value>0</value>
    </binding>
    <binding> ←第2の<binding>中止なのだから限定せずとも
      <command>nasal</command>
      <script>guns.stop_Rocket()</script>
    </binding>
    </mod-up>
   </key>
        ・
        ・
     (中略)
        ・
        ・
</PropertyList>


  なお、ロケット弾の数は決まっているはずですが、ここでは無限になっています。(^_^?) 機体によっては、機銃に弾数の限定をもうけたリアルなきちんとしたものもあり、みならうべきなのでしょうが。