您的位置:首页 > 其它

主swf控制多个加载进来的swf的播放(多个swf之间的通信练习)

2010-04-18 23:30 295 查看
见过很多flash网站的设计都是这样的:有一个主swf文件,内容不多.主要就是一些触发加载的按钮.比如现在主场景上有两个按钮btn1,btn2默认状态下主场景先加载btn1按钮对应的a.swf文件,当用户点击btn2.按钮时,主场景先发消息给a.swf,让a.swf执行一段渐渐消失转场动画,当a.swf执行完毕时发送消息给主场景,当主场景收到a.swf发来的完成消息时开始卸载原先的a.swf并加载btn2按钮对应的b.swf.整个通讯过程用到的主要技术是localConnection类,但不要错过一个细节就是通信完毕之后关闭掉原先的localConnection,不然原先的还会继续占用.

贴一些代码(基于帮助文档):

package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.LocalConnection;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.StatusEvent;
import flash.text.TextFieldAutoSize;

/**
* 主场景
*/
public class LocalConnectionSenderExample extends Sprite {
private var conn:LocalConnection;
private var reConn:LocalConnection;

// UI elements
private var messageLabel:TextField;
private var message:TextField;
private var sendBtn:Sprite;
private var _sendBtn:Sprite;
private var curName:String;
private var loader:Loader = new Loader();
public function LocalConnectionSenderExample() {
buildUI();
sendBtn.addEventListener(MouseEvent.CLICK, sendMessage);
_sendBtn.addEventListener(MouseEvent.CLICK, sendMessage);

loader.load(new URLRequest("LocalConnectionReceiverExample1.swf"))
addChild(loader);
}

public function removeSwf():void {
//高人推荐用这个方法
loader.unloadAndStop();
removeChild(loader);
reConn.close();

message.appendText("removed");
if(curName== "black")
loader.load(new URLRequest("LocalConnectionReceiverExample1.swf"));
else
loader.load(new URLRequest("LocalConnectionReceiverExample2.swf"));
addChild(loader);
}

private function sendMessage(event:MouseEvent):void {
curName = event.target.name;
conn = new LocalConnection();
conn.addEventListener(StatusEvent.STATUS, onStatus);
conn.send("myConnection", "lcHandler", message.text);

reConn = new LocalConnection();
reConn.client = this;
try {
reConn.connect("reConnection");
} catch (error:ArgumentError) {
trace("Can't connect...the connection name is already being used by another SWF from father");
}
}

private function onStatus(event:StatusEvent):void {
switch (event.level) {
case "status":
trace("LocalConnection.send() succeeded");
break;
case "error":
trace("LocalConnection.send() failed");
break;
}
}

private function buildUI():void {
const hPadding:uint = 5;
// messageLabel
messageLabel = new TextField();
messageLabel.x = 10;
messageLabel.y = 10;
messageLabel.text = "Text to send:";
messageLabel.autoSize = TextFieldAutoSize.LEFT;
addChild(messageLabel);

// message
message = new TextField();
message.x = messageLabel.x + messageLabel.width + hPadding;
message.y = 10;
message.width = 120;
message.height = 20;
message.background = true;
message.border = true;
message.type = TextFieldType.INPUT;
addChild(message);

// sendBtn
sendBtn = new Sprite();
sendBtn.name = "black"
sendBtn.x = message.x + message.width + hPadding;
sendBtn.y = 10;
var sendLbl:TextField = new TextField();
sendLbl.x = 1 + hPadding;
sendLbl.y = 1;
sendLbl.selectable = false;
sendLbl.autoSize = TextFieldAutoSize.LEFT;
sendLbl.text = "black";
sendBtn.mouseChildren = false;
sendBtn.addChild(sendLbl);
sendBtn.graphics.lineStyle(1);
sendBtn.graphics.beginFill(0xcccccc);
sendBtn.graphics.drawRoundRect(0, 0, (sendLbl.width + 2 + hPadding + hPadding), (sendLbl.height + 2), 5, 5);
sendBtn.graphics.endFill();
addChild(sendBtn);

// 切换按钮
_sendBtn = new Sprite();
_sendBtn.name = "blue"
_sendBtn.x = message.x + message.width + hPadding+sendBtn.width;
_sendBtn.y = 10;
var _sendLbl:TextField = new TextField();
_sendLbl.x = 1 + hPadding;
_sendLbl.y = 1;
_sendLbl.selectable = false;
_sendLbl.autoSize = TextFieldAutoSize.LEFT;
_sendLbl.text = "blue";
_sendBtn.addChild(_sendLbl);
_sendBtn.mouseChildren = false;
_sendBtn.graphics.lineStyle(1);
_sendBtn.graphics.beginFill(0xcccccc);
_sendBtn.graphics.drawRoundRect(0, 0, (_sendLbl.width + 2 + hPadding + hPadding), (_sendLbl.height + 2), 5, 5);
_sendBtn.graphics.endFill();
addChild(_sendBtn);
}
}
}


package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.LocalConnection;
import flash.text.TextField;

/**
* 被加载场景
*/
public class LocalConnectionReceiverExample extends MovieClip {

private var conn:LocalConnection;//接受主场景请求的lc
private var reConn:LocalConnection;//发送消息给主场景的lc
private var output:TextField;//文本框

public function LocalConnectionReceiverExample() {
//构建界面
buildUI();

//控制影片播放
this.addFrameScript(49, function () { stop(); } );

conn = new LocalConnection();
reConn = new LocalConnection();
conn.client = this;
try {
conn.connect("myConnection");
} catch (error:ArgumentError) {
trace("Can't connect...the connection name is already being used by another SWF from son");
}

}

public function lcHandler(msg:String):void {
this.addEventListener(Event.ENTER_FRAME, onEnterF);
output.appendText(msg + "/n");
//这句很重要,没写的话会报错
conn.close();
}

private function onEnterF(event:Event):void {
if (this.currentFrame != 1) {
this.prevFrame();
}else {
this.removeEventListener(Event.ENTER_FRAME, onEnterF);
trace("done")
reConn.send("reConnection","removeSwf")
output.appendText("sended/n");
}
}

private function buildUI():void {
output = new TextField();
output.background = true;
output.border = true;
output.wordWrap = true;
addChild(output);
output.x = 200;
output.y = 100;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: