randomize

2016/07/03

Killzone KidのArmaスクリプト講座:基本について

;を置くべきか、;を置かざるべきか。それが問題だ。ぶっちゃけた答えを言うと、迷うぐらいなら置いたほうが良い。説明しよう。セミコロンはSQFスクリプトの中で使われ、エンジンに「命令が終了し、次の命令が来ます」と伝えるためにある。;を置くべき場所に置かなかった場合、スクリプトは停止され、.rptファイルにエラーメッセージが追加される。

a = b;
c = d;
//動く
a = b
c = d;
//エラー
a = {c = d;};
//動く
a = {c = d};
//これでも良し
コードを示すカッコ}を閉じる直前にあるコードのセミコロンは省くことが出来る。SQFファイルの一番最後のセミコロンも同様に省くことが出来る。ファイルの終わりはコードの終わりだ。それでも必要ないところにセミコロンを置いても損はない。
while {true} do {hint "ok"; breakOut ""}
//動く
while {true;} do {hint "ok too"; breakOut "";};
//これも動く
ただし引数を渡すとき、セミコロンはかえってエラーを起こす原因となる点には注意しよう。
a = {"ok"}; hint format ["%1",call a;];
//エラー
a = {"ok"}; hint format ["%1",call a];
//イイネ
()についても同じことが言える。括弧はエンジンに処理の順番を教えるために使われる。一番内側の括弧が一番最初に処理され、次にその親、その次にさらにその親、といったふうに処理される。(((1) 2) 3)。例えば入れ子になった配列の値を取得するときなど。(追記:select命令は括弧を省いて使うことも出来る。_eight = _array select 3 select 4 select 0;はいつものように動く。)
_array = [1,2,3,[4,5,6,7,[8,9]]];
_eight = ((_array select 3) select 4) select 0;
上と同じ結果は別々に分けても可能である。
_array1 = _array select 3;
_array2 = _array1 select 4;
_eight = _array2 select 0;
命令を的確に括弧でくくらないと、予測不能な結果を示すことがある。次の例を見てみよう。
//正しくない
{diag_log format ["%1",_x]} forEach position player nearObjects 50;
//正しい
{diag_log format ["%1",_x]} forEach ((position player) nearObjects 50);
前者の例はエラーにこそならないが、式の答えはデタラメな数字で予想されたものではない(注:上の例ではnearObjects以降は無視され、position playerforEachで繰り返されます)。予想された答えはプレイヤーから50m以内のオブジェクトを返すスクリプトで、二番目のスクリプトは括弧のおかげでまさにそのように動く。

ああそうだ、同じ記事のうちにどうやって関数を呼び出すか話しておこう。でもその前に値を一つ代入する単純な関数を作ってみよう。値はプライベートかパブリックのどちらでも良い。関数を呼び出すときはcallを使おう(この後もっと命令を紹介しよう)。
my_function = {
    a = 1;
    b = 2;
    c = a + b;
};
call my_function; //cは3になった
関数は返り値を返せるのと同じく引数も取ることが出来る。callを使って引数を渡すときは、callの前に引数する値を置こう。複数の引数を渡す必要があるときは、配列が使える。渡された引数は関数の中で特殊変数_thisに代入される。返り値を返すときは関数の一番最後に値か、未評価の値を置く必要がある。
//こんな感じに
my_function = {
    private ["_a","_b","_c"];
    _a = _this select 0;
    _b = _this select 1;
    _c = _a + _b;
    _c
};
//あるいは
my_function = {
    (_this select 0) + (_this select 1)
};
_result = [1,2] call my_function;
//_resultは3
(注:上の例の_cが「値」、下の例の(_this select~~が「未評価の値」です)
二番目の例の括弧は、外すと動かなくなる。基本の話はこれで終わり、助けになれると嬉しい。

Enjoy,
KK

KK's blog – ArmA Scripting Tutorials: Basics by Killzone Kid
Translated by POLPOX

0 件のコメント :

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。