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
}
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 + '.';
}
}
"
}