一番簡単なシーナリ


一番簡単なシーナリの例

普通はSCASM の文法や、用語についての解説から始めるところでしょうが、 そーゆーまどろっこしいのは嫌いなので、全部すっとばします。
SCASM のマニュアルを読んでください。和訳があるだけ楽でしょう。(いいかげんだなあ)

ここでは、いきなり SCASM のシーナリファイルの例をお見せします。以下の例を見てください。 これはもっとも簡単なシーナリです。これで雰囲気をつかんでください。 なお、便宜的に行番号をつけてありますが、実際のファイルには行番号はつけないでください。

このシーナリにはビルが1つだけあります。このファイルを例えば test.scm という ファイルで保存し、以下のように SCASM でコンパイルします。

scasm test.scm test.bgl
これで、test.bgl という名前の BGL ファイルができますので、これを FS5 のシーナリディレクトリにコピーすれば自動的にシーナリがあらわれます。

それでは内容の説明に入ります。


ヘッダ

シーナリファイルの先頭には必ず「ヘッダ」と呼ばれる部分があります。それが例の 1, 2 行目です。

1行目は Header 文で、これはシーナリファイルの先頭に必ずなければ なりません。ここでシーナリファイルの「範囲」を指定します。ここでは北緯 35 度 0 分 から北緯35度15分まで、東経137度0分から東経136度45分までの長方形の範囲のシーナリ を定義するという意味です。(ちなみにこれは名古屋近辺です)

2行目は LatRange です。1つのシーナリはいくつかの緯度の「帯」に分割して記述すること ができるのですが、ここではその「帯」を定義します。ここではオマジナイだと思ってください。 詳しい内容は説明しませんので、詳しく知りたい人は SCASM のマニュアルを見てください。

なお、マクロの場合はヘッダは不要です。マクロについてはまた後で説明します。


Area

4行目からがシーナリのオブジェクトの本体です。まずは "Area" の概念を説明しましょう。

Area は「あるオブジェクトの見える範囲を指定する」ものだと思ってください。たとえば 名古屋の真ん中にビルを作ったとしましょう。するとこのビルは当然東京からは見えません よね。普通は数 km 先からしか見えないはずです。Area はこの範囲を指定するものだと思っ てください。

4行目の Area 文を見てください。ここから16行目の EndA (End Area の意味)までが Area の定義です。ここでは

5-15 行目の内容が見える、ということを意味しています。この範囲を外れると 5-15 行目の内容は見えなくなる、というわけです。

Area はとても重要な概念ですので、よく覚えておいてください。なお、たいていの場合は Area は1つのオブジェクト、たとえばビルとか、テレビ塔とか、野球場とか、に対して1 つ定義するものだと思っておいてください。なお、場合によってはいくつかのビルをまとめて1つ の Area の中に入れるという場合もあります。この辺は臨機応変に使い分けます。


シーナリファイルはプログラムである

では 5 行目以降の処理を見ていきましょう。何やら ...Call とか Jump とか Return といった文が見えますね。ここでピンときた人もいるかもしれません。実はシーナリファイル というのは「プログラム」そのものなんです。単なるデータの羅列じゃないんです。MSFS は していっているんですね。ですから、シーナリを作るときは多少のプログラムセンスが 必要になります。といってもそんなに難しいものじゃないんで、身構える必要はありませんよ。

では 5 行目から見ていきます。5 行目では PerspectiveCall という文がありますね。 これは「隠面処理」をする時に使います。隠面処理というのは、立体物を表示するときに 「この面は裏側だから表示しない」とか、「この面は別の面の後ろ側で隠れているから表示 しない」という処理をするものです。ですから、立体物を表示するときにはかならず PerspectiveCall をしないといけません。
で、PerspectiveCall の括弧内に :Sub と書いてありますね。ここでは :Sub という 「サブルーチン」を呼び出している、という意味です。:Sub というのは 8 行目にあります。 14 行目に Return という文があって、ここでサブルーチンから戻ります。ですから 8 行目 から 14 行目までがサブルーチンです。

つまり流れとしては以下のようになります。

  1. 5行目まで処理が進んできた。
  2. PerspectiveCall により 8 行目のサブルーチンが呼び出される。
  3. 9 行目から14行目まで順に処理が進む。
  4. 14 行目に Return 文があるので、サブルーチンから5行目に戻る
  5. 6行目に進む。

次に 6 行目ですが、ここに Jump 文があります。Jump 文には ':' とかかれていますが 、これは Area の終わり、つまり 16 行目の EndA にジャンプするという意味です。

こんな感じですが、大体の流れがおわかりいただけたでしょうか?


参照点

それでは先に進みましょう。

9行目の Perspective ですが、これは PerspectiveCall で呼ばれた直後に必ず 入れないといけません。そうしないとうまく表示されません。

10 行目は RefPoint です。これはオブジェクトの「参照点」を定義するものです。 参照点の概念はとても重要なので、よく覚えてください。

参照点とは、オブジェクトを定義する際に基準となる点です。これがないと非常に 不便です。たとえば、オブジェクトとして直方体状のハンガーを作ることを考えて みてください。直方体には8つの角がありますが、この点の位置を緯度・経度・高度 で定義するとしたら、、、考えただけでも憂鬱になりそうです。

そこで、参照点の登場です。参照点を緯度・経度・高度の3組みで定義しておき、この

すれば話は簡単になります。直方体を定義するのなら、1番の点は参照点の西 50m、 南 30m、上 40m などといった感じに定義するのです。

10行目の RefPoint では、 北緯35度12分46秒、東経136度54分58秒、高度 0m の位置に参照点を設定しています。

なお、RefPoint には他に2つの役割があります。1つはスケーリングファクタの設定で、もう1つ は隠面処理です。

RefPoint の2番目の引数がスケーリングファクタです。スケーリングファクタとは 倍率のことです。ここでは倍率が1倍ですので、以降で指定した長さなどの値は すべてメートル単位になります。ここを 2 にすると、2メートル単位になります。

もう1つの役割の隠面処理について説明しましょう。以下のように2つのビルがある場合を 考えてみてください。

飛行機は地面すれすれを飛んでいるとしましょう。このとき、右上の飛行機から2つのビ ルを見たとき、左のビルは右のビルの影に隠れるはずですね。FS はどうやってこれを 表現するかというと、先に左のビルを描いて、その上に右のビルを描くのです。もっと 正確に言うと、飛行機の位置からみて、

のです。これで以下のような陰面処理ができるのです。青くなっている部分が 陰面処理されているところです。

隠面処理はもっと複雑なのですが、細かいことは後程説明することにしましょう。


標準ビルは便利

では 12 行目を見ましょう。Building という文があります。これは FS の標準 ビルを描く、という命令です。標準ビルというのは、さきほどの図にあるビル のことです。(Chicago の市街地にいっぱい立っていますね。) FS ではこの標準ビルをたったの1命令で描くことが できるので、とても便利です。

12行目の内容ですが、ここでは参照点を底面の中心として、東西方向に 50m、 南北方向に 30m、高さは 10 階建のベージュ色で縦の縞模様の入っているビル を描く、という意味です。数値の細かい意味についてはここでは説明しませんが、 scasm のドキュメントを見ればすぐにおわかりいただけるでしょう。

標準ビルはとっても便利なので、拙作名古屋シーナリでもばんばん使っています。


さて、これで最初の例の説明は終わりです。大体の雰囲気はつかめたでしょうか?

基本的にはどんなシーナリでも上に示したような形ですが、Area が複数 になり、Building... のところが複雑になっていくだけです。


[次ページ] [目次]