`
wangleifire
  • 浏览: 510882 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

FLASH教程:SWF间的双向通信

    博客分类:
  • FLEX
阅读更多
假设有一个主 SWf 名为 main.swf 加载一个名为 game.swf 的游戏模块: 1. main 里面使用 Loader 将 game.swf 加载进来; 2. 在 game 中定义 public function moveBall(speed:Number) 方法,用于开始游戏; 3. 在 main 里面使用类似 loader[content].moveBall(

假设有一个主 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 来替代。

  演示文件源码下载:swfs_communication.rar

分享到:
评论

相关推荐

    flash与delphi通信的例子程序

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

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

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

    vb 与flash9直接通信的实例

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

    利用socket传SWF到Flash

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

    VB与flash的双向交互

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

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

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

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

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

    Flash flex与JS通信

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

    flash与aspx页面通信聊天,flash聊天,模仿QQ聊天,聊天表情

    在IT领域,尤其是在Web开发中,Flash与ASP.NET(ASPx)页面的通信是一个常见的需求,尤其是用于实现富用户体验的功能,比如即时通讯和聊天应用。本案例中的"最新聊天窗体.swf"就是一个示例,它模拟了QQ聊天窗口,...

    flash界面+.net后台控制入门教程源码

    AMF是一种高效的数据序列化格式,适合于Flash和服务器间的双向通信;XML/SOAP则是一种更通用的格式,适用于不同系统间的通信。 6. **AS3与C#的通信**: 你需要设置一个Web服务(如ASP.NET Web Service或WCF服务)...

    水泥 flash 水泥 flash 水泥 flash

    Canvas和WebGL用于2D和3D动画,Web Audio API处理音频,WebSocket实现双向通信。 7. **安全问题**:由于Flash的诸多漏洞,它成为了黑客攻击的目标,这也是Adobe最终决定终止支持的重要原因。 综上所述,虽然Flash...

    页面SWF的布局及实现

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

    一个flash和javascript通信的例子

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

    Flash传递参数

    3. **JavaScript-ActionScript通信**: 使用`ExternalInterface`类,Flash可以与JavaScript进行双向通信。在JavaScript中设置变量,然后在ActionScript中通过`ExternalInterface.call`方法调用JavaScript函数来获取...

    java与flash通信.docx

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

    delphi flash小例子

    ",这在实现Delphi和Flash之间的双向通信时非常有用。 除此之外,TShockwaveFlash组件还支持其他一些高级特性,比如调整Flash的播放质量、是否启用全屏模式、设置音量等等。开发者可以根据实际需求,灵活运用这些...

    java与flash通信.docx编程资料

    本文将详细介绍如何利用Java与Flash进行通信,特别是在实现SWF(Shockwave Flash)文件的点对点连接以及读写操作方面。 #### 二、Flash的限制与解决方案 Flash在其发展过程中遇到了两个主要的技术瓶颈:SWF文件...

    Winform C# Flash控件 属性 方法 事件.doc

    通过`ExternalInterface`,Flash和C#之间可以进行双向通信。在Flash ActionScript中定义一个外部接口函数,然后在C#中通过`SetVariable`方法调用该函数。同时,Flash可以通过`FlashCall`事件调用C#的方法。 总结: ...

    flash与c++交互的方法

    总结起来,通过VC++的`FSCommand`和Flash的`ExternalInterface`,我们可以实现C++与Flash之间的双向通信,使得C++能够控制Flash的行为,而Flash也能响应C++的调用,从而创建出丰富的交互式应用程序。这种技术在游戏...

    js_swf_action

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

Global site tag (gtag.js) - Google Analytics