Difference between revisions of "状態"

From Second Life Wiki
Jump to navigation Jump to search
m
 
(10 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Multi-lang}}
{{Multi-lang|State|/ja}}{{Template:Issues/SVC-3017}}{{LSL Header/ja|ml=*}}
{{LSL Header/ja}}
{{RightToc}}
<div style="float:right">__TOC__</div>
LSLでは、ほとんどのスクリプトは何らかの入力を受け取るか、環境で何らかの変化を検出するまで、アイドル状態にあります。どの瞬間も、スクリプトは何らかのstateにあり、プログラマーによって定義された多くのスキームと一致したイベント、あるいはインプットに反応するでしょう。しかしながら、スクリプトは二つ以上の異なるstateを包含することができ、状態によってイベントやインプットに対して異なる反応を定義できます。
LSLでは, ほとんどのスクリプトは何らかの入力を受け取るか、環境における何らかの変化を検出するまで何もしていない. どの瞬間も, スクリプトは何らかの状態(state)にあり, プログラマーによって定義された仕組みにしたがってイベントや入力に反応しようとする. しかし, スクリプトは二つ以上の状態をもつことができ, どの状態にいるかにより, イベントや入力に対して異なった反応をする.


主たる状態はdefault状態である. When a script is compiled, reset or loaded, this is the state it enters by default. After the default state definition can follow additional state definitions which the script may use to change how and which events are handled.
中心的なstateはdefault stateです。スクリプトはコンパイルされた時、リセットもしくはリロードされた時、まずdefaultのstateが実行されます。default stateの定義の後に続けて、スクリプトで処理されるイベントがどのような入力、変更によって発生するのかを定義する、新たなstateを追加することができます。
{{#vardefine:name|state
{{#if:
}}{{#vardefine:p_jump_state_desc|name of a state to run
 
}}{{#vardefine:p_label_state_desc|state name
{{#vardefine:name|state}}
}}{{#vardefine:p_events_desc|one or more {{LSLGC|Events|events}}
 
}}{{#vardefine:header_title|default { {{LSL Param|events}} }
{{#vardefine:p_jump_state_desc|実行するstate名です。}}
}}{{#vardefine:header_text|{{{!}}
{{#vardefine:p_label_state_desc|state名です。}}
{{#vardefine:p_events_desc|一つ以上の {{LSLGC|Events/ja|イベント}}です。}}
 
{{#vardefine:header_title|default { {{LSL Param|events}} } }}
{{#vardefine:header_text|{{{!}}
{{LSL DefineRow|event|events|{{#var:p_events_desc}}}}
{{LSL DefineRow|event|events|{{#var:p_events_desc}}}}
{{!}}}
{{!}}}
The default state definition.
default state の定義です。
}}{{#vardefine:constants_nb|
}}
 
{{#vardefine:constants_nb|
<div id="box">
<div id="box">
<h2>state {{LSL Param|label_state|target}} { {{LSL Param|events}} }</h2>
<h2>state {{LSL Param|label_state|target}} { {{LSL Param|events}} }</h2>
Line 22: Line 27:
{{LSL DefineRow|event|events|{{#var:p_events_desc}}}}
{{LSL DefineRow|event|events|{{#var:p_events_desc}}}}
{{!}}}
{{!}}}
'''target''' state definition.
'''target''' state の定義です。
</div>
</div>
</div>
</div>
{{!}}-
{{!}}
<div id="box">
<div id="box">
<h2>state {{LSL Param|jump_state|target}};</h2>
<h2>state {{LSL Param|jump_state|target}};</h2>
Line 33: Line 36:
{{LSL DefineRow|label|target|{{#var:p_jump_state_desc}}}}
{{LSL DefineRow|label|target|{{#var:p_jump_state_desc}}}}
{{!}}}<br/>
{{!}}}<br/>
When a ''state target;'' is encountered at runtime, if the ''current'' state and the ''target'' state are different:
''state target;''が実行時に発生し、''現在'' のstate と ''target'' state が異なる場合、以下の順に動作します。
#Trigger [[state_exit]] in the current state if it exists and clear the event queue.
#現在のstate内に[[state_exit]]が'''存在する場合は実行され、'''イベントキューは消去されます。
#Change state to ''target'', any [[listen]]s are unregistered.
#''target''にstateが変わると、'''全ての'''[[llListen/ja|listen]]は解除されます。
#Trigger [[state_entry]] in the ''target'' state if it exists.
#''target'' stateに[[state_entry]]が'''存在する場合は実行されます。'''
If ''target'' state is the same as the ''current'' state, no state change occurs nor do any of the side effects.
もし''target'' state ''現在'' state と同じ場合、'''state は変わらず、またどんな副作用もありません。'''
</div>
</div>
</div>
</div>
}}{{#vardefine:examples|
}}
<pre>
 
default
{{#vardefine:examples|
<lsl>default
{
{
     touch_start(integer a)
     touch_end(integer a)
     {
     {
         state hello;
         state hello;
Line 61: Line 65:
         llOwnerSay("Goodbye");
         llOwnerSay("Goodbye");
     }
     }
}
}</lsl>
</pre>
}}
}}{{#vardefine:notes|
 
}}{{#vardefine:caveats|*On state change:
{{#vardefine:notes|{{#var:notes}}
**All [[listen]]s are released.
* これまで溜っていたイベントを破棄するのを防ぐために、{{LSLG/ja|state}} ''target'' コマンドを {{LSLG/ja|timer}} イベントに移動して、{{LSLG/ja|llSetTimerEvent}}( 0.01 ) で呼び出します。それから新しい {{LSLG/ja|state}} の {{LSLG/ja|state_entry}} でタイマーを止めます。これが心配な場合に {{LSLG/ja|state_exit}} を使用しないでください。}}
**The event queue is cleared
 
*The ''default'' state must be defined before all others.
{{#vardefine:caveats|*stateを変える上で
*States cannot have user functions or variables inside their immediate scope, only event definitions may be inside a states scope.
**全ての[[llListen/ja|listen]]はリリースされます。
}}{{#vardefine:helpers|
**イベントキューは消去されます。
}}{{#vardefine:also_header|<h3>Keywords</h3>
**[[llSensorRepeat/ja|Repeating sensors]] はリリースされます。
**[[llSetTimerEvent/ja|timer event clock]] はクリア'''されません。'''
**つまり、次の state に timer イベントがあり、前の state でタイマーが設定されていると、以前の state で設定された遅延時間で新しい state の timer イベントが発生することになります。
*''default'' stateはほかのstateに行く前に定義すべきです。
*state範囲内にユーザ関数、あるいはユーザ変数を設定することはできず、 イベントだけがstate範囲内で定義できます。
*ユーザ定義(グローバル)関数は state を変えることができません。コンパイラは 'ERROR: Global functions can't change state' というエラーを出すでしょう。'''注意''': 以前はグローバル関数でも 'if' 文の中なら state を変えることができましたが、この"裏技"はもう使えません。
}}
 
{{#vardefine:helpers|}}
 
{{#vardefine:also_header|<h3>キーワード</h3>
{{{!}}
{{{!}}
{{LSL DefineRow||[[jump]]|}}
{{LSL DefineRow||{{LSLG/ja|jump}}|}}
{{LSL DefineRow||[[return]]|}}
{{LSL DefineRow||{{LSLG/ja|return}}|}}
{{!}}}
{{!}}}
}}{{#vardefine:also_footer|
}}
}}{{#vardefine:also_functions|
 
}}{{#vardefine:also_events|
{{#vardefine:also_footer|}}
{{LSL DefineRow||[[state_entry]]|}}
 
{{LSL DefineRow||[[state_exit]]|}}
{{#vardefine:also_functions|}}
}}{{#vardefine:also_articles|
 
}}{{#vardefine:also_tests|
{{#vardefine:also_events|
}}{{#vardefine:location|
{{LSL DefineRow||{{LSLG/ja|state_entry}}|}}
}}{{LSL Generic}}{{LSLC|Flow Control}}{{LSLC|Script}}
{{LSL DefineRow||{{LSLG/ja|state_exit}}|}}
}}
 
{{#vardefine:also_articles|}}
 
{{#vardefine:also_tests|}}
 
{{#vardefine:location|}}
 
}}{{LSL Generic/ja}}{{LSLC/ja|Flow Control}}{{LSLC/ja|Script}}{{LSLC/ja|State}}

Latest revision as of 01:53, 8 September 2012

LSLでは、ほとんどのスクリプトは何らかの入力を受け取るか、環境で何らかの変化を検出するまで、アイドル状態にあります。どの瞬間も、スクリプトは何らかのstateにあり、プログラマーによって定義された多くのスキームと一致したイベント、あるいはインプットに反応するでしょう。しかしながら、スクリプトは二つ以上の異なるstateを包含することができ、状態によってイベントやインプットに対して異なる反応を定義できます。

中心的なstateはdefault stateです。スクリプトはコンパイルされた時、リセットもしくはリロードされた時、まずdefaultのstateが実行されます。default stateの定義の後に続けて、スクリプトで処理されるイベントがどのような入力、変更によって発生するのかを定義する、新たなstateを追加することができます。

default { events }

default { events }
• event events 一つ以上の イベントです。

default state の定義です。

state target { events }

• label target state名です。
• event events 一つ以上の イベントです。

target state の定義です。

state target;

• label target 実行するstate名です。

state target;が実行時に発生し、現在 のstate と target state が異なる場合、以下の順に動作します。

  1. 現在のstate内にstate_exit存在する場合は実行され、イベントキューは消去されます。
  2. targetにstateが変わると、全てのlistenは解除されます。
  3. 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 を変えることができましたが、この"裏技"はもう使えません。

重要な記事

   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 ) で呼び出します。それから新しい statestate_entry でタイマーを止めます。これが心配な場合に state_exit を使用しないでください。

参考情報

キーワード

•  jump
•  return

イベント

•  state_entry
•  state_exit

特記事項

Issues

   Server drops first touch event when a script returns to a state with a touch_start handler