`
hgfghe4
  • 浏览: 61043 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

SWF间的双向通信

阅读更多

演示文件源码下载:

swfs_communication.rar
假设有一个主 SWf 名为 main.swf 加载一个名为 game.swf 的游戏模块:
1. main 里面使用 Loader 将 game.swf 加载进来;
2. 在 game 中定义 public function moveBall(speed:Number) 方法,用于开始游戏;
3. 在 main 里面使用类似 loader["content"].moveBall(speed) 的语句调用 game.swf 里面的方法;
4. game.swf 与 main.swf 通信的方法,可以使用 dispatchEvent 方法与 main.swf 通信,也可以继续使用上述方法。
下面请看示例:
1. 首先创建被调用的 game.swf:
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.Security;
    public class Game extends Sprite {
        private var ball:Sprite;
        private var speed:Number;
       
        public function Game() {
            // 在 Flash IDE 中执行 Debug
            Security.allowInsecureDomain("*");
           
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
       
        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            ball = new Sprite();
            ball.graphics.beginFill(0xFF0000);
            ball.graphics.drawCircle(0, 0, 50);
            ball.graphics.endFill();
            addChild(ball);
            ball.x = 50;
            ball.y = stage.stageHeight / 2;
        }
       
        public function moveBall(speed:Number):void {
            this.speed = speed;
            addEventListener(Event.ENTER_FRAME, onGameLoop);
        }
       
        private function onGameLoop(e:Event):void {
            ball.x += speed;
        }
       
        public function stopMove():void {
            removeEventListener(Event.ENTER_FRAME, onGameLoop);
        }
    }
}
在这个类里创建了一个小球实例 ball,还提供了两个公开的方法 moveBall(speed) 和 stopMove(),用于控制小球的运动与停止。最后,编译该文件将生成好的 game.swf 放到应用服务器的根目录上(http://localhost/game.swf)。
2. 下面创建主程序,调用 game.swf 并与其通信
package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.system.Security;
    public class Main extends Sprite {
        private var loader:Loader;
       
        public function Main() {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
       
        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
           
            // 允许访问变量、对象、属性、方法等
            Security.allowDomain("*");
           
            loader = new Loader();
            addChild(loader);
           
            // 加载 http://localhost/game.swf 后面的参数用于防止缓存
            loader.load(new URLRequest("http://localhost/game.swf?" + new Date().time));
            loader.contentLoaderInfo.addEventListener(Event.INIT, onLoadComplete);
        }
       
        private function onLoadComplete(e:Event):void {
            // 调用 game.swf 中的 moveBall(speed) 方法
            loader["content"].moveBall(5);
           
            // 点击舞台后调用 game.swf 中的 stopMove() 方法
            stage.addEventListener(MouseEvent.CLICK, onClickStageHandler);
        }
       
        private function onClickStageHandler(e:MouseEvent):void {
            loader["content"].stopMove();
        }
       
    }
}
主程序中先将 game.swf 加载进来,然后调用 game.swf 中的 moveBall(speed) 方法,并侦听在舞台发生点击事件后调用 game.swf 中的 stopMove() 方法。
3. game.swf 与 main.swf 通信方法:
调用的方法可以和 main.swf 调用 game.swf 一样,也可以使用事件调度,下面是事件驱动方法:
(1)定义 GameEvent.as 事件
package {
    import flash.events.Event;
    public class GameEvent extends Event {
        public static const GAME_START:String = "game_start";
        public static const GAME_OVER:String = "game_over"
       
        public var score:uint;
       
        public function GameEvent(type:String, score:uint = 0) {
            this.score = score;
            super(type);
        }
       
    }
}
(2)在 Game 中当调用 moveBall(speed) 方法时分发 GameEvent.GAME_START 事件:
dispatchEvent(new GameEvent(GameEvent.GAME_START));
在 Game 中当调用 stopMove() 方法时分发 GameEvent.GAME_OVER 事件:
dispatchEvent(new GameEvent(GameEvent.GAME_OVER, ball.x)); // 将小球的 x 坐标作为 GameEvent 的参数发出
(3)在 Main 中侦听这两个事件(当 game.swf 被加载进来后):
loader["content"].addEventListener(GameEvent.GAME_START, onGameStartHandler);
loader["content"].addEventListener(GameEvent.GAME_OVER, onGameOverHandler);
private function onClickStageHandler(e:MouseEvent):void {
    loader["content"].stopMove();
}
private function onGameOverHandler(e:Object):void {
    trace(e.score);
}
private function onGameStartHandler(e:Object):void {
    trace(e.score);
}
请注意处理事件的类型不是 GameEvent 而是 Object,理论上应该是 GameEvent ,但是如果这样声明的话会出现“强制转换类型失败”,因此只能用 Object 来替代
本文转自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/5223.html
分享到:
评论

相关推荐

    利用socket传SWF到Flash

    Java与Flash之间的socket通信是一个基于TCP/IP协议的双向通信机制。在Java端,我们可以创建一个ServerSocket监听特定端口,等待客户端(这里是Flash)连接。当Flash客户端建立连接后,Java端可以读取SWF文件并将其...

    页面SWF的布局及实现

    1. **JavaScript通信**:使用Flash External Interface (ExternalInterface) API,SWF文件可以与JavaScript进行双向通信。这使得你可以控制SWF的行为,如播放、暂停、跳转等,也可以根据SWF的事件更新HTML页面状态。...

    flash与delphi通信的例子程序

    1. **双向通信**:Delphi可以控制Flash组件的行为,如播放、暂停、停止动画,改变显示内容等;同时,Flash也可以向Delphi发送消息,例如用户在Flash中的操作结果,这样可以实现数据的实时反馈。 2. **事件处理**:...

    js_swf_action

    Adobe Flash Player提供了一个名为`ExternalInterface`的API,允许Flash内容与JavaScript进行双向通信。通过`ExternalInterface.addCallback`方法,ActionScript可以注册一个函数,使得JavaScript可以通过调用该函数...

    swf 本地通讯

    通过创建LocalConnection实例,SWF文件可以发送和接收消息,实现双向通信。 二、实现SWF本地通讯的步骤 1. 创建LocalConnection对象:在发送方SWF中,首先需要创建一个LocalConnection对象,并指定一个唯一的名字,...

    AS3.0与JS相互通信双向

    2、将html和swf放在你的站点根目录,然后用网址访问html(比如通常是http://127.0.0.1/asjs.html)即可看到效果!如果直接用浏览器打开html看不到最终效果的 3、flash给js发送消息,实际上只用到了: if ...

    vb 与flash9直接通信的实例

    通过这个实例,开发者可以学习到如何在VB环境中集成Flash内容,并实现双向通信。 关于标签“vb Flash 通信”,这表明本实例关注的重点是VB与Flash间的接口和通信机制。VB通过ActiveX控件与Flash交互,具体来说,...

    flex 与 js 通信的小例子

    1. ExternalInterface API:这是Flash Player提供的一种机制,允许Flash内容与包含它的HTML页面进行双向通信。在Flex中,我们可以使用`ExternalInterface.addCallback`方法注册一个ActionScript函数,使其可以在...

    串行通信的实现.zip

    5. **通信协议**:串行通信有许多不同的协议,如UART(通用异步收发传输器)、USART(通用同步/异步收发传输器)、SPI(串行外围接口)、I²C(集成电路间通信)和USB(通用串行总线)等。这些协议规定了如何组织...

    Flash与JavaScript的通信例子及总结(源码)

    External Interface是AS3(ActionScript 3)中内置的功能,允许Flash内容与宿主环境(通常是网页)中的JavaScript进行双向通信。Bridge技术则包括Flash的本地连接(LocalConnection)和自定义的通信协议,用于...

    使用Flash的Socket与C++实现网络通信

    在Flash中,Socket类提供了低级别的网络通信能力,允许应用程序通过TCP/IP协议与服务器进行双向通信。在`Main.as`文件中,你可以找到Flash客户端的Socket实例化和相关事件处理代码。当创建一个Socket对象后,需要...

    VB与flash的双向交互

    ### VB与Flash的双向交互详解 #### 一、引言 在早期的软件开发领域,Visual Basic (简称VB) 和 Flash 是两种非常流行的开发工具。VB 主要用于 Windows 平台上的应用程序开发,而 Flash 则是制作网页动画、游戏等...

    Flash flex与JS通信

    2. LocalConnection:另一种通信方式是使用LocalConnection对象,它可以实现在同一台机器上不同Flash对象间的通信。在某些情况下,当ExternalInterface不可用或不适合时,LocalConnection可以作为替代方案。 3. ...

    flash与VC通信的例子,天龙八部2launcher作为例子

    这通常涉及到创建一个COM对象,定义一些方法,这些方法可以在ActionScript中调用,从而实现双向通信。 4. **数据交换**:Flash和VC之间需要传递数据,例如,Flash可能需要获取用户在VC程序中的设置,或者向VC报告...

    flex与java通信的完整demo

    PollingDuplex是一种模拟双向通信的机制,客户端定时轮询服务器以获取新数据。 8. **学习资源** 包含的`flex_3_with_java.pdf`可能是详细的教程文档,涵盖了Flex与Java通信的基础知识和技术细节。`flexdemo.rar`...

    flex 与JS的通信

    - **ExternalInterface API**: Flex SDK提供了`ExternalInterface`类,允许ActionScript(Flex的编程语言)代码与JavaScript进行双向通信。通过`addCallback`方法注册回调函数,使JavaScript可以调用Flex中的方法,...

    一个flash和javascript通信的例子

    这个例子可能展示了如何使用Flash和JavaScript进行双向通信,比如实现按钮点击事件的交互、数据传递或者控制Flash播放等。尽管现代Web开发更多地依赖HTML5和WebGL,但理解Flash与JavaScript的通信仍然对理解Web历史...

    中文_-_英文双向翻译WEB服务 .NET实例

    标题中的“中文_-_英文双向翻译WEB服务 .NET实例”指的是使用.NET框架开发的一个Web应用程序,该程序能够实现中文和英文之间的双向翻译功能。这通常涉及到自然语言处理(NLP)和机器翻译(MT)的技术,可能利用了第...

    websocket兼容IE8

    WebSocket是一种在客户端与服务器之间建立长连接的协议,它提供了双向通信的能力,使得数据可以在两者之间实时、高效地传输。然而,WebSocket协议是基于HTML5的,因此在一些老版本的浏览器,特别是像IE8这样的旧版...

    java与flash通信.docx

    这种Java与Flash的通信方式主要依赖于Socket接口,它允许双向通信,可以用于实现更复杂的应用场景,如文件上传、下载、实时聊天等功能。需要注意的是,由于Flash的安全策略,跨域通信可能需要设置Flash Player的策略...

Global site tag (gtag.js) - Google Analytics