2 つの SWF 間の通信

(サンプル一覧を表示する)

FlashDevelop を使って、2 つの SWF 間の通信テストをしてみました。

SWF 間の接続に、 LocalConnection クラスを使用しています。
LocalConnection を使うと、サーバを介すことなく
クライアントコンピュータ上で実行されている 2 つの Flash 間で
メッセージをやり取りできます。
受信側 SWF に書かれたメソッドを、送信側 SWF が、
ローカル環境のメソッドを呼び出すかのような感覚で
メッセージを送信できるので、理解しやすい構造になっていると思います。

このサンプルでは、送信側 SWF が両方のビットマップ画像の座標をコントロールしています。
受信側は、指定された座標に画像を移動させる処理だけを行っています。
LocalConnection の機能を使って画像を送り込むことはできないので、
画像はそれぞれに 1 つずつ埋め込んでいます。

送信側 SWF

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

受信側 SWF

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

送信側 SWF
このサンプルのページを 2 つ以上開くと、 同じ ID の送信と受信が 2 つずつ存在することになって、 動作がおかしくなります。
(チェックする時は IE と Firefox 等の組み合わせで、 2 つ開いてみてください。)

2 つ以上開いた時に問題が起こらないようにするためには、 JavaScript で乱数の ID を生成して flashvars に渡すなど、 何らかの対策を考える必要があります。
受信側 SWF

ソースコード

送信側のソース
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.StatusEvent;
	import flash.net.LocalConnection;
	
	/**
	 * ローカルコネクションのサンプル (送信側)
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 埋め込み画像
		 */
		[Embed(source='../image/test001.png')]
		private var image1:Class;
		
		/**
		 * ビットマップ
		 */
		public var bitmap:Bitmap;
		
		/**  
         * 回転の角度  
         */  
        private var angle:int = 0;
           
        /**  
         * 回転の半径  
         */  
        private var r:int = 80;
		
		/**
		 * ローカルコネクションオブジェクト
		 */
		private var localConnection:LocalConnection;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化イベント
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// ビットマップの準備
			bitmap = Bitmap(new image1);
			bitmap.cacheAsBitmap = true;
			bitmap.scaleX = 2.0;
			bitmap.scaleY = 2.0;
			addChild(bitmap);
			
			// ローカルコネクションの初期化
			localConnection = new LocalConnection();
			localConnection.addEventListener(StatusEvent.STATUS, onStatus);
			
			// フレーム開始イベントの登録
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		/**
		 * フレーム開始イベント
		 * @param	event
		 */
		private function onEnterFrame(event:Event):void
		{
			angle += 2;
			
			var x:int;
			var y:int;
			
			x = ((320 - bitmap.width) / 2)  + Math.cos(angle / 180 * Math.PI) * r;
			y = ((240 - bitmap.height) / 2)  + Math.sin(angle / 180 * Math.PI) * r;
			
			// 送信側のビットマップを移動する
            bitmap.x = x + 160;
            bitmap.y = y;
			
			// 受信側のビットマップを移動する
			sendMessage(x - 160, y);
		}
		
		/**
		 * 通信ステータスイベント
		 * @param	event
		 */
		private function onStatus(event:StatusEvent):void
		{
			switch (event.level)
			{
				case "status":
					//trace("LocalConnection.send() 成功");
					break;
				case "error":
					//trace("LocalConnection.send() 失敗");
					break;
			}
		}
		
		/**
		 * ローカルコネクションの受信側 SWF にメッセージを送信する
		 * @param	x	ビットマップの X 座標
		 * @param	y	ビットマップの Y 座標
		 */
		private function sendMessage(x:int, y:int):void
		{
			localConnection.send("ConnectionID_001", "messageHandler", x, y);
		}


	}
	
}		
受信側のソース
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.StatusEvent;
	import flash.net.LocalConnection;
	
	/**
	 * ローカルコネクションのサンプル (受信側)
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 埋め込み画像
		 */
		[Embed(source='../image/test001.png')]
		private var image1:Class;
		
		/**
		 * ビットマップ
		 */
		public var bitmap:Bitmap;
		
		/**
		 * ローカルコネクションオブジェクト
		 */
		private var localConnection:LocalConnection;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化イベント
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// ビットマップの準備
			bitmap = Bitmap(new image1);
			bitmap.cacheAsBitmap = true;
			bitmap.scaleX = 2.0;
			bitmap.scaleY = 2.0;
			bitmap.x = -200;
			addChild(bitmap);
			
			// ローカルコネクションの初期化
			localConnection = new LocalConnection();
			localConnection.client = this;
			
			try {
				localConnection.connect("ConnectionID_001");
			} catch (error:ArgumentError) {
				trace("接続に失敗しました。");
			}

		}
		
		/**
		 * 送信側ローカルコネクションから呼ばれるメソッド
		 * ビットマップの位置を移動する
		 * 
		 * @param	x	X 座標
		 * @param	y	Y 座標
		 */
		public function messageHandler(x:int, y:int):void
		{
			bitmap.x = x;
            bitmap.y = y;
		}
		
	}
	
}		

リンク