LearningFMS3中文版第4章(2)

By:www.hcxmflash.cn Date:2009-04-26

4.3.简单例子:共享影片

看看共享对象如何与远程网页工作,这简单的项目使用一个影片剪辑作为一个共享对象。这个例子说明如何设置并在Stage(你的舞台和所有连接到相同 共享对像的)范围内移动影片。在创建在线幻灯片放映应用程序的工作中,像是与PowerPoint简报,你需要的所有观众看到指示器移动到屏幕上的位置, 如果你不想让他们关注的焦点。使用一个岛屿影片剪辑,作为一个指示器,这个应用程序有4个岛的名字在舞台的四个角落。四个名字,只是简单地放置在舞台,当 你在屏幕上移动指示器,对所有连接到应用程序的屏幕上会跑到相同的位置。您将使用这些类和对象在应用程序中:

Classes

NetConnection

SharedObject

NetStatusEvent

SyncEvent

MouseEvent

Objects

Movie Clip (1)

请按照下列步骤操作,以制作该项目:

1. 建立一个MinSOmc.fla

2. 如图4-2中所示,在舞台的4个角落,建立一个不同的岛屿的名称

3. 如图4-2中所示,用绘图工具绘制一个岛屿(或者画一个箭头指示器或者其它东西)

4. 选择指示器把它转换为影片剪辑,名称为Island

5. 把指示器从舞台中删除,因为我们只需要从库中调用

6. 建立一个MinSOmc.as.

7. 在MinSOmc.as中添加如下代码

Example 4-2. MinSOmc.as

Code View:

package
{
  import flash.display.Sprite;
  import flash.net.SharedObject;
  import flash.events.NetStatusEvent;
  import flash.events.SyncEvent;
  import flash.net.NetConnection;
  import flash.events.MouseEvent;
  //import flash.net.ObjectEncoding;
 
  public class MinSOmc extends Sprite
  {
        private var pointer_so:SharedObject;
        private var nc:NetConnection;
        private var good:Boolean;
        private var island:Island;
 
        public function MinSOmc()
        {
             //NetConnection.defaultObjectEncoding=flash.net.ObjectEncoding.AMF0;
             //Connect
             var rtmpNow:String="rtmp://192.168.0.11/basicSO";
             nc=new NetConnection  ;
             nc.connect (rtmpNow);
             nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);
             island=new Island  ;
             addChild (island);
             island.x=200;
             island.y=200;
             island.addEventListener (MouseEvent.MOUSE_DOWN,beginDrag);
             island.addEventListener (MouseEvent.MOUSE_UP,endDrag);
        }
 
        private function doSO (e:NetStatusEvent):void
        {
             good=e.info.code == "NetConnection.Connect.Success";
             if (good)
             {
                   //Shared object
                   pointer_so=SharedObject.getRemote("point",nc.uri,false);
                   pointer_so.connect (nc);
                   pointer_so.addEventListener (SyncEvent.SYNC,doUpdate);
             }
        }
 
        private function doUpdate (se:SyncEvent):void
        {
             for (var cl:uint; cl < se.changeList.length; cl++)
             {
                   trace(se.changeList[cl].code);
                   if (se.changeList[cl].code == "change")
                   {
                        switch (se.changeList[cl].name)
                        {
                             case "xpos" :
                                   island.x=pointer_so.data.xpos;
                                   break;
                             case "ypos" :
                                   island.y=pointer_so.data.ypos;
                                   break;
                        }
                   }
             }
        }
 
        private function beginDrag (e:MouseEvent)
        {
             island.addEventListener (MouseEvent.MOUSE_MOVE,moveMc);
             island.startDrag ();
        }
 
        private function endDrag (e:MouseEvent)
        {
             island.stopDrag ();
        }
 
        private function moveMc (e:MouseEvent)
        {
             e.updateAfterEvent ();
             pointer_so.setProperty ("xpos",island.x);
             pointer_so.setProperty ("ypos",island.y);
        }
  }
}

因为这个应用程序也是使用basicSO服务端应用程序,你不需要在服务端应用程序目录中添加一个新的目录。

图4-2显示了你可看到当你测试应用程序和开始在舞台四周移动共享对像影片。

最初,共享对像连接触发了一个sync事件,结果是一个”clear”消息,可以在输出窗口中看到。然后,运动的影片剪辑改变了共同对象的值,因为 你是看当地的运动,同步代码显示了“success”。如果你在远程客户端移动对像,您将会看到“change” ,但因为它只是运行在测试模式中,并没有在一个远程客户端中,您将不会看到任何“change”的代码,除非你发布代码和打开一个浏览器并运行它在一个单 独的客户端中。

图4-2. Movie clip shared object

clip_image002

为了看看所有这些是怎么工作的,从moveMC函数开始:

pointer_so.setProperty ("xpos",island.x);
pointer_so.setProperty ("ypos",island.y);

这两行是设置pointer_so的数据:xpos 和ypos属性的值为共享影片的位置。当发生改变,触发一个SYNC事件。移动动作发起一个SyncEvent.changeList “change”的代码在远程客户端的播放器上。(对于本地客户端就是――动影片剪辑――代码是“success”,而非“change”)。然后通过遍 历客户的数组,然后共享对象的属性(名为xpos和ypos ) 。遍历首先找到每个客户和指示在哪里改变,然后更新影片剪辑的位置的值。

