2008年10月10日金曜日

スクリプトの話(3)〜イベントについて

「イベントについて」というタイトルを書いてすぐに、
僕が書くと音楽イベントか何かの記事のようだと
自分で笑ってしましましたが、
ここはリンデン・スクリプトで言う「イベント」、
つまりコンピュータへの命令が実行される「きっかけ」の話です。

前回のおさらいをしておくと、スクリプトには

① 登場人物としての変数と関数の定義
② 場面としてのステート、特に第一幕としてのdefaultステート
③ その場面におけるセリフや動作である命令
④ 命令が実行されるためのきっかけであるイベント

が書かれてなければなりません。
これがスクリプトが動くための最低条件というわけです。

が、実際にスクリプトが動くためには
何度も繰り返しているようにきっかけ=イベントが必要です。
イベントによって動くプログラムのことを
専門用語で「イベント・ドリブン」と呼んでいます。
「event-driven」という英語から来ていますが、
「driven」は「drive」=「ぐいぐい前に動かす」の変化形ですから、
「イベントがぐいぐい動かすプログラム」というわけですね。
リンデン・スクリプトは正にそういう
イベント・ドリブン型のプログラムというわけです。

それでは、プログラムが動くためにはどんなイベントがあるか、
ちょっと見ておきましょう。

On_rez(オブジェクトが出現した時)
touch_start(オブジェクトがクリックされた時)
Changed(オブジェクトに変化があった時)
Attach(オブジェクトが装着された時)
Money(オブジェクトに対して支払いがされた時)
Listen(llListenから発言内容を聴くよう命令された時)
Sensor(llSensorやllSensorRepeatから検知するよう命令された時)
timer(llSetTimerEventで指定された時間でイベント内の命令を繰り返す)
Link_message(親プリムのllMessageLinkedからメッセージを受け取った時)

まだまだ他にもありますが、何れもオブジェクトに対して
何らかの変化が加えられた時、というのがわかるでしょう。
でも待てよ、そうすると、
別に何もきっかけがなくても、変化がなくても実行したい場合は?
そんな命令は実行できないのでしょうか?

その為に用意されているのがおなじみ「state_entry」のイベントです。
「state_entry」とは「そのステートに入った時」という意味。
何にもないところから始まる「第一幕」が
「default」=「何にもない」というステートでしたが、
幕が開いてすぐ、まだ何にもきっかけがない状態こそ、
「幕が開いたよ!」に当たるこの「state_entry」なわけです。

新しいスクリプトを作ると必ずサンプルスクリプトが書いてあって、

default
{
 state_entry()
 {
  llSay(0, "Hello, Avatar!");
 }
...(中略)...
}

となってますね。
defaultステートの、state_entryというところに書いてあるので、
何にも変化が起きなくても、
このスクリプトが作られたらすぐに
「Hello, Avatar!」と喋るのですね。
どういうイベントにしたらいいかわからない時は
まずはこの state_entry を使ってみるといいと思います。

     *   *   *

今回までスクリプト全体についてのやや抽象的な話をしてきましたが、
いよいよ次回は「一番多い間違い」について
より具体的に書いていきたいと思います。
どうぞよろしくお願いします。

2 Responses to “スクリプトの話(3)〜イベントについて”

さかぷん さんのコメント...

こんだけの長文を毎日連載とはお疲れ様です^^;
自分のレベルは特に見る必要はない話ですが、語源のこととか知識になるのはおもしろいです^^
こういう記事の連載って大変だと思いますが、がんばってくださいね~

Hiroshi さんのコメント...

さかぶんさん、コメントありがとうございます。
あはは、レベルの高い方に見て頂くのは
恥ずかしい限りなのですが。。。^^;
スクリプトのサイトはいろいろありますが、
できるだけ他にはないような内容を
織り込んでいきたいと思っています。
これからもどうぞよろしくお願いします。

Leave a Reply