条件分岐 その2

さて、前回続きで条件分岐のお話です。

if文が「もし~だったら」という内容で結果が変わるのは書きましたが、もっとたくさん分岐があったらどうすればいいでしょう?
これには次のような書き方があります。

if( 演算式 )
{
    内容 ;
}
else if( 演算式 )
{
    内容 ;
}

「もし~だったら何々、そうじゃなくて、もし~だったら何々」。
条件にさらに別の条件を付ける方法です。
この else if はいくつ使ってもいいので、複雑な分岐が使える訳です。

もっと複雑な条件分岐もあります。
例えば、よく使われるものに乗り物などで見かける、キーコントロールがあります。
「↑キーが押され、同時に→キーも押されたら右旋回する」というやつです。
これは比較演算同士をさらに比較する方法で、論理演算と言います。
例を出すとこうです。

if(( x = 10 ) || ( y = 10 ))
{
    内容 ;
}

|| は or 演算と呼ばれ、「もし何々が正しい、または何々が正しかったら正しい」という意味です。
つまりどっちでも正しいという柔軟な対応です。
例では「xが10でもyが10でも、どっちでもいいッスよ」という可愛い子分のような対応をしています。
これに対し、

if(( x = 10 ) && ( y = 10 ))
{
    内容 ;
}

&&は AND 演算と呼ばれ、「もし何々が正しく、さらに何々も正しかったら正しい」という意味です。
つまりどっちも正しくなければならない厳密な対応です。
例では「xは10で、yも10でなくては許可できません」というキツイ秘書のお姉さんのような対応です。

さて、簡単に条件分岐の実践をしてみましょう。
前回の冒頭で出た、「他人がタッチすると『こんにちわ』としゃべり、自分がタッチすると『おかえりさない』としゃべる」。
これをやってみましょう。

default
{
    touch_start(integer total_number)
    {
        key user = llDetectedKey(0);
        key owner = llGetOwner();
        if(user == owner)
        {
            llSay(0,"おかえりなさい");
        }
        else
        {
            llSay(0,"こんにちわ");
        }
    }
}

では解説します。

touch_start(integer total_number ) はもうお馴染みですね。
タッチされたら実行するイベントハンドラです。
次に初めて出てくる関数があります。
llDetectedKey( 0 );
これは最初に(0番に)タッチした人のUUIDを教えなさいという命令です。
デテクト系と呼ばれる、イベントを起こした人の情報を取得する関数の一つです。
llGetOwner( );
これはオブジェクトの持ち主のUUIDを教えなさいという命令です。
つまり、あなたのIDです(笑)。
次に、いよいよ比較演算を行っています。
if( user == owner )
変数 user にはタッチした人のIDが、変数 owner には持ち主のIDが入っていますね。
「もしタッチした人のIDと持ち主のIDが同じなら」という意味です。
そして結果が正しいなら「おかえりなさい」、正しくないなら「こんにちわ」としゃべるように命令しています。

この、持ち主と他人を判断するif文は、乗り物によく使われています。
置いてある乗り物に乗ろうとして怒られたり、時には飛ばされたりした経験があるでしょう?(笑)
前に書いた通り、UUIDはSLに存在するあらゆるものに個別に設定され、同じIDを持つ人がいる可能性はまずありません。
まるで指紋認証システム、何より安全な鍵、防犯装置という訳です。

条件分岐は、とにかくあらゆる場面で使われます。
ちょっと複雑なスクリプトになると、大量のif文で作られていたりします。
それは裏を返せば、条件分岐の使い方でスクリプトは色んな可能性を持っているという事でもあります。