整个过程大概如下:

  • 一个客户端移动共享对像(岛屿的影片剪辑)
  • 在客户端的应用程序中移动更新共享对像的值
  • 共享对像的改变对所有远程客户端发出一个同步事件:changeList代码为”change”
  • doUpdate()函数指定共享对像属性的值为本地影片的x和y属性,从而可以移动影片剪辑

注意到,在介绍这一章中,你可以用共享对象做了很多实际的事了。使用多个模块,您可以建立一个模块 (一控制模块)在其它模块页面中远程控制对像。然而,用户在其他模块中,是无法控制任何共享对象,即使他们可以看到控制模块做出的改变。同样,您就可以设 立一个应用程序:有一个发言者指向网页的不同部分,当他在介绍时。同样,在游戏,你可以做各种有趣的事情,两个或两个以上的球员控制影片剪辑移动和移动其 他远程客户端。

用FMS3制作简单的聊天应用程序

4.4.简单例子:共享文本

已经看了一个影片剪辑的简单例子,现在来看看共享文本。本质上是一样的,而是立足的变化,共享对象的时段对运动鼠标的立场的阶段,变化的基础上打字输入的用户。替换基于共享对像移动鼠标位置的插槽的改变,这个改变是基于用户输入的文本。

在这个应用程序中,用户改变共享对像属性的值(文本内容),通过输入值和点击按纽来触发一个函数。函数取得文本输入框的值和指定共享对像属性的值,这是这个例子的基本元素:

Classes

NetConnection

SharedObject

NetStatusEvent

SyncEvent

MouseEvent

TextArea

InputText

Button

Objects

TextArea component

InputText component

Button component

Follow these steps to create the application:

1. 建立一个TextSO.fla

2. 打开库面板(Ctrl+L),然后从组件面板中拖一个TextArea,InputText,Button到库中

3. 建立一个TextSO.as

4. 在TextSO.as中输入以下代码

Example 4-3. TextSo.as

Code View:

package
{
  import fl.controls.TextArea;
  import fl.controls.Button;
  import fl.controls.TextInput;
  import flash.display.Sprite;
  import flash.events.SyncEvent;
  import flash.events.NetStatusEvent;
  import flash.events.MouseEvent;
  import flash.net.SharedObject;
  import flash.net.NetConnection;
 
  public class TextSO extends Sprite
  {
        private var button:Button;
        private var text_so:SharedObject;
        private var nc:NetConnection;
        private var textArea:TextArea;
        private var textInput:TextInput;
        private var rtmpGo:String;
        private var good:Boolean;
 
        public function TextSO ()
        {
             //Set up UIs
             textArea=new TextArea();
             textArea.setSize (200,300);
             textArea.move (20,20);
             addChild (textArea);
 
             textInput=new TextInput();
             textInput.move (20,330);
             addChild (textInput);
 
             button=new Button();
             button.width=50;
             button.label="Send";
             button.move (125,330);
             button.addEventListener (MouseEvent.CLICK,sendMsg);
             addChild (button);
 
             rtmpGo = "rtmp://192.168.0.11/basicSO";
             nc = new NetConnection( );
             nc.connect (rtmpGo);
             nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);
        }
 
        private function doSO (e:NetStatusEvent):void
        {
             good=e.info.code == "NetConnection.Connect.Success";
             if (good)
             {
                   //Set up shared object
                   text_so=SharedObject.getRemote("test",nc.uri,false);
                   text_so.connect (nc);
                   text_so.addEventListener (SyncEvent.SYNC,checkSO);
             }
        }
 
        private function checkSO (e:SyncEvent):void
        {
             for (var chng:uint; chng<e.changeList.length; chng++)
             {
                   switch (e.changeList[chng].code)
                   {
                        case "clear" :
                             break;
 
                        case "success" :
                             trace (text_so.data.msg);
                             break;
 
                        case "change" :
                             textArea.appendText (text_so.data.msg + "\n");
                             break;
                   }
             }
        }
 
        private function sendMsg (e:MouseEvent):void
        {
             text_so.setProperty ("msg",textInput.text);
             textArea.appendText (textInput.text + "\n");
        }
  }
}
 
 
                                       

当你测试这个应用程序的时候,你需要同时打开两个它。即使它是一个简单地应用,它完美的功能,让你可以整天与其他人聊天。只是记住这一点,当编写这个应用程序的时候,要记住以下顺序:

  • 改变共享对像属性的值(例如:文本内容)
  • 由改变共享对像 msg属性数据,触发SyncEvent.SYNC
  • 通过用户输入改变本地属性值,指定给TextArea组件
  • 通过共享对像值改变远程属性值
  • 当你把客户端共享对象看作一个简单的顺序,不难看出,它们是如何设立在一个脚本中。

图4-3 shows what you can expect to see in your browser.

Figure 4-3. Shared text

clip_image002

脚本保持一个很好的结构,从对在远程客户端上共享对象移动影片剪辑。在后面的应用中,您同样会看到一个非常类似的代码结构。

我做的一个:

image

参与讨论去: 艾睿(Airia) 交朋友去:友吧推荐文章去:网站贴吧
企业招聘

北京中视力天文化传媒有限公司

公司简介:北京中视力天文化传媒有限公司,是CCTV.com央视国际网络有限公司投资的互联网研发团队。我们是天使的使者。。。

招聘FlashAS程序员详情点击

Copyright 2007-2008 51AS.com Extended in kingcms 鲁ICP备06001158号