[ VRMLaboR Home | Script | Prototype | Advanced ]

イベント駆動型プログラム

ここで使っているVRMLScriptとは、VRMLのためにJavaScriptを簡単にしたような、 VRML独特のプログラミング言語である。
JavaScriptなどでおなじみであるが、イベント駆動(処理)型プログラムというものについて少し説明しよう。

たとえば、ペットにエサをドラッグしたら、エサを食べるようにプログラムしよう。

そのスクリプトはおおまかにこんな感じだ。


  Script {
	eventIn SFBool drag
	eventOut SFTime eat
	url "vrmlscript:
	function drag(value, ts)
	{
		if(value == TRUE)
			eat = ts;
	}"
 }

 つまり、スクリプトはdragというイベントインに入力がない限り何もしない。マウ スの動作があって、たとえば平面センサーから、isActive=TRUE の入力がdragに入っ て、初めてスクリプトが動作するのである。
これは省エネルギーである。何もしないのによけいなループやチェックは回さない。 何か起こったときだけ何かを起こす。
それが「イベント駆動」という概念なのである。

しかし、ユーザー入力を待たない、自動物理シミュレーションのような、常に(つま りフレーム毎に)チェックと計算を必要とするものはどうプログラムすればよいのだ ろうか?

それはたとえばこうすればよいだろう。


    DEF CYCLE TimeSensor {
	loop TRUE
	cycleInterval 10
   }

   DEF ENGINE Script {
	eventIn SFFloat trig
	url "vrmlscript:
	function trig(value, ts)
	{
		.....シミュレーションアルゴリズム.......
	}
	}"
   }
   ROUTE CYCLE.fraction_changed TO ENGINE.trig

この中で、trig の引数valueはスクリプト内で、どこにも一切使われていない。つま り、スクリプトを常にぐるぐる回すためにだけ、タイムセンサーからの入力をスクリ プトに入れ続けているのである。
 ただ、これは処理としてすごくVRMLブラウザを重くしてしまうだろう。一枚グラフ ィックを描画する度に、タイムセンサーはイベントを出すはずなので、その度にスク リプトに書かれたプログラムを再計算するからである。