マクロとインクルード


概要

SCASM には「マクロ」や「インクルード」の機能があります。 C 言語のプリプロセッサを使ったことがある人なら想像がつくと思いますが、 うまくつかえばシーナリの記述量が減り、見通しが非常によくなります。 特にマクロの方を使いこなせるかどうかで、シーナリ作成 時の効率がまったく違ってきます。ぜひとも使えるようにしてください。

マクロの使い方

先にお見せしたもっとも簡単なシーナリの例を思い出してください。 あの例はもっとも簡単な例でしたが、それでも結構な行数があります。ビルを1つ 追加するために、似たようなコードを10数行も書くとしたら、嫌になってしまいます。 でも、マクロを使えば、同じような記述をくり返す必要がありません。

ここでは、実際に私が頻繁に使っているマクロをお見せしましょう。

; 通常のビル (Normal building macro)
;  build.scm Lat Lon Rot Height Width1 Width2 Type Altitude (wallflag)
;             1   2   3    4      5      6      7      8	9

Area( 5 %1 %2 10 )
	PerspectiveCall( :Sub )
	Jump( : )

:Sub
	Perspective
	mif( %8 )
		Refpoint( 2 :No_object 1 %1 %2 E= %8 V1= 3000 )
	melse
		Refpoint( 7 :No_object 1 %1 %2 V1= 3000 )
	mifend
	
	mif( %3 )
		RotatedCall( :Object 0 0 %3 )
	melse
		Call( :Object )
	mifend
:No_object
	Return

:Object

mif( %9 )
	Building( 0 0 0 %4 %5 %6 %7 %9 )
melse
	Building( 0 0 0 %4 %5 %6 %7 1F )
mifend

	Return

EndA
以上の内容を "build.scm" というファイルに書き込んでおきます。これは 標準のビルを作るマクロです。このマクロを使うのは簡単です。シーナリ ファイルの中で以下のように記述すれば良いのです。
Macro( build.scm N35:09:12.0 E136:58:02.4 20 12 30 30 03 0 1F )
たったこの1行でビルができてしまいます。Macro という命令がマクロを 呼び出す命令です。ここでは、build.scm というファイルに入っている マクロを使い、N35:09:12.0 以下の引数をマクロに渡します。

マクロに渡された引数は順に %1, %2, %3,... という部分に挿入して解釈 されます。たとえば、マクロの最初の行の

Area( 5 %1 %2 10 )
という部分は
Area( 5 N35:09:12.0 E136:58:02.4 10 )
に解釈されます。ですから、引数を変えることでビルの位置や大きさ、高さ、 色などを簡単に指定できるわけです。これならたった1行でビルを作れるので、 シーナリ作成がとても簡単になります。

次に、マクロの中の mif, melse, mend ですが、これは条件によって コンパイルする範囲を変えるものです。たとえば、mif( %3 ) という行が ありますね。これは、3番目の引数が真(0でない)場合に以下の melse までの行を解釈し、偽(0)の場合は melse から mifend までの行を解釈 します。ここでは、回転角度が 0 の場合は RotatedCall を実行しない ようにしているわけです。


Airport のマクロ

Pascal Meziat 氏作の Airport というシーナリ作成ツールには、SCASM でも利用できるマクロが山のようについてきますので、参考にすると良いでしょう。 これらはすべて拡張子が API になっています。

Airport のマクロで使用する引数は以下のようになっています。 なお、これは私が独自に解析したものですので、保証はしません。

%1	緯度
%2	経度
%3	視程(2nm単位, Area() の第4引数)
%4	スケーリングファクタ
%5	回転角
%6	色1 (couleur の第1引数)
%7	色2 (couleur の第2引数)
%8	色3 (couleur の第3引数)
%9	色4 (couleur の第4引数)
%10	RefPoint からの視程(v1=パラメータ)
%11	高度(RefPoint E=パラメータ)
%12	シーナリ density がこの値以上の時のみ表示
%13,%14	RefPoint の最後の2引数。内容は不明

インクルードの使い方

シーナリをどんどん作っていくと、そのうちシーナリのソースファイルがとても長く なってしまいます。あまり長くなってきたらインクルードを使ってファイルを分割することを 考えましょう。

インクルードの使い方は簡単で、メインのシーナリファイルなどから、

Include( sub.scm )
とすれば、この位置に sub.scm の内容が挿入されたのと同じ効果になります。

メインのシーナリファイルには Header と LatRange と Include だけ を書いておいて、その他のシーナリは全部サブシーナリファイルに分けてしまうと きれいになります。

ただし、残念ながら Include したファイルの中からさらに 他のファイルを Include することはできません。


[次ページ] [目次]