randomize

2016/05/18

Killzone KidのArmaスクリプト講座:Array(その2)

その1においては、情報の取り出し方について見てきた。今回は配列の内容の改変と操作を見ていこう。でもその前に、Configを扱うときに必要な命令2つ、getArrayisArrayを見ていこう。

getArrayは与えられた正しい配列を返すが、変換はしてくれない。例えばConfigに"sometextstring"という値があったとして、getArray["sometextstring"]ではなく[]を返す。isArrayは単純に与えられたConfigが配列か否かを返す。
(以下、一部Arma 3用に改変しています)
class hgun_P07_snds_F: hgun_P07_F {
 descriptionShort = "Handgun<br />Caliber: 9x21 mm";
 displayname = "P07 9 mm";
 magazines[] = {"16Rnd_9x21_Mag",/*省略*/,"30Rnd_9x21_Green_Mag"};
 ...
};
_result = isArray (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "magazines");
//_resultはtrue
_result = getArray (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "magazines");
//_resultは["16Rnd_9x21_Mag",/*省略*/,"30Rnd_9x21_Green_Mag"]
_result = getText (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "magazines");
//_resultは""
_result = isArray (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "displayname");
//_resultはfalse
_result = getArray (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "displayname");
//_resultは[]
_result = getText (configFile >> "cfgWeapons" >> "hgun_P07_snds_F" >> "displayname");
//_resulは"P07 9 mm"
さて、配列の値を改変するにはsetを使う。この命令は引数に[添字,新しい値]の形の配列を採る。setは配列の長さを超えた添字の値を変更しようとすると、配列の長さを変える。また、resizeを使えば配列の長さを直接変更できる。resizeは引数に採った数字に応じて、配列の長さを長くする事も短くする事もできる。
_array = [1,2,3,4,6,6,7,8,9];
_array set [4,5];
//_arrayは[1,2,3,4,5,6,7,8,9]になった
_array set [count _array,10];
//_arrayは[1,2,3,4,5,6,7,8,9,10]になった
_array set [12,13];
//_arrayは[1,2,3,4,5,6,7,8,9,10,<null>,<null>,13]になった
_array resize 3;
//_arrayは[1,2,3]になった
_array resize 5;
//_arrayは[1,2,3,<null>,<null>]になった
_array resize 0;
//_arrayは[]になった
配列の値にnilを代入することで値を未定義にする事ができる。これは値を消すことも、配列の長さを変えることもない(訳注:一部の値を消去してその分長さを縮めることについてと思われます)
_array = [1,2,3,4,5];
_array set [2,nil];
//_arrayは[1,2,any,4,5]になった
直接的に配列の値を消した上で長さを変えることはできない。しかしながら、Armaの素晴らしい特長により、いくつか回避策が存在する。+と-の演算子により配列同士を足したり引いたりすることが出来る。加算は単純に1つ目の配列の長さを変え、2つ目の配列の要素を追加する。
_array = [4,5,6];
_array = _array + [7,8,9];
//_arrayは[4,5,6,7,8,9]になった
_array = [1,2,3] + _array;
//_arrayは[1,2,3,4,5,6,7,8,9]になった
減算は1つ目の配列から2つ目の配列の要素を全て取り除き、長さを変更する。
_array = [1,1,2,2,3,3,4,4,5,5];
_array = _array - [1];
//_arrayは[2,2,3,3,4,4,5,5]になった
_array = _array - [4,2,5];
//_arrayは[3,3]になった
配列の要素が配列だった場合、減算はできない。(現在は普通に減算することができます)
_array = [[1,2],[3,4]];
_array = _array - [[1,2]];
//_arrayは[[3,4]]になった
つまり、配列の特定の値を取り除くには、値を適当な独自の値にし、その後その値を減算するとできる。代入・減算はNullの値、例えばobjNulllocationNullgrpNulltaskNullteamMemberNullcontrolNulldisplayNullも使える。
_array = [1,2,3,4,5];
_array set [1,"deletethis"];
//_arrayは[1,"deletethis",3,4,5]になった
_array = _array - ["deletethis"];
//_arrayは[1,3,4,5]になった
_array = _array set [3,objNull];
//_arrayは[1,3,4,<null-object>]になった
_array = _array - [objNull];
//_arrayは[1,3,4]になった
ここで値を足したいけど、同じ値を重複させないようにするときに使える巧妙なテクニックを紹介しよう。値を足す前に同じ値が存在するか確認する事もできるが、値が存在すると仮定した上で値を引いた後足し直すこともできる。こうすることで配列の中で値が重複しないようにする事ができる。
_array = [1,2,3,4,5];
_array = (_array - [6]) + [6];
//_arrayは[1,2,3,4,5,6]になった
_array = (_array - [6]) + [6];
//_arrayは[1,2,3,4,5,6]のまま
(何が起きているのかわからない人は、減算と加算を別々に考えてみましょう)
その2はこれまで、その3ではもっと高度な物を使ってみよう。

Enjoy,
KK

KK's blog – ArmA Scripting Tutorials: Arrays (Part 2) by Killzone Kid
Translated by POLPOX

0 件のコメント :

コメントを投稿

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