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);
}
}
}
}