Actionscript Code:
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.system.Security;
import flash.text.*;
[SWF(width="1024", height="720", backgroundColor="#E5E5DD")]
public class Client extends Sprite {
private var host:String="192.168.1.2";
private var port:int=8090;
private var policyPort:int=8091;
private var socket:Socket;
private var debug:TextField;
private var ballsnum:TextField;
private var userCountText:TextField;
private var lastDebugMsg:String="null";
public static var debugMsg:String="";
public static var game:Game;
public static var tempID:int=0;
public static var userCount:int=1;
public static var main:Client;
public static var color:uint;
public static var loaded:Boolean;
public var i:int=0;
public function Client () {
main = this;
loaded = false;
debug = new TextField;
debug.width = 800;
debug.height = 600;
debug.selectable = false;
debug.text = "Debug: " + debugMsg;
stage.addChild(debug);
ballsnum = new TextField;
ballsnum.x = 400;
ballsnum.width = 800;
ballsnum.height= 600;
ballsnum.selectable = false;
ballsnum.text = "Balls: " + Ball.Balls.length;
stage.addChild(ballsnum);
tempID = Math.random()*10000;
color = 0xCCCCCC * (Math.random()*0x00AAAA);
debugMsg +="\nNew tempID: " + tempID;
userCountText = new TextField;
userCountText.x = 750;
userCountText.width = 800;
userCountText.height= 600;
userCountText.selectable = false;
userCountText.text = "Users: " + userCount;
stage.addChild(userCountText);
debugMsg += "\nRequesting policy file...";
Security.loadPolicyFile("xmlsocket://" + host + ":" + policyPort);
debugMsg += "\nPossibly accepted it?";
connect();
game = new Game(this);
stage.addEventListener(Event.ENTER_FRAME, update);
}
public function update(event:Event):void
{
userCountText.text = "Users: " + userCount;
ballsnum.text = "Balls: " + Ball.Balls.length;
if(!loaded && socket.connected)
{
sendMessage("CLIENT|" + Client.tempID + "|CONNECT|" + color + "|");
loaded=true;
}
if(debugMsg!=lastDebugMsg)
{
if(debug.text.length>200)
{
debug.text = "Debug: ";
lastDebugMsg = "";
}
debug.appendText(debugMsg);
debugMsg = "";
}
}
public function sendMessage(msg:String):void {
msg += "\n";
// debugMsg = "\nSent:" + msg;
try {
this.socket.writeUTFBytes(msg);
this.socket.flush();
trace("Message sent: " + msg);
}
catch(e:Error) {
trace("Error sending data: " + e);
}
}
private function receiveData(msg:String):void
{
// debugMsg += "Recieved: " + msg;
trace(msg);
if(!(getArgs(msg,3).match("MOVE") || getArgs(msg,3).match("BALL"))) trace(msg);
var length:int = CountArgs(msg,"\n");
for(var i:int=1; i<=length; i++)
{
if(getArgs(msg,3).match("BALL"))
{
var ID:int = int(getArgs(msg,2));
var x:Number = Number(getArgs(msg,4));
var y:Number = Number(getArgs(msg,5));
var dx:Number = Number(getArgs(msg,6));
var dy:Number = Number(getArgs(msg,7));
var color:uint = uint(getArgs(msg,8));
if(ID==tempID && Game.pBall==null)
{
trace(color);
game.addBall(x,y,dx,dx,tempID,color,true);
}
else if(ID!=tempID)
{
if(game.findBall(ID)==null) game.addBall(x,y,dx,dy,ID,color,false);
}
}
else if(getArgs(msg,3).match("MOVE") && int(getArgs(msg,2))!=tempID)
{
var ID:int = int(getArgs(msg,2));
var x:Number = Number(getArgs(msg,4));
var y:Number = Number(getArgs(msg,5));
var dx:Number = Number(getArgs(msg,6));
var dy:Number = Number(getArgs(msg,7));
game.moveBall(ID,x,y,dx,dy);
}
else if(getArgs(msg,2).match("USERCOUNT"))
{
userCount = int(getArgs(msg,3));
}
else if(getArgs(msg,2).match("REMOVE"))
{
game.removeBall(int(getArgs(msg,3)));
}
msg = msg.substring(msg.indexOf("\n")+1,msg.length);
}
}
public function CountArgs(input:String, split:String):int
{
var s:String = input;
var a:int = 0;
if(input.indexOf(split)>0)
{
for(var i:int=0; i<input.length; i++)
{
if(s.indexOf(split)>0)
{
s = s.substring(s.indexOf(split)+1, s.length);
a++;
}
else
{
i=input.length;
}
}
}
else if(input.length>0)
{
a+=1;
}
return a;
}
public function getArgs(input:String, arg:int):String
{
var s:String = input;
var a:int = 0;
if(input.indexOf("|"))
{
for(var i:int=0; i<input.length; i++)
{
if(s.indexOf("|") && a+1<arg)
{
s = s.substring(s.indexOf("|")+1, s.length);
a++;
}
else
{
i=input.length;
}
}
if(s.indexOf("|"))
{
s = s.substring(0, s.indexOf("|"));
}
}
else
{
s="not found";
}
return s;
}
public function connect():Boolean {
this.socket = new Socket(this.host, this.port);
this.socket.addEventListener(Event.CONNECT, socketConnect);
this.socket.addEventListener(Event.CLOSE, socketClose);
this.socket.addEventListener(IOErrorEvent.IO_ERROR, socketError);
this.socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
this.socket.addEventListener(ProgressEvent.SOCKET_DATA, socketData);
try {
this.socket.connect(this.host, this.port);
}
catch (e:Error) {
trace("Error on connect: " + e);
debugMsg += "\nError on connect";
return false;
}
return true;
}
private function socketConnect(event:Event):void {
trace("Connected: " + event);
}
private function socketData(event:ProgressEvent):void {
// trace("Receiving data: " + event);
receiveData(this.socket.readUTFBytes(this.socket.bytesAvailable));
}
private function socketClose(event:Event):void {
trace("Connection closed: " + event);
//this.chatArea.appendText("Connection lost." + "\n");
}
private function socketError(event:IOErrorEvent):void {
trace("Socket error: " + event);
debugMsg = "\nSocket error" + debugMsg;
}
private function securityError(event:SecurityErrorEvent):void {
trace("Security error: " + event);
}
}
}
Actionscript Code:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.ui.Keyboard;
import flash.ui.Mouse;
import flash.ui.MouseCursor;
import flash.utils.Timer;
public class Game
{
public var container:Sprite;
public var left:int = 0;
public var right:int = 0;
public var up:int = 0;
public var down:int = 0;
public var currentSpeed:int=4;
public var PlayerTimer:Timer = new Timer(20);
public var timeTrack:int = 0;
public var timeDelay:Number = 0.5;
public var moving:Boolean = false;
public static var pBall:Ball; // player ball
public function Game(container:Sprite)
{
this.container = container;
PlayerTimer.addEventListener(TimerEvent.TIMER, inc);
PlayerTimer.start();
container.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
container.stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
container.stage.addEventListener(Event.ENTER_FRAME, update);
}
public function inc(event:TimerEvent):void
{
timeTrack++;
}
public function update(event:Event):void
{
if(pBall!=null)
{
if (left>0 && right==0) pBall.dx = -currentSpeed;
else if (right>0 && left==0) pBall.dx = currentSpeed;
else if (left>0 && right>0)
{
if(left>right) pBall.dx = -currentSpeed;
else pBall.dx = currentSpeed;
}
else pBall.dx = 0;
if (up>0 && down==0) pBall.dy = -currentSpeed;
else if (down>0 && up==0) pBall.dy = currentSpeed;
else if (down>0 && up>0)
{
if(up>down) pBall.dy = -currentSpeed;
else pBall.dy = currentSpeed;
}
else pBall.dy = 0;
if((pBall.dx!=0 || pBall.dy!=0) && timeTrack%timeDelay==0)
{
Client.main.sendMessage("CLIENT|"+Client.tempID+"|MOVE|"+pBall.x+"|"+pBall.y+"|"+pBall.dx+"|"+pBall.dy);
moving = true;
}
else if(moving && pBall.dx==0 && pBall.dy==0)
{
Client.main.sendMessage("CLIENT|"+Client.tempID+"|MOVE|"+pBall.x+"|"+pBall.y+"|"+pBall.dx+"|"+pBall.dy);
moving = false;
}
}
}
public function keyDown(event:KeyboardEvent):void
{
if (event.keyCode == 65)
{
left = timeTrack;
}
else if (event.keyCode == 68)
{
right = timeTrack;
}
else if (event.keyCode == 87)
{
up = timeTrack;
}
else if (event.keyCode == 83)
{
down = timeTrack;
}
}
public function keyUp(event:KeyboardEvent):void
{
if (event.keyCode == 65)
{
left = 0;
}
else if (event.keyCode == 68)
{
right = 0;
}
else if (event.keyCode == 87)
{
up = 0;
}
else if (event.keyCode == 83)
{
down = 0;
}
}
public function moveBall(id:int, x:Number, y:Number, dx:Number, dy:Number):void
{
var b:Ball;
if(Ball.Balls.length>0)
{
b = findBall(id);
b.x = x;
b.y = y;
b.dx = dx;
b.dy = dy;
}
}
public function findBall(id:int):Ball
{
var r:Ball;
for each(var b:Ball in Ball.Balls)
{
if(b.id == id)
{
r = b;
}
}
return r;
}
public function removeBall(id:int):void
{
var b:Ball;
b = findBall(id);
if(b!=null) b.die();
}
public function addBall(x:Number, y:Number, dx:Number, dy:Number, id:int, color:uint=0x000000, player:Boolean=false):void
{
if(player)
{
container.stage.addChild(pBall = new Ball(x,y,id,color,dx,dy));
pBall.iAmPlayer();
}
else container.stage.addChild(new Ball(x,y,id,color,dx,dy));
}
public function CountArgs(input:String):int
{
var s:String = input;
var a:int = 0;
if(input.indexOf("|")>0)
{
for(var i:int=0; i<input.length; i++)
{
if(s.indexOf("|")>0)
{
s = s.substring(s.indexOf("|")+1, s.length);
a++;
}
else
{
i=input.length;
}
}
}
else if(input.length>0)
{
a+=1;
}
return a;
}
public function getArgs(input:String, arg:int):String
{
var s:String = input;
var a:int = 0;
if(input.indexOf("|"))
{
for(var i:int=0; i<input.length; i++)
{
if(s.indexOf("|") && a+1<arg)
{
s = s.substring(s.indexOf("|")+1, s.length);
a++;
}
else
{
i=input.length;
}
}
if(s.indexOf("|"))
{
s = s.substring(0, s.indexOf("|"));
}
}
else
{
s="not found";
}
return s;
}
public function Debug(s:String):void
{
Client.debugMsg += "\n"+s;
}
}
}
Actionscript Code:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Ball extends Mover
{
public var sprite:Sprite;
public static var Balls:Array = new Array();
public var id:int;
public var radius:int=10;
public var color:uint;
public function Ball(x:Number, y:Number, id:int, color:uint, dx:Number=0, dy:Number=0)
{
super(x, y, dx, dy);
this.id = id;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this.color = color;
trace("New ball at " + this.x + ", " + this.y + ", with an ID of " + id);
graphics.beginFill(color);
graphics.drawCircle(0, 0, radius);
graphics.endFill();
Balls.push(this);
}
public function iAmPlayer():void
{
graphics.beginFill(0x000000);
graphics.drawCircle(0, 0, radius/1.25);
graphics.beginFill(0xFFFFFF);
graphics.drawCircle(0, 0, radius/1.5);
graphics.beginFill(0x000000);
graphics.drawCircle(0, 0, radius/2);
graphics.beginFill(color);
graphics.drawCircle(0, 0, radius/2.25);
graphics.endFill();
}
public override function update(event:Event):Boolean
{
if (!super.update(event)) return false;
return true;
}
public override function die():void
{
super.die();
var i:int = Balls.indexOf(this);
Balls[i] = Balls[Balls.length - 1];
Balls.pop();
}
}
}