フロー制御
なにやら難しそうなタイトルですが、簡単に言えば「プログラムの流れ制御」です。
ここで扱うのは繰り返しです。
時には、同じ内容を何度も繰り返したい事があります。
そういう時は単純に内容をコピーすれば済む訳ですが、もし内容を変えたくなった時には、全部修正しなければならないので大変です。
もちろんミスも多くなりますし、見た目にも良くないし、ひょっとするとスクリプトの容量をオーバーしてしまう事もあります。
そういう時に便利なのが繰り返しのフロー制御です。
フロー制御には以下のものがあります。
if
if( 演算式 ) { 内容 ; } else { 内容 ; }
実はif はフロー制御の仲間です。
繰り返しとは意味合いが異なるので別に書きました。
まぁこれについては説明したのでパス(笑)。
while
while( 演算式 )
{
内容 ;
}
whileは、演算式が正しい場合に延々と繰り返す処理です。
integer X; while( X < 10 ) { llSay(0, "おはよう" ); X++; }
これはXが0から9になるまでずっとXに1を足し続けます。
Xが10になった時点(Xが10未満ではなくなる=演算が正しくなくなる)で内容をスキップしてループを抜けます。
結果、おはようを10回言います。
do while
do { 内容 ; } while(演算式) ;
上のwhileをひっくり返したような書き方です。
do while は while とほぼ同じですが、まず内容を1回行ってから演算をする点が違います。
integr X; do { llSay( 0, "おやすみ" ); X++; } while( X < 10 );
同じくおやすみを10回言います。
Xは1から始まり、Xが10になった時点(Xが10未満ではなくなる=演算が正しくなくなる)でループを終了します。
whileでは11回目をスキップするので10回、do whileでは10回目でループを抜けるので10回なのです。
実のところ、理屈は解っていても、この2つをどう使い分ければいいのか良く解りません。
どちらにも言える事は、X++; これを忘れると無限ループに陥るという事です。
また、比較演算なのでうっかり( X = 10 ) と書いても無限ループになります。
( X == 10 ) と書きましょう。
この場合は初めから演算が正しくないため、whileでは一度も内容を実行せずに、do whileでは一回だけ実行して終わります。
for
for( 初期化; 演算式; 更新処理 )
{
内容 ;
}
繰り返しで、一番使い勝手が良いのがこのforです。
while では内容中に書いていた更新処理が、for の中に組み込まれているため、無限ループに陥りにくくなります。
また表記自体もスッキリします。
integer i; for( i = 0; i < 10; i++ ) { llSay( 0, "こんにちわ" ); }
こんにちわを10回言います。
上記の二つに比べても、繰り返し処理をしている部分が解りやすいですね。
繰り返しのフロー制御では、回数を判定するために変数が一つ必要です。
ただ、これは内容に組み込むことができます。
integer i; for( i = 0; i < 10; i++ ) { llSay( 0, (string) i ); }
0から9までの数字をしゃべったと思います。
これは例えば、list 変数の中身を使いたい時に重宝します。
list 変数は、その中身に左から順に0、1、2、3と数字が振られています。
つまり、listの0番目、listの1番目という具合にfor 文を使って取り出せる訳です。
list str = ["これは","リストから","取り出す","テストです"]; default { state_entry() { integer i; integer list_num; list_num = llGetListLength(str); for( i = 0; i < list_num; i++ ) { llSay( 0, llList2String(str, i)); } } }
list変数strの中身を連続で取り出してしゃべります。
LSLではfor 文が使えれば、繰り返しで困る事はそんなにありません。
さて、このフロー制御までで、基礎編は一応終わりです。
この後は、各イベントと関数の使い方を、実践編で解説していきます。
結局のところ、イベントや関数の違いがあるだけで、スクリプトは基礎編で学んだ事をどう組み合わせるか、という事だけです。
よっぽど難しいものでなければ、これまでの内容だけでも十分です。
スクリプトは怖くありません。
使えるようになればなるほど楽しいものです。
頑張りましょうね。


