ColorBall を EXTERNPROTO を通じて生成する側のファイルです。
茶色の板の上のカーソルで触れた場所に、先のプロトタイプのインスタンスを生成するようにしてみました。
DEF Sc Script {
eventIn SFVec3f set_hitPoint
eventOut MFNode addChildren
url "javascript:
function set_hitPoint(vec,et) {
var Ball = new SFNode ( 'ColorBall {}' );
Ball.ballPosition = vec;
Ball.startFloat = et + 1;
addChildren[0] = Ball;
}
"
}
new SFNode ( 'ColorBall {}' );Browser.createVrmlFromString メソッドを使ってみても同じく生成されることはありません。
ColorBall を記述しています。
このファイルを実行しても画面中央に赤い球が1個表示されるだけです。
茶色い板の上でカーソルを動かすと、小さな球がマウスカーソルの軌跡を残すように追加されます。
追加された球は、少し時間が経つと板の上から離れて徐々に上昇します。
球の色は茶色い板の触れた場所により異なります。
DEF Sc Script {
eventIn SFVec3f set_hitPoint
eventIn MFNode set_children
field SFVec3f pos 0 0 0
field MFString protoUrl "proto_colorball_1.wrl"
field SFNode BallsGp USE Balls-Gp
directOutput TRUE
url "javascript:
function set_hitPoint (vec) {
pos = vec;
Browser.createVrmlFromURL( protoUrl, BallsGp, 'addChildren' );
}
function set_children (nodes,et) {
var last = nodes.length - 1;
nodes[last].ballPosition = pos;
nodes[last].startFloat = et + 1;
}
"
}
Browser.createVrmlFromURL( url, node, event )url で示された VRML ファイルを読み込んで、node で示されたノードの event で示されたフィールド ( MFNode ) に出力します。ColorBall は Group ノードの addChildren フィールドにイベントされるため、その children フィールドの一番最後に追加されます。
set_children 関数は その children フィールドが変化したタイミングで動作し、一番最後の要素に対して位置とアニメーション開始時刻を与えます。
KbdSensor {
exposedField SFBool enabled TRUE
exposedField SFBool isActive FALSE
eventOut SFInt32 keyDown
eventOut SFInt32 keyUp
}
Cortona Contact ならば、一度画面をクリックしてからキーボードのキーを押すと、その文字が画面に羅列されます。
(テンキー、カーソルキー、Shift キーなどは対応していません。)
Cosmo などキー入力に対応していないブラウザーならば「Sorry...」と表示され、キー入力は受け付けません。
DEF AddKeyboardSensor-Sc Script {
eventIn MFNode nodeAdded
eventOut MFNode children
eventOut MFString string
field MFString keySensorUrl "keysensor.wrl" # Contact用キー入力センサーノードが記述されたファイル
field SFNode thisNode USE AddKeyboardSensor-Sc # このスクリプトノード
field SFNode inputSc USE KeyInput-Sc # キー入力処理スクリプトノード
url "javascript:
function nodeAdded (nodes) {
children[0] = nodes[0];
Browser.addRoute( nodes[0], 'keyPress', inputSc, 'set_keyCode' );
}
function initialize() {
var brwName = Browser.getName();
if ( brwName == 'Cortona VRML Client' ) {
var keySensorNode = new SFNode ( 'KbdSensor { isActive TRUE }' );
children[0] = keySensorNode;
Browser.addRoute( keySensorNode, 'keyDown', inputSc, 'set_keyCode' );
}
else if ( brwName == 'blaxxunCC3D' ) {
Browser.createVrmlFromURL ( keySensorUrl, thisNode, 'nodeAdded' );
}
else {
string[0] = 'Sorry...';
string[1] = 'This does not operate in ' + brwName + '.';
}
}
"
}