Control/ja

From Second Life Wiki

Jump to: navigation, search

イベント: control( key id, integer level, integer edge ){ ; }

llTakeControls ライブラリ関数の呼び出しとユーザの入力の結果です。

• key id アバターの UUID
• integer level CONTROL_* フラグのビットフィールド。1 個以上のキーが押し下げられている間は、ゼロ以外になります。
• integer edge CONTROL_* フラグのビットフィールド。1 個以上のキーが押された/離された場合、ゼロ以外になります。
定数 説明
CONTROL_FWD 0x00000001 前進 (W)
CONTROL_BACK 0x00000002 後進 (S)
CONTROL_LEFT 0x00000004 左移動 (⇧ Shift-⇧ Shift-A [マウスルックならば A])
CONTROL_RIGHT 0x00000008 右移動 (⇧ Shift-⇧ Shift-D [マウスルックならば D])
CONTROL_ROT_LEFT 0x00000100 左回転 (A)
CONTROL_ROT_RIGHT 0x00000200 右回転 (D)
CONTROL_UP 0x00000010 上昇 (PgUpE)
CONTROL_DOWN 0x00000020 下降 (PgDnC)
CONTROL_LBUTTON 0x10000000 マウス左クリック
CONTROL_ML_LBUTTON 0x40000000 マウスルック中のマウス左クリック

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
    }
    run_time_permissions(integer perm)
    {
        if(PERMISSION_TAKE_CONTROLS & perm)
        {
            llTakeControls(
                            CONTROL_FWD |
                            CONTROL_BACK |
                            CONTROL_LEFT |
                            CONTROL_RIGHT |
                            CONTROL_ROT_LEFT |
                            CONTROL_ROT_RIGHT |
                            CONTROL_UP |
                            CONTROL_DOWN |
                            CONTROL_LBUTTON |
                            CONTROL_ML_LBUTTON |
                            0, TRUE, TRUE);
        }
    }
    control(key id, integer level, integer edge)
    {
        integer start = level & edge;
        integer end = ~level & edge;
        integer held = level & ~edge;
        integer untouched = ~(level | edge);
        llOwnerSay(llList2CSV([level, edge, start, end, held, untouched]));
    }
}

ノート

マウスルック時のアタッチメントでの llGetRot は、アバターの見ている視角から返ります。

llMinEventDelay がこのイベントの遅延の少なくとも二倍に設定された場合、このイベントは llMinEventDelay の設定をその半分であるかのように扱います。言い換えると、llMinEventDelay が 0.1 以上に設定された場合、このイベントは他のイベントに比べて 2 倍の頻度で発生し得ます。

私が試したところ、アバターのコントロールが取得されたときに返される UUID は、その当該アバターでなく、所有者の UUID でした。複数のアバターのパーミションを同時に扱うために一つのオブジェクトで複数のスクリプトを動かした場合、control イベントは全てのスクリプトで発生しますが、それがどのアバターに起因するかを知る手立てはありません。これは SVC-476 として挙げられています。(訳注: 所有者の UUID が渡されるという問題は 2009-04-07 の Server 1.26 で修正されたようです。ただし単一プリム内の複数スクリプト P, Q でそれぞれ複数アバター A, B のパーミションを管理する場合にまだ問題があります。A がキー操作を行なうと、P, Q 双方で control イベントが発生し、P には A の、同時に Q には B の UUID が渡されます。B のキー操作が無いにもかかわらずです。)

関連項目

イベント

•  run_time_permissions

関数

•  llTakeControls
•  llReleaseControls
•  llRequestPermissions

Personal tools
In other languages