三、活灵活现总是看着一个呆头呆脑的东西一动不动,即使是很 Q ,也会有感到多少的厌烦,下面我们就让他动起来。这个例子由于调用的是网络文件,所以会慢一点,请耐心等待一下!
<object style="visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F"></object> <script language="JavaScript">//Coded by Windy_sk <windy_sk@126.com> 20040214
var Agent = null;var AgentID = "Merlin";var AgentACS = "http://agent.microsoft.com/agent2/chars/merlin/merlin.acf";var AgentStates = "Showing, Hiding, Speaking, Moving";var AgentAnimations = "GetAttention, GetAttentionReturn, Congratulate, Acknowledge, Read, WriteContinued, WriteReturn, wave";var AgentLoadRequest, AgentStateRequest, AgentAnimationRequest;
MSAgent.Connected = true;AgentLoadRequest = MSAgent.Characters.Load(AgentID,AgentACS);Agent = MSAgent.Characters.Character(AgentID);Agent.LanguageID = 0x0409;
AgentStateRequest = Agent.get("state", AgentStates); AgentAnimationRequest = Agent.get("animation", AgentAnimations);
Agent.Show();Agent.MoveTo(400,300);Agent.Play("GetAttention");Agent.Play("GetAttentionReturn");Agent.speak("Hi, may I have your attention, please?");Agent.Play("Congratulate");Agent.speak("So nice to meet you!");Agent.Play("Think");Agent.speak("How do think about me?");Agent.Play("Acknowledge");Agent.Speak("It's very cool, ya?");Agent.Play("Read");Agent.Play("WriteContinued");Agent.Play("WriteReturn");Agent.Speak("Oh, I have lots of things to do, see you !");Agent.Play("wave");Agent.Speak("Bye-bye!");Agent.Hide();</script>
看到没有?其实只要你善于调动它的积极性,MSAgent 也蛮活泼的!信息观察,不难发现,原来让 MSAgent 动起来,也不过就这么简单:Agent.MoveTo(x, y) 是角色移动到指定的坐标;Agent.Play(action) 命令角色做某个动作,动作列表见: msdn.microsoft.com/library/default.asp?url=/library/en-us/msagent/deschar_3pgy.asp (这里需要说明一下,不是所有的角色都支持这些动作的,处理方法后面会有说明!)
Agent.Hide() 隐藏角色(不是释放角色,通过 Agent.Show() 可以再次显示)Agent.get(Request, list) 预载相关 MSAgent 动画数据,MSAgent人物数据文件支持单结构角色文件(.acs,角色数据与动画数据存于同一个文件),也支持分离结构角色文件(.acf,角色数据存于.acf中,动画数据存于.aca中)。基于本地硬盘和网络调用均可采用这两种模式,当调用网络 acf 文件时,由于角色数据与动画数据分别下载,所以需要预载相关动画数据,使用 acs 文件(一般没有本地 acf 文件的可能性),不需要预载。
AgentLoadRequest, AgentLoadRequest 和 AgentAnimationRequest 这三个参数本例并没有实际用到,返回应相关操作的状态对象(相当于 readystatus 属性),在调用网络 acf 文件时有比较实际的用途,这个会在后面说明!