状態
Jump to navigation
Jump to search
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
LSLでは、ほとんどのスクリプトは何らかの入力を受け取るか、環境で何らかの変化を検出するまで、アイドル状態にあります。どの瞬間も、スクリプトは何らかのstateにあり、プログラマーによって定義された多くのスキームと一致したイベント、あるいはインプットに反応するでしょう。しかしながら、スクリプトは二つ以上の異なるstateを包含することができ、状態によってイベントやインプットに対して異なる反応を定義できます。
中心的なstateはdefault stateです。スクリプトはコンパイルされた時、リセットもしくはリロードされた時、まずdefaultのstateが実行されます。default stateの定義の後に続けて、スクリプトで処理されるイベントがどのような入力、変更によって発生するのかを定義する、新たなstateを追加することができます。
state target { events }
• label | target | – | state名です。 | |
• event | events | – | 一つ以上の イベントです。 |
target state の定義です。
state target;
• label | target | – | 実行するstate名です。 |
state target;が実行時に発生し、現在 のstate と target state が異なる場合、以下の順に動作します。
- 現在のstate内にstate_exitが存在する場合は実行され、イベントキューは消去されます。
- targetにstateが変わると、全てのlistenは解除されます。
- target stateにstate_entryが存在する場合は実行されます。
もしtarget state が 現在 の state と同じ場合、state は変わらず、またどんな副作用もありません。
注意点
- stateを変える上で
- 全てのlistenはリリースされます。
- イベントキューは消去されます。
- Repeating sensors はリリースされます。
- timer event clock はクリアされません。
- つまり、次の state に timer イベントがあり、前の state でタイマーが設定されていると、以前の state で設定された遅延時間で新しい state の timer イベントが発生することになります。
- default stateはほかのstateに行く前に定義すべきです。
- state範囲内にユーザ関数、あるいはユーザ変数を設定することはできず、 イベントだけがstate範囲内で定義できます。
- ユーザ定義(グローバル)関数は state を変えることができません。コンパイラは 'ERROR: Global functions can't change state' というエラーを出すでしょう。注意: 以前はグローバル関数でも 'if' 文の中なら state を変えることができましたが、この"裏技"はもう使えません。
重要な記事
SVC-3017 | A | Server drops first touch event when a script returns to a state with a touch_start handler |
サンプル
<lsl>default {
touch_end(integer a) { state hello; }
}
state hello {
state_entry() { llOwnerSay("Hello"); state default; } state_exit() { llOwnerSay("Goodbye"); }
}</lsl>
注意点
- これまで溜っていたイベントを破棄するのを防ぐために、state target コマンドを timer イベントに移動して、llSetTimerEvent( 0.01 ) で呼び出します。それから新しい state の state_entry でタイマーを止めます。これが心配な場合に state_exit を使用しないでください。
参考情報
特記事項
Issues
SVC-3017 | A | Server drops first touch event when a script returns to a state with a touch_start handler |