Difference between revisions of "状態"

From Second Life Wiki
Jump to navigation Jump to search
 
(6 intermediate revisions by 2 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にあり、プログラマーによって定義された多くのスキームと一致したイベント、あるいはインプットに反応するでしょう。しかしながら、スクリプトは二つ以上の異なるstateを包含することができ、状態によってイベントやインプットに対して異なる反応があります。


中心的なstateはdefault stateです。スクリプトはコンパイルされた時、リセットもしくはリロードされた時、defaultのstateから入ります。default stateの定義の後に、スクリプトでイベントが処理されることを、どのようにそしてどの変更で使用するのか定義しているstateを、続けて追加することができます。
中心的なstateはdefault stateです。スクリプトはコンパイルされた時、リセットもしくはリロードされた時、まずdefaultのstateが実行されます。default stateの定義の後に続けて、スクリプトで処理されるイベントがどのような入力、変更によって発生するのかを定義する、新たなstateを追加することができます。
{{#vardefine:name|state
{{#if:
}}{{#vardefine:p_jump_state_desc|実行するstate名です。
 
}}{{#vardefine:p_label_state_desc|state名です。
{{#vardefine:name|state}}
}}{{#vardefine:p_events_desc|一つ以上の {{LSLGC|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}}}}
{{!}}}
{{!}}}
default state の定義です。
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 25: Line 30:
</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/>
''state target;''が実行時にぶつかったとき、''現在'' のstate と ''target'' state が異なる場合
''state target;''が実行時に発生し、''現在'' のstate と ''target'' state が異なる場合、以下の順に動作します。
#現在のstate内で[[state_exit]]が実行する場合、現在のstateは終了し、イベントキューは消去されます。
#現在のstate内に[[state_exit]]が'''存在する場合は実行され、'''イベントキューは消去されます。
#''target''にstateが変わると、全ての[[listen]]は解除されます。
#''target''にstateが変わると、'''全ての'''[[llListen/ja|listen]]は解除されます。
#''target'' stateの[[state_entry]]が実行された場合、''target'' stateは
#''target'' stateに[[state_entry]]が'''存在する場合は実行されます。'''
終了します。
もし''target'' state が ''現在'' の state と同じ場合、'''state は変わらず、またどんな副作用もありません。'''
もし''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 62: Line 65:
         llOwnerSay("Goodbye");
         llOwnerSay("Goodbye");
     }
     }
}
}</lsl>
</pre>
}}
}}{{#vardefine:notes|
 
}}{{#vardefine:caveats|*stateを変える上で
{{#vardefine:notes|{{#var:notes}}
**全ての[[listen]]はリリースされます。
* これまで溜っていたイベントを破棄するのを防ぐために、{{LSLG/ja|state}} ''target'' コマンドを {{LSLG/ja|timer}} イベントに移動して、{{LSLG/ja|llSetTimerEvent}}( 0.01 ) で呼び出します。それから新しい {{LSLG/ja|state}} の {{LSLG/ja|state_entry}} でタイマーを止めます。これが心配な場合に {{LSLG/ja|state_exit}} を使用しないでください。}}
 
{{#vardefine:caveats|*stateを変える上で
**全ての[[llListen/ja|listen]]はリリースされます。
**イベントキューは消去されます。
**イベントキューは消去されます。
**[[llSensorRepeat/ja|Repeating sensors]] はリリースされます。
**[[llSetTimerEvent/ja|timer event clock]] はクリア'''されません。'''
**つまり、次の state に timer イベントがあり、前の state でタイマーが設定されていると、以前の state で設定された遅延時間で新しい state の timer イベントが発生することになります。
*''default'' stateはほかのstateに行く前に定義すべきです。  
*''default'' stateはほかのstateに行く前に定義すべきです。  
*state範囲内にユーザ関数、あるいはユーザ変数を設定することはできず、 イベントだけがstate範囲内で定義できるでしょう。
*state範囲内にユーザ関数、あるいはユーザ変数を設定することはできず、 イベントだけがstate範囲内で定義できます。
}}{{#vardefine:helpers|
*ユーザ定義(グローバル)関数は state を変えることができません。コンパイラは 'ERROR: Global functions can't change state' というエラーを出すでしょう。'''注意''': 以前はグローバル関数でも 'if' 文の中なら state を変えることができましたが、この"裏技"はもう使えません。
}}{{#vardefine:also_header|<h3>キーワード</h3>
}}
 
{{#vardefine:helpers|}}
 
{{#vardefine:also_header|<h3>キーワード</h3>
{{{!}}
{{{!}}
{{LSL DefineRow||[[jump/ja|jump]]|}}
{{LSL DefineRow||{{LSLG/ja|jump}}|}}
{{LSL DefineRow||[[return/ja|return]]|}}
{{LSL DefineRow||{{LSLG/ja|return}}|}}
{{!}}}
{{!}}}
}}{{#vardefine:also_footer|
}}
}}{{#vardefine:also_functions|
 
}}{{#vardefine:also_events|
{{#vardefine:also_footer|}}
{{LSL DefineRow||[[state_entry/ja|state_entry]]|}}
 
{{LSL DefineRow||[[state_exit/ja|state_exit]]|}}
{{#vardefine:also_functions|}}
}}{{#vardefine:also_articles|
 
}}{{#vardefine:also_tests|
{{#vardefine:also_events|
}}{{#vardefine:location|
{{LSL DefineRow||{{LSLG/ja|state_entry}}|}}
}}{{LSL Generic/ja}}{{LSLC|Flow Control|3={{#var:lang}}}}{{LSLC|Script|3={{#var:lang}}}}
{{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