Здравствуйте. Хотелось бы услышать совет от более опытных АС3-программистов.
Дело в том, что несмотря на имеющийся опят программирования как на АС3, так и на других ООП языках, меня не перестает мучить один вопрос: как же правильно организовать взаимосвязь экземпляров не статичных классов, с классами, которые не имеют экземпляров и содержат только статические методы и свойства.
Ниже рассматриваю вопрос подробнее, на примере моего кода:
Класс
Root.as (DocmentClass):
Код AS3:
package {
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
public class Root extends Sprite {
public function Root():void {
Connection.init(Const.SERVER_URL);
btnLogin.addEventListener(MouseEvent.CLICK, btnLoginClickHandler);
btnRoulette.addEventListener(MouseEvent.CLICK, btnRouletteClickHandler);
}
private function btnLoginClickHandler(event:MouseEvent = null):void {
if (!Authentication.session) Connection.doAuthentication("login", "password");
}
private function btnRouletteClickHandler(event:MouseEvent = null):void {
if (Authentication.session) Connection.doGameStart("EuropeRoulette", "private", "", 1);
}
private static function loadGame(strGame:String):void {
var urlRequest = new URLRequest(strGame + ".swf");
var ldrGameLoader:Loader = new Loader();
ldrGameLoader.addEventListener(Event.COMPLETE, this.gameLoadedHandler);
ldrGameLoader.load(urlRequest);
}
private function gameLoadedHandler(event:Event = null):void {
var mc:MovieClip = event.target.loader as Loader;
this.root.mcContainer.addChild(mc);
}
}
}
Класс
Connection.as (Статичный класс):
Код AS3:
package {
import flash.net.*;
import flash.events.*;
import com.adobe.serialization.json.*;
public class Connection {
private static var _urlRequest:URLRequest;
private static var _urlLoader:URLLoader;
public static function init(strServerUrl:String):void {
Connection._urlRequest = new URLRequest(strServerUrl);
Connection._urlRequest.method = Const.SERVER_REQUEST_METHOD;
Connection._urlRequest.contentType = Const.SERVER_REQUEST_CONTENT_TYPE;
Connection._urlLoader = new URLLoader();
Connection._urlLoader.addEventListener(Event.COMPLETE, Connection.serverResponseHandler);
}
private static function serverResponseHandler(event:Event = null):void {
var objResponseData:Object = JSON.decode(event.target.data);
Connection.serverResponseManager(objResponseData);
//trace("Client JSON: " + event.target.data);
Debug.traceObject("Server", objResponseData);
}
private static function serverResponseManager(objResponseData:Object):void {
switch (objResponseData.action) {
case Const.SERVER_COMMAND_LOGIN :
Authentication.session = objResponseData.session;
Authentication.user = objResponseData.data.user;
break;
case Const.SERVER_COMMAND_START :
Root.loadGame(objResponseData.data.game); //Это бред...
//Здесь, пытаюсь загрузить .swf файл по имени
break;
default : trace("WTF " + objResponseData.action + " ?")
}
}
public static function doAuthentication(strLogin:String, strPassword:String):void {
var objRequest:Object = new Object();
objRequest.unit = Const.SERVER_UNIT_LOBBY;
objRequest.action = Const.SERVER_COMMAND_LOGIN;
objRequest.data = new Object();
objRequest.data.login = strLogin;
objRequest.data.password = strPassword;
Connection.doServerRequest(objRequest);
}
public static function doGameStart(strGame:String, strPrivacy:String, strArenaId:String, uintBetLimit:uint):void {
var objRequest:Object = new Object();
objRequest.unit = Const.SERVER_UNIT_GAME;
objRequest.action = Const.SERVER_COMMAND_START;
objRequest.session = Authentication.session;
objRequest.data = new Object();
objRequest.data.game = strGame;
objRequest.data.gamedata = new Object();
objRequest.data.gamedata.privacy = strPrivacy;
objRequest.data.gamedata.betLimit = uintBetLimit;
//objRequest.data.gamedata.arenaId = strArenaId;
Connection.doServerRequest(objRequest);
}
public static function doServerRequest(objRequestData:Object):void {
Connection._urlRequest.data = JSON.encode(objRequestData);
Connection._urlLoader.load(Connection._urlRequest);
//trace("Server JSON: " + JSON.encode(objRequestData));
Debug.traceObject("Client", objRequestData);
}
}
}
Класс
Root вызывает статические методы класса
Connection, который отправляет запросы на сервер, он же получает ответ. Хотелось бы узнать, как теперь, например, из статического метода
serverResponseManager, обратится к созданному в IDE клипу
mcContainer. Ведь
mcContainer — член экземпляра класс
Root и мы не сможем обратится к нему из статического метода.
P.S Извиняюсь за большое кол-во кода, но по другому не выходило.