您的位置:首页 > 其它

VRML响应键盘事件——KeySensor/KbdSenSor扩展节点

2010-06-08 02:06 267 查看
KeySensor、KbdSensor是在vrml97标准之外扩展的节点,目前已经正式收入到X3D的标准当中,主要用于响应用户键盘按键操作,来对你的程序进行任意的控制。BS/Blaxxun浏览器对应的是KeySensor节点,Contvrml浏览器(插件)对应的是KbdSensor.

以KeySensor为例,首先来看一个例子,按下A键,发出声音:

]#VRML V2.0 utf8

#添加外部扩展声明
EXTERNPROTO KeySensor [
eventIn SFBool eventsProcessed
exposedField SFBool enabled
eventOut SFBool isActive
eventOut SFInt32 keyPress
eventOut SFInt32 keyRelease
eventOut SFInt32 actionKeyPress
eventOut SFInt32 actionKeyRelease
eventOut SFBool shiftKey_changed
eventOut SFBool controlKey_changed
eventOut SFBool altKey_changed
eventOut SFString character
]

["urn:inet:bitmanagement.de:node:KeySensor"]

#节点实例,可写在任意位置
DEF key KeySensor {enabled  TRUE
Group {
children [
DEF ts TimeSensor { loop TRUE cycleInterval 3.333 },
# Middle C (C4)
DEF C4 Transform {
children [
DEF WhiteKey Shape {
appearance Appearance {
material Material { }
}
geometry Box { size 0.23 0.1 1.5 }
},
Sound {
source DEF PitchC4 AudioClip {
url "tone1.wav"
pitch 1.0
}
}
]
},

]
}

#节点脚本
DEF keyscript Script {
eventIn SFInt32 keynum
eventOut SFTime	C4
eventOut SFTime	stop

url "javascript:
function keynum(value,time)
{
#当按下'A'键时响应
if(value==65)
{
C4=time;
stop=C4+0.2;
}
}
"
}

#建立KeySensor事件出口和脚本事件入口的连接
ROUTE key.keyPress TO keyscript.keynum
ROUTE keyscript.C4 TO PitchC4.startTime
ROUTE keyscript.stop TO PitchC4.stopTime


KeySensor不断的检测用户的键盘输入,一旦有字符键按下,KeySensor便获得这个字符的UTF-8编码值,将之转换为10进制整数,通过事件出口keyPress发送出来,通过路由传递到脚本节点keyscript的事件入口keynum,这个事件入口一旦接收到值,脚本节点就会执行这个事件入口的同名函数function keynum(value)。

域 描述,以KeySensor为例,KbdSensor类似:

eventsProcessed
如果设置为TRUE,浏览器的默认键盘动作将不被执行,这个标志位事件告知浏览器所有的事件将被keySensor节点处理。
enabled
设置允许使用这个传感器的标志
keyPress
这个事件出口在键盘上的任意字符按键被按下的时候发生,它的值是用户按下的键所代表的UTF-8字符的十进制整型数值
keyRelease
这个事件出口在键盘上的任意字符按键被释放的时候发生,它的值是用户释放的键所代表的UTF-8字符的十进制整型数值
actionKeyPress
当任意“非字符”键被按下时产生,它的值请对应参考下表
actionKeyRelease
当任意“非字符”键被释放时产生,它的值请对应参考下表
shiftKey_changed
shift键状态改变时发送,按下为TRUE,释放为FALSE
controlKey_changed
ctrl键状态改变时发送,按下为TRUE,释放为FALSE
altKey_changed
alt键状态改变时发送,按下为TRUE,释放为FALSE
isActive
活动标志,当有事件发生时为TRUE
character
在用户按下任意字符键时发送出这个字符键所代表的字符
ActionKey编码,KbdSensor与其不同,可用print()函数测试;

Key
Value
Home
1000
End
1001
PageUp
1002
PageDown
1003
Up
1004
Down
1005
Left
1006
Right
1007
F1-F12
1008-1019
用KbdKensor类似,注意键盘值和KeySensor的不一样,帮助文档在http://www.parallelgraphics.com/developer/products/cortona/extensions/keyboard/

]#VRML V2.0 utf8

EXTERNPROTO  KbdSensor [
exposedField	SFBool enabled	#TRUE
exposedField	SFBool isActive	#FALSE
eventOut		SFInt32 keyDown
eventOut		SFInt32 keyUp
]
[
"urn:ParaGraph:KbdSensor"
"http://www.parallelgraphics.com/vrml/proto/Cortona/extensions.wrl#KbdSensor"
]

DEF key KbdSensor {enabled TRUE isActive TRUE }

Group {
children [
DEF ts TimeSensor { loop TRUE cycleInterval 3.333 },

# Middle C (C4)
DEF C4 Transform {
children [
DEF WhiteKey Shape {
appearance Appearance {
material Material { }
}
geometry Box { size 0.23 0.1 1.5 }
},
Sound {
source DEF PitchC4 AudioClip {
url "tone1.wav"
pitch 1.0
}
}
]
},

]
}

DEF keyscript Script {
eventIn SFInt32 keynum
eventOut SFTime	C4
eventOut SFTime	stop

url "javascript:
function keynum(value,time)
{
if(value==65601)
{
C4=time;
stop=C4+0.2;
}
}
"
}

ROUTE key.keyDown TO keyscript.keynum
ROUTE keyscript.C4 TO PitchC4.startTime
ROUTE keyscript.stop TO PitchC4.stopTime
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: