package { // Class so we can display and/or be used in the Flash IDE import flash.display.Sprite; // Class that allows a Shared Object to exist on FMS import flash.net.SharedObject; // So we can get Status from the NetConnection (callback) import flash.events.NetStatusEvent; // So we can get events from the SharedObject (callback) import flash.events.SyncEvent; // So we can connect to FMS import flash.net.NetConnection; // For our mouse events (drawing) import flash.events.MouseEvent; public class WhiteBoardSO extends Sprite { // Declare a SharedObject object private var sharedObject:SharedObject; // Declare a NetConnection Object private var netConnection:NetConnection; // Mouse Coordinates private var startX:int; private var startY:int; private var endX:int; private var endY:int; // Remote mouse coordinates private var rstartX:int; private var rstartY:int; private var rendX:int; private var rendY:int; // Constructor public function WhiteBoardSO() { trace("starting"); // String with URL to app on FMS var rtmpURL:String = "rtmp://itp-flash.es.its.nyu.edu/sve204/WhiteBoard"; // Instantiate NetConnection netConnection = new NetConnection(); // Event listener, calls netStatusCallBack when a NetStatusEvent is fired netConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusCallBack); // Connect to the application on the server netConnection.connect(rtmpURL); //netConnection.client = this; // Add the mouse event listeners stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEvent); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEvent); graphics.lineStyle(3, 0xFF0000, 1); } private function mouseDownEvent(mouseEvent:MouseEvent):void { trace("startx: " + mouseX); startX = mouseX; startY = mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMovedEvent); } private function mouseUpEvent(mouseEvent:MouseEvent):void { trace("endx: " + mouseX); endX = mouseX; endY = mouseY; // This would be if we were drawing locally //graphics.moveTo(startX,startY); //graphics.lineTo(endX,endY); // We would do this if we were using shared object properties // which doesn't work quite right when we are sending a lot of data //sharedObject.setProperty("points",startX + "," + startY + "," + endX + "," + endY); // Instead we are calling the "send" function on shared object to broadcast sendData(startX,startY,endX,endY); stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMovedEvent); } private function mouseMovedEvent(mouseEvent:MouseEvent):void { endX = mouseX; endY = mouseY; //graphics.moveTo(startX,startY) //graphics.lineTo(endX,endY); sendData(startX,startY,endX,endY); startX = mouseX; startY = mouseY; } private function sendData(startX:int,startY:int,endX:int,endY:int):void { sharedObject.send("drawPoints",startX + "," + startY + "," + endX + "," + endY); } // NetStatusEvent Callback private function netStatusCallBack(nsEvent:NetStatusEvent):void { // If we connected successfully if (nsEvent.info.code == "NetConnection.Connect.Success") { // Set up the shared object // We'll call it WhiteBoard, pass in the app url and not make it persistent sharedObject = SharedObject.getRemote("WhiteBoard",netConnection.uri,false); // So that when we use "send" it calls a function in this object sharedObject.client = this; // Add a listener for when shared object is changed // Not using for the whiteboard example //sharedObject.addEventListener (SyncEvent.SYNC,syncEventCallBack); // Connect the shared object to our netConnection sharedObject.connect(netConnection); } else { // Didn't connect trace("Sorry connection failed"); } } // SharedObject Sync Event Listener // Not being used for the whiteboard example private function syncEventCallBack(syncEvent:SyncEvent):void { // Array of changes: syncEvent.changeList[] for (var i:int = 0; i < syncEvent.changeList.length; i++) { trace(syncEvent.changeList[i].code); switch(syncEvent.changeList[i].code) { case "clear": break; case "success": break; case "change": var points:String = sharedObject.data.points; var pointsArray:Array = points.split(/,/); var rstartX:int = int(pointsArray[0]); var rstartY:int = int(pointsArray[1]); var rendX:int = int(pointsArray[2]); var rendY:int = int(pointsArray[3]); graphics.moveTo(rstartX,rstartY); graphics.lineTo(rendX,rendY); break; } } } // Needs to be public so the shared object callback works.. public function drawPoints(points:String):void { trace("called drawPoints"); var pointsArray:Array = points.split(/,/); var rstartX:int = int(pointsArray[0]); var rstartY:int = int(pointsArray[1]); var rendX:int = int(pointsArray[2]); var rendY:int = int(pointsArray[3]); graphics.moveTo(rstartX,rstartY); graphics.lineTo(rendX,rendY); } } }