Red5をやってみた その4 – マウスドラッグの共有

Filed under AS3, Java, Red5

Flashストリーミングサーバーである、Red5ってのに手を出してみました。

今回やってみたのは、ユーザーでドラッグを共有するやつ。

Java側のプログラムは前回と同じものを利用してます。

SharedObjectを利用して、ballの座標を共有。

同時にドラッグしようとするとちょっとおかしくなるかも。

package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.NetStatusEvent;
	import flash.events.SyncEvent;
	import flash.net.NetConnection;
	import flash.net.SharedObject;

	public class main extends Sprite
	{
		private const SO_NAME:String="share_ball";
		private const SO_PARAM:String="SharedData"
		private var nc:NetConnection;
		private var ball:Sprite;
		private var so:SharedObject;
		private var dragging:Boolean;

		public function main()
		{
			// stage設定
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			stage.quality=StageQuality.MEDIUM;
			stage.frameRate=40;

			// 接続
			nc=new NetConnection();
			nc.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
			nc.connect("rtmpt://localhost:5080/streamingSample");
		}

		private function onStatus(evt:NetStatusEvent):void
		{
			// 接続結果の確認
			switch(evt.info.code)
			{
				// 成功している場合は続行
				case "NetConnection.Connect.Success":
					trace("Success");
					initSO();
					break;

				// 他の出力
				case "NetConnection.Connect.Closed":
					trace("Closed");
					break;
				case "NetConnection.Connect.Failed":
					trace("Failed");
					break;
				case "NetConnection.Connect.Rejected":
					trace("Rejected");
					break;
				default:
					trace("Error");
			}
		}

		private function initSO():void
		{
			// ballの初期化
			ball=new Sprite;
			ball.graphics.beginFill(0x00ff00, 1);
			ball.graphics.drawCircle(0, 0, 50);
			ball.graphics.endFill();
			ball.x=ball.y=200;
			addChild(ball);
			dragging=false;

			// ボールにイベントを追加
			ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			stage.addEventListener(Event.MOUSE_LEAVE, onLeave);

			// SharedObjectを利用して、座標を共有する。
			so=SharedObject.getRemote(SO_NAME, nc.uri, true);
			if (so)
			{
				so.addEventListener(SyncEvent.SYNC, onSync);
				so.connect(nc);
			}
		}

		// SharedObjectが更新されたら実行される関数
		private function onSync(e:SyncEvent):void
		{
			// 初回はなにもセットされてないから回避
			if (!so.data.SharedData) return ;

			// ballにデータを反映
			ball.x=so.data.SharedData.x;
			ball.y=so.data.SharedData.y;
			dragging=so.data.SharedData.drag;
		}

		// マウスダウン時のイベント
		private function onMouseDown(e:MouseEvent):void
		{
			if (!dragging)
			{
				dragging=true;
				ball.startDrag();
				so.setProperty(SO_PARAM, {x:ball.x, y:ball.y, drag:dragging});
				addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
			}
		}

		// マウスムーブ時のイベント
		private function onMouseMove(e:MouseEvent):void
		{
			so.setProperty(SO_PARAM, {x:ball.x, y:ball.y, drag:dragging});
		}

		// マウスがブラウザ外に出た場合の処理
		private function onLeave(e:Event):void
		{
			stopDragging();
		}

		// マウスアップ時のイベント
		private function onMouseUp(e:MouseEvent):void
		{
			stopDragging();
		}

		private function stopDragging():void
		{
			if (dragging)
			{
				dragging=false;
				ball.stopDrag();
				so.setProperty(SO_PARAM, {x:ball.x, y:ball.y, drag:dragging});
				removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
			}
		}
	}
}

Post a Comment

Your email is never published nor shared.