`

MSAgent 详细解说(上)

阅读更多

转:http://www.blueidea.com/tech/web/2004/1643.asp 作者windy_sk 邮箱:windy_sk@126.com

下面是原文:

本文完全原创,所有参考都是
msdn.microsoft.com/library/en-us/msagent/agentstartpage_7gdh.asp

引子:
本来两年前就打算写了,结果拖了这么长时间,近日看到有朋友问及相关的东西,终于决定在还没有完全遗忘之前把自己残存的记忆表达出来,纸、笔...写!
不要说你完全了解 MSAgent,可能你对它的认识也不过是知道而已~~~~~~~~

开篇:
可能 MSAgent 这个名字你不清楚,但如果提起 Office 助手我想在这个目前 MicroSoft 独霸天下的电脑世界应该鲜有人不知道,本文就是交给你如何在网页中调用这个在线尤物。

入题:
一、抛砖引玉
首先,我们先来看一下一个最简单的效果:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">    
  2. <script language=< span="">"JavaScript">   
  3. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  4.   
  5. var Agent = null;   
  6. var AgentID = "Merlin";   
  7. var AgentACS = "merlin.acs";   
  8. MSAgent.Connected = true;   
  9. MSAgent.Characters.Load(AgentID,AgentACS);   
  10. Agent = MSAgent.Characters.Character(AgentID);   
  11. Agent.Show();   
  12. </script>  

 

AgentID 内部索引字串,由用户定义;
AgentACS 所调用的角色文件,可以为浏览者本地或远程文件,后面会有单独的部分说明。
MSAgent.Connected 建立连接;
MSAgent.Characters.Load 读取角色;
MSAgent.Characters.Character 返回角色对象;
Agent.Show 显示角色;

好了,我现在已经把 MSAgent 带到你面前了。什么?什么东西都没看到?只有浏览器的报错!没关系,在后面的文章里,我也会告诉你如何才能看到他,当然,这个看到指的是所有浏览你网页的人!

二、伶牙俐齿
下面,我们就让他来做一点实际的东西 —— 说话!还是接续上例:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">    
  2. <script language=< span="">"JavaScript">   
  3. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  4.   
  5. var Agent = null;   
  6. var AgentID = "Merlin";   
  7. var AgentACS = "merlin.acs";   
  8. MSAgent.Connected = true;   
  9. MSAgent.Characters.Load(AgentID,AgentACS);   
  10. Agent = MSAgent.Characters.Character(AgentID);   
  11. Agent.LanguageID = 0x0409;   
  12. Agent.Show();   
  13. Agent.Speak("Hello Everybody, I am Merlin!");   
  14. Agent.Think("What shall I do the next?");   
  15. </script>  

Merlin 说话了(如果要读出声音来的话,需要客户端在 MicroSoft 的网站上下载并安装相应的语音引擎)!这里涉及到这么几个新的东西:

Agent.LanguageID 声明语言种类,0x0409是英文的编号(有关语言编号请参考 www.microsoft.com/globaldev/reference/oslocversion.mspx ),目前如果没有这个声明,或声明为错误的语种,则语言只是一次性完全显示。

Agent.Speak() 和 Agent.Think() 是 MSAgent 的两个语言表达显示行为,只有显示图形的区别。
了解了这些功能,是不是正在陶醉呀?别急,还有更好的东西呢!

三、活灵活现
总是看着一个呆头呆脑的东西一动不动,即使是很 Q ,也会有感到多少的厌烦,下面我们就让他动起来。
这个例子由于调用的是网络文件,所以会慢一点,请耐心等待一下!

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">    
  2. <script language=< span="">"JavaScript">   
  3. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  4.   
  5. var Agent = null;   
  6. var AgentID = "Merlin";   
  7. var AgentACS = "http://agent.microsoft.com/agent2/chars/merlin/merlin.acf";   
  8. var AgentStates = "Showing, Hiding, Speaking, Moving";   
  9. var AgentAnimations = "GetAttention, GetAttentionReturn, Congratulate, Acknowledge, Read, WriteContinued, WriteReturn, wave";   
  10. var AgentLoadRequest, AgentStateRequest, AgentAnimationRequest;   
  11.   
  12. MSAgent.Connected = true;   
  13. AgentLoadRequest = MSAgent.Characters.Load(AgentID,AgentACS);   
  14. Agent = MSAgent.Characters.Character(AgentID);   
  15. Agent.LanguageID = 0x0409;   
  16.   
  17. AgentStateRequest = Agent.get("state", AgentStates);    
  18. AgentAnimationRequest = Agent.get("animation", AgentAnimations);   
  19.   
  20. Agent.Show();   
  21. Agent.MoveTo(400,300);   
  22. Agent.Play("GetAttention");   
  23. Agent.Play("GetAttentionReturn");   
  24. Agent.speak("Hi, may I have your attention, please?");   
  25. Agent.Play("Congratulate");   
  26. Agent.speak("So nice to meet you!");   
  27. Agent.Play("Think");   
  28. Agent.speak("How do think about me?");   
  29. Agent.Play("Acknowledge");   
  30. Agent.Speak("It's very cool, ya?");   
  31. Agent.Play("Read");   
  32. Agent.Play("WriteContinued");   
  33. Agent.Play("WriteReturn");   
  34. Agent.Speak("Oh, I have lots of things to do, see you !");   
  35. Agent.Play("wave");   
  36. Agent.Speak("Bye-bye!");   
  37. Agent.Hide();   
  38. </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 文件时有比较实际的用途,这个会在后面说明!

四、改头换面
MSAgent = Merlin ? 错!MSAgent 是指一系列动画人物的总称,最常见的 office 中的那些活宝,各位应该都熟悉吧?先来看看下面的这个例子:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">    
  2. <script language=< span="">"JavaScript">   
  3. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  4.   
  5. var Agent = null;   
  6. var AgentID, AgentACS;   
  7. var AgentLoad = false;   
  8.   
  9. function LoadAgent(NewAgent) {   
  10.  if(AgentLoad) {   
  11.   MSAgent.Characters.Unload(AgentID);   
  12.   MSAgent.Connected = false;   
  13.   Agent = null;   
  14.  }   
  15.  AgentID = NewAgent;   
  16.  AgentACS = "http://agent.microsoft.com/agent2/chars/" + NewAgent + "/" + NewAgent + ".acf";   
  17.  MSAgent.Connected = true;   
  18.  MSAgent.Characters.Load(AgentID, AgentACS);   
  19.  AgentLoad = true;   
  20.  Agent = MSAgent.Characters.Character(AgentID);   
  21.  Agent.get("state""Showing, Hiding");   
  22.  Agent.MoveTo(400, 300);   
  23.  Agent.Show();   
  24.  return;   
  25. }   
  26.   
  27. LoadAgent("Merlin");   
  28. </script>  
  29.   
  30. MSAgent Select :    
  31. "Agent_select" onchange="LoadAgent(this[this.selectedIndex].text)">   
  32.   Merlin   
  33.   Peedy   
  34.   Genie   
  35.   Robby   
  36.   

看到没有? 原来 MSAgent 还有这么多可爱的造型呢!上面的例程中,我定义了一个读取角色的函数 LoadAgent ,通过这个函数更换角色,其中的大部分的功能在前面的章节中已经介绍了,这里仅仅说明一下,新的方法:

MSAgent.Characters.Unload() 卸载角色,其中 AgentID ,必须是 MSAgent.Characters.Load() 中声明过的

Agent.MoveTo() 这个方法上一节中介绍过,但是如果把它放在 Agent.Show() ,则相当于定义角色的出现位置

其实,MSAgent 绝对不仅仅是那么多,但是 MicroSoft 的官方网站上只提供了那么多……怎么办?可以从他的网站上连接角色,当然可可以从你的网站上呀!你可以在这里 www.microsoft.com/msagent/downloads/user.asp 下载官方角色以及语音引擎(可惜没有中文);当然,如果你有兴趣的话也可以开发一个属于自己的 Agent ,相关开发工具 www.microsoft.com/msagent/downloads/developer.asp ,网上也有很多高手做好的动画人物,推荐一个网站 www.msagentring.org/chars.htm 你也可以自己搜索一下。

安装后角色文件存放在 %WINDOWS%\msagent\chars 目录下的 *.acs 文件,上传到服务器上,直接引用到那个路径就可以了!(你也可以在你的硬盘里搜索一下 *.acs 会有不小的收获呦)这里要说明一下,请自行更改程序中标明网络路径的相关语句,且注意扩展名是 .acs !

如果要让本机支持相应的 MSAgent ,也就是说不用网络调用,只要把 *.acs 文件 copy 到 %WINDOWS%\msagent\chars 目录就可以了,但如果是 *.exe 的安装文件,则会自动把角色文件放置到相应的路径下。

五、排难解错
能否显示 MSAgent 的关键在于是否安装了 MSAgent 的核心组件
( Microsoft Agent core components - activex.microsoft.com/activex/controls/agent2/MSagent.exe ),但是如何让这一被动行为变为主动呢?可以用下面两种方法:

方法一:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F" CodeBase="http://activex.microsoft.com/activex/controls/agent2/MSagent.exe#VERSION=2,0,0,0">   

特点:自动下载组件并安装,比较方便,但会下载的等待时间不会提示,在网速慢的时候会以为页免死掉,且不是很方便控制。

方法二:

js 代码
  1. <script language=< span="">"javascript">   
  2. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  3.   
  4. function Agent_load_error(){   
  5.  alert("To make the MSAgent available, /nplease install Microsoft Agent core components first !");   
  6.  window.open("http://activex.microsoft.com/activex/controls/agent2/MSagent.exe");   
  7.  return;   
  8. }   
  9. </script>  
  10. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F" onerror="Agent_load_error()">   

特点:方便出错控制,用户控制下载,但是不能当时显示,需要安装后再次刷新页面。

使用哪种方法就属于见仁见智了,但是最不明智的方法就是两种方法一起上,实践证明 CodeBase 会先于 onerror 生效!

不管怎么说,调用本地角色也比网络角色速度上要快得多,但是你如何预知客户端是否安装了该角色呢?看看下面的例子:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">    
  2. <script language=< span="">"JavaScript">   
  3. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  4.   
  5. var Agent = null;   
  6. var AgentID, AgentACS;   
  7. var AgentLoad = false;   
  8.   
  9. function LoadAgent(NewAgent) {   
  10.  var remote = false;   
  11.  if(AgentLoad) {   
  12.   MSAgent.Characters.Unload(AgentID);   
  13.   MSAgent.Connected = false;   
  14.   Agent = null;   
  15.  }   
  16.  AgentID = NewAgent;   
  17.  AgentACS = NewAgent + ".acs";   
  18.  MSAgent.Connected = true;   
  19.  try {   
  20.   MSAgent.Characters.Load(AgentID, AgentACS);   
  21.   agent_exist.innerText = "Local MSAgent load successfully!";   
  22.  } catch(e) {   
  23.   AgentACS = "http://agent.microsoft.com/agent2/chars/" + NewAgent + "/" + NewAgent + ".acf";   
  24.   remote = true;   
  25.   MSAgent.Characters.Load(AgentID, AgentACS);   
  26.   agent_exist.innerText = "Local MSAgent load unsuccessfully, as a advice, you'd better to download the charactor file to your hard disk!";   
  27.  }   
  28.  AgentLoad = true;   
  29.  Agent = MSAgent.Characters.Character(AgentID);   
  30.  if(remote) Agent.get("state""Showing, Hiding");   
  31.  Agent.MoveTo(400, 300);   
  32.  Agent.Show();   
  33.  return;   
  34. }   
  35.   
  36. window.onload = function(){LoadAgent("Merlin");};   
  37. </script>  
  38.   
  39. MSAgent Select :    
  40. "Agent_select" onchange="LoadAgent(this[this.selectedIndex].text)">   
  41.   Merlin   
  42.   Peedy   
  43.   Genie   
  44.   Robby   
  45.   
  46.   
  47. Load Status: "agent_exist">   

通过设置错误捕获,可以方便的找到调用 MSAgent 的最佳方式,当然,你还可以通过 DHTML 加上相应的角色下载链接,并指导用户将 *.acs 文件 copy 到相应目录(%WINDOWS%\msagent\chars)或直接安装 *.exe 的角色安装文件以方便下次浏览,我仅仅是为你提供一个思路,具体实践还是自己发挥吧!

六、事件响应
像所有 OOP 一样,MSAgent 也设置有相应的事件响应,看看下面的例子,试试在角色或任务栏的图标上点击鼠标(单/双击),你也可以移动一下角色,看看它有什么反应:

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">   
  2.   
  3. <script language=< span="">"JavaScript" For="MSAgent" Event="Click(CharacterID, Button, Shift, X, Y)">   
  4. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  5.   
  6. if(Button==1 && Agent.Visible) {   
  7.  if(remote) {   
  8.   Agent.get("state""Speaking");    
  9.   Agent.get("animation""Acknowledge, Pleased");   
  10.  }   
  11.  Agent.Play("Acknowledge");   
  12.  Agent.Speak("Yes sir! " + CharacterID + " is right here!");   
  13.  Agent.Play("Pleased")   
  14.  Agent.Speak("What can I do for you?");   
  15. else if(Button==4097) {   
  16.  Agent.Visible?Agent.Hide():Agent.show();   
  17. }   
  18. </script>  
  19.   
  20. <script language=< span="">"JavaScript" For="MSAgent" Event="DblClick(CharacterID, Button, Shift, X, Y)">   
  21. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  22.   
  23. if(Button==1 || Button==4097) {   
  24.  Agent.StopAll();   
  25.  if (!Agent.HasOtherClients) {   
  26.   MSAgent.Characters.Unload(AgentID);   
  27.   MSAgent.Connected = false;   
  28.   Agent = null;   
  29.   AgentLoad = false;   
  30.  }   
  31. }   
  32. </script>  
  33.   
  34. <script language=< span="">"JavaScript" For="MSAgent" Event="Move(CharacterID, X, Y, Cause)">   
  35. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  36.   
  37. if(Cause == 1) {   
  38.  if(remote) {   
  39.   Agent.get("state""Moving, Speaking");   
  40.   Agent.get("animation""Confused, RestPose");   
  41.  }   
  42.  Agent.MoveTo(400, 300);   
  43.  Agent.Play("Confused");   
  44.  Agent.Speak("Don't move me OK?");   
  45.  Agent.Play("RestPose");   
  46. }   
  47. </script>  
  48.   
  49. <script language=< span="">"JavaScript">   
  50. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  51.   
  52. var Agent = null;   
  53. var AgentID, AgentACS;   
  54. var AgentLoad = false;   
  55. var remote = false;   
  56.   
  57.   
  58. function LoadAgent(NewAgent) {   
  59.  if(AgentLoad) {   
  60.   MSAgent.Characters.Unload(AgentID);   
  61.   MSAgent.Connected = false;   
  62.   Agent = null;   
  63.  }   
  64.  AgentID = NewAgent;   
  65.  AgentACS = NewAgent + ".acs";   
  66.  MSAgent.Connected = true;   
  67.  try {   
  68.   MSAgent.Characters.Load(AgentID, AgentACS);   
  69.  } catch(e) {   
  70.   AgentACS = "http://agent.microsoft.com/agent2/chars/" + NewAgent + "/" + NewAgent + ".acf";   
  71.   remote = true;   
  72.   MSAgent.Characters.Load(AgentID, AgentACS);   
  73.   if(confirm("Cannot find the MSAgent charactor file on your hard disk! \nWould you like to download the MSAgent charactor file for the next show?"))   
  74.    window.open("http://www.msagentring.org/download.asp?char="+NewAgent.toLowerCase(),"_blank","top=2000px");   
  75.  }   
  76.  AgentLoad = true;   
  77.  Agent = MSAgent.Characters.Character(AgentID);   
  78.  Agent.LanguageID = 0x0409;   
  79.  if(remote) Agent.get("state""Showing, Hiding");   
  80.  Agent.MoveTo(400, 300);   
  81.  Agent.Show();   
  82.  return;   
  83. }   
  84.   
  85. LoadAgent("Merlin");   
  86. </script>  
  87.   
  88. MSAgent Select :    
  89. "Agent_select" onchange="LoadAgent(this[this.selectedIndex].text)">   
  90.   Merlin   
  91.   Peedy   
  92.   Genie   
  93.   Robby   
  94.   

是不是感觉交互性强了许多?我们来看一下事件处理的声明方法:
<script language="JavaScript" for="MSAgent_Object" event="Event_Name()">
//code...
</script>

熟悉一点 JS 编程的应该不会陌生这种声明方式,也就是对某一对象某一事件的单独处理的声明方法,但是如果是该成 MSAgent_Object.Event_Name = function() {//code...} 的事件处理声明是不可以的!(the only way to do this)

如果是采用网络调用的话,如果向用户通知相应的调用进度呢?

js 代码
  1. "visibility:hidden" id="MSAgent" classid="CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F">   
  2.   
  3. <script language=< span="">"JavaScript" For="MSAgent" Event="RequestStart(RequestObject)">   
  4. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  5.   
  6. switch (RequestObject) {   
  7.  case AgentLoadRequest :   
  8.   window.status = "Loading MSAgent File From Internet For " + AgentID + " ...";   
  9.   break;   
  10.  case AgentStateRequest :   
  11.   window.status = "Loading MSAgent State From Internet For " + AgentID + " ...";   
  12.   break;   
  13.  case AgentAnimationRequest :   
  14.   window.status = "Loading MSAgent Animation From Internet For " + AgentID + " ...";   
  15.   break;   
  16.  default:   
  17.   break;   
  18. }   
  19. </script>  
  20.   
  21. <script language=< span="">"JavaScript" For="MSAgent" Event="RequestComplete(RequestObject)">   
  22. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  23.   
  24. switch (RequestObject) {   
  25.  case AgentLoadRequest :   
  26.   if(RequestObject.Status == 0) {   
  27.    window.status = "MSAgent File For " + AgentID + " Has Been Loaded Successfully !";   
  28.   } else {   
  29.    window.status = "Cannot Load MSAgent File For " + AgentID + " From " + AgentACS + " !";   
  30.   }   
  31.   break;   
  32.  case AgentStateRequest :   
  33.   if(RequestObject.Status == 0) {   
  34.    window.status = "MSAgent State For " + AgentID + " Has Been Loaded Successfully !";   
  35.   } else {   
  36.    window.status = "Cannot Load MSAgent State For " + AgentID + " From " + AgentACS + " !";   
  37.   }   
  38.   break;   
  39.   break;   
  40.  case AgentAnimationRequest :   
  41.   if(RequestObject.Status == 0) {   
  42.    window.status = "MSAgent Animation For " + AgentID + " Has Been Loaded Successfully !";   
  43.   } else {   
  44.    window.status = "Cannot Load MSAgent Animation For " + AgentID + " From " + AgentACS + " !";   
  45.   }   
  46.   break;   
  47.   break;   
  48.  default:   
  49.   window.status = "";   
  50.   break;   
  51. }   
  52. </script>  
  53.   
  54. <script language=< span="">"JavaScript" For="MSAgent" Event="DragStart(CharacterID, Button, Shift, X, Y)">   
  55. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  56.   
  57. cur_x = X - Agent.width/2;   
  58. cur_y = Y - Agent.height/2;   
  59. </script>  
  60.   
  61. <script language=< span="">"JavaScript" For="MSAgent" Event="DragComplete(CharacterID, Button, Shift, X, Y)">   
  62. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  63.   
  64. if(remote) {   
  65.  AgentStateRequest = Agent.get("state""Moving, Speaking");   
  66.  AgentAnimationRequest = Agent.get("animation""Confused, RestPose");   
  67. }   
  68. Agent.MoveTo(cur_x, cur_y);   
  69. Agent.Play("Confused");   
  70. Agent.Speak("Don't move me OK?");   
  71. Agent.Play("RestPose");   
  72. </script>  
  73.   
  74. <script language=< span="">"JavaScript">   
  75. //Coded by Windy_sk <windy_sk@126.com> 20040214   
  76.   
  77. var Agent = null;   
  78. var AgentID, AgentACS;   
  79. var AgentLoad = false;   
  80. var remote = false;   
  81. var cur_x, cur_y;   
  82. var AgentLoadRequest, AgentStateRequest, AgentAnimationRequest;   
  83.   
  84. function LoadAgent(NewAgent) {   
  85.  if(AgentLoad) {   
  86.   MSAgent.Characters.Unload(AgentID);   
  87.   MSAgent.Connected = false;   
  88.   Agent = null;   
  89.  }   
  90.  AgentID = NewAgent;   
  91.  AgentACS = NewAgent + ".acs";   
  92.  MSAgent.Connected = true;   
  93.  try {   
  94.   AgentLoadRequest = MSAgent.Characters.Load(AgentID, AgentACS);   
  95.  } catch(e) {   
  96.   AgentACS = "http://agent.microsoft.com/agent2/chars/" + NewAgent + "/" + NewAgent + ".acf";   
  97.   remote = true;   
  98.   AgentLoadRequest = MSAgent.Characters.Load(AgentID, AgentACS);   
  99.   if(confirm("Cannot find the MSAgent charactor file on your hard disk! \nWould you like to download the MSAgent charactor file for the next show?"))   
  100.    window.open("http://www.msagentring.org/download.asp?char="+NewAgent.toLowerCase(),"_blank","top=2000px");   
  101.  }   
  102.  AgentLoad = true;   
  103.  Agent = MSAgent.Characters.Character(AgentID);   
  104.  Agent.LanguageID = 0x0409;   
  105.  if(remote) {   
  106.   AgentStateRequest = Agent.get("state""Showing, Thinking, Hiding");   
  107.   AgentAnimationRequest = Agent.get("animation""GetAttention, GetAttentionContinued, GetAttentionReturn");   
  108.  }   
  109.  Agent.MoveTo(400, 300);   
  110.  Agent.Show();   
  111.  Agent.Play("GetAttention");   
  112.  Agent.Play("GetAttentionContinued");   
  113.  Agent.Play("GetAttentionReturn");   
  114.  Agent.speak("Hi, I am " + NewAgent + "!");   
  115.  Agent.think("Oh so bad, I just wanna take a nap...");   
  116.  return;   
  117. }   
  118.   
  119. LoadAgent("Merlin");   
  120. </script>  
  121.   
  122. MSAgent Select :    
  123. "Agent_select" onchange="LoadAgent(this[this.selectedIndex].text)">   
  124.   Merlin   
  125.   Peedy   
  126.   Genie   
  127.   Robby   
  128.   

注意到窗口底部状态栏的显示了吗?虽然无法获取具体的下载进度,但是至少也可以让浏览者知道角色的动作为什么会有停顿(这个停顿只在某动画第一次调用的时候出现,调用后该动画会被缓存)。

更多的事件说明请参看 msdn.microsoft.com/library/en-us/msagent/paface_2xet.asp 但是浏览器所调用的 MSAgeng 对象并不是所有的事件都支持。

分享到:
评论

相关推荐

    MSAgent 详细解说(下)

    【MSAgent 详细解说(下)】 在上一部分中,我们了解了Microsoft Agent的基本概念,它的功能以及在应用程序中的作用。在本篇中,我们将深入探讨MSAgent的使用方法、API接口、源码分析以及一些实用工具,帮助开发者...

    MSAgent 详细解说第1/5页

    本文完全原创,所有参考都是 msdn.microsoft.com/library/en-us/msagent/agentstartpage_7gdh.asp 下面的相关 API 说明... 不要说你完全了解 MSAgent,可能你对它的认识也不过是知道而已~~~~~~~~ 开篇: 可能 MSAg

    kernel-devel-4.18.0-553.45.1.el8-10.x86-64.rpm

    Rocky Linux 8.10内核包

    Simulink中三阶单环多位量化Σ-Δ调制器的设计与实现-音频带ADC的应用(复现论文或解答问题,含详细可运行代码及解释)

    内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。

    计算机课后习题.docx### 【计算机科学】研究生入学考试计算机组成原理专项题库设计:考研复习资源集成与优化

    内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。

    __UNI__DB9970A__20250328141034.apk.1

    __UNI__DB9970A__20250328141034.apk.1

    minio-rsc-Rust资源

    rust for minio

    4-4-台区智能融合终端功能模块型式规范(试行).pdf

    国网台区终端最新规范

    《基于YOLOv8的化工管道焊缝缺陷检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    python源码-1个机器学习相关资源

    一个简单的机器学习代码示例,使用的是经典的鸢尾花(Iris)数据集,通过 Scikit-learn 库实现了一个简单的分类模型。这个代码可以帮助你入门机器学习中的分类任务。

    pyqt离线包,pyqt-tools离线包

    pyqt离线包,pyqt-tools离线包

    《基于YOLOv8的船舶机舱灭火系统状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    SQL常用日期和时间函数整理及使用示例

    SQL常用日期和时间函数整理及在sqlserver测试示例 主要包括 1.查询当前日期GETDATE 2.日期时间加减函数DATEADD 3 返回两个日期中指定的日期部分之间的差值DATEDIFF 4.日期格式转换CONVERT(VARCHAR(10),GETDATE(),120) 5.返回指定日期的年份数值 6.返回指定日期的月份数值 7.返回指定日期的天数数值

    GSDML-V2.3-Turck-BL20-E-GW-EN-20160524-010300.xml

    GSDML-V2.3-Turck-BL20_E_GW_EN-20160524-010300.xml

    T_CPCIF 0225-2022 多聚甲醛.docx

    T_CPCIF 0225-2022 多聚甲醛.docx

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计

    蚕豆脱壳机设计.zip

    蚕豆脱壳机设计.zip

    附件2-2:台区智能融合终端入网专业检测单位授权委托书.docx

    台区终端电科院送检文档

    Y6一39一No23.6D离心通风机 CAD().zip

    Y6一39一No23.6D离心通风机 CAD().zip

    django自建博客app

    django自建博客app

Global site tag (gtag.js) - Google Analytics