AREA 021
Featuring AlphaScript

STEP 14 処理ブロックなど

 

AlphaScript には、2つの処理ブロックがあります。

・初期化ブロック
・メインループブロック

それぞれのブロックは、パラメータで指定されたラベル名を持つラベルからはじまり、 コールが行われていない状態で return を実行することにより終了します。

たとえば、メインループのラベル名に start を指定したとすると・・・

@ start;

// この間の処理が毎フレーム実行される!

return: 0;

初期化ブロックは、起動したときに一度だけ実行されます。  「画像の読み込み」などの処理は、最初に一度だけ行えば良いので、ここでするべきです。

メインループブロックは、初期化ブロックが実行された後、何らかの理由(ウィンドウを閉じるなど)で実行が停止するまで繰り返し実行されます。  秒間 50 フレームで動作する設定なら、毎秒 50 回呼び出されます。

ただし、コンピュータの処理が間に合わなかった場合は、それより少ない回数になります。(いわゆる「処理落ち」ですね)  各フレームの処理が終わった直後に画面表示の更新が行われるので(だからフレームと呼ぶのですが)、 アニメーション作品ならぱっと見ただけで「重い」ことがわかってしまいます。

そのため、特にメインループに書くスクリプトは、なるべく高速に動作するようにしたいところです。  複雑な処理ほど実現する方法が多くなり、その選択によって処理速度が大きく変わってきます。  このあたりが、プログラミングの面白いところでもあり、難しいところでもあります。

例えば、以下の2つのスクリプトは、どちらも同じ結果になります。

sum = 0;

i = 0; @loop;
sum += i;
i+=1; if: i<10 { *loop; }


sum = 0;
i = 0;

sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;
sum += i; i+=1;

(こんなことしなくても、掛け算を使って計算式で答えを求めればいいのでは? というツッコミはご勘弁を -_-;)

この2つを比べると、後者のほうがループ処理がない分、処理時間が短そうです。  しかし、じゃあそう書けばいいのかというと、そういうわけでもないです。  後者の書き方には全く芸が無く、無駄にスクリプトが長くなっていますよね。  ただ、極限まで速度が求められるなら、後者のほうが優秀ということになります。

これを「時間と空間のトレードオフ」とかいいます。  処理速度を上げようと思うと、上記のように「空間」を消費してしまいますし、 処理内容を短くまとめようとすると、どうしても「時間」が犠牲になります。  その中でどういう判断をしていくかで、プログラマとしての技量が問われるわけで...。  AlphaScript のプログラム本体も、内部的には速度低下やメモリ消費をなるべく抑えるように設計してあるんですよ〜。

(上記の例は、ちょっと意味が違ったかなぁ・・・。^^; まあいいか(←適当)   実際はもっと奥の深い話ですので、気になる方は検索してみてください。)


脱出コマンド

exit コマンドは、スクリプトの実行をその時点で強制中断するコマンドで、デバッグに使えます。  中断すると同時にコンソールウィンドウも開きます。  exit の後ろには終了コード(数値)を指定でき、これがコンソール内に表示されますので、 exit を複数記述した場合は、強制終了した理由を特定するのに便利です。  ただし、終了コードがマイナス値だった場合、敢えてメッセージと終了コードを出力しないようになっています。

// 終了コード 0 で終了
exit: 0;


特殊定数

$ は変数の宣言の他に、特殊定数を表します。  これは書き換えられない変数のようなもので、 以下のいずれかの条件で値が更新されます。

・ return が実行されたら、return の後に続く値になる。
・ @ による要素の代入が実行されたら、代入した要素の個数になる。

前者は直前にコールした処理の結果を知るのに便利ですし、後者は配列の要素数を取得できます。  当サイトに掲載されているスクリプトでは、見やすさを重視しているため使っていませんが、 それなりに使える機能だと思うので、ぜひ活用してみてください。

ちなみに、変数と同じく初期値は 0 になっています。  また、処理ブロック終了の return でセットされた値は、次回のフレームまで保持されますので、 初期化や前回のフレームの処理結果などを知るのにも使えます。

 

ページ一覧に戻る  次のステップへ!

Copyright (c) Rabit 2005-2012 all rights reserved.