Показать сообщение отдельно
Старый 02.04.2015, 19:37
EndoCrinologist вне форума Посмотреть профиль Отправить личное сообщение для EndoCrinologist Найти все сообщения от EndoCrinologist
  № 1  
Ответить с цитированием
EndoCrinologist
 
Аватар для EndoCrinologist

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
По умолчанию Помогите с архитектурой классов в приложении

В одной папке лежат:
- fla-файл
- папка vk с классами для работы с API
- папка network
- as-файлы FirstLaunch.as, VKConnect.as

Во fla-файле в свойствах кадра указан FirstLaunch.as
Вот его содержимое
Код AS3:
package
{
	import flash.display.*;
	import network.*;
	import flash.system.*;
	import flash.utils.*;
 
	public class FirstLaunch extends MovieClip
	{
		private static var DOMAIN:String = "http://*****.ru/crossdomain.xml";
 
		// ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ ОТЛАДКИ
		public var DEBUG:Boolean = true;
 
		public function FirstLaunch():void
		{
			if (DEBUG) trace("ШАГ №1. СОЕДИНЕНИЕ С СЕРВЕРОМ ИГРЫ *****.ru");
			if (DEBUG) trace("FirstLaunch запущен");
			Security.loadPolicyFile(DOMAIN);
			if (DEBUG) trace("crossdomain.xml загружен");
			var checkNet:CheckNetwork = new CheckNetwork(DEBUG);
			var i:int = 10;
			var statusIntervalID:* = setInterval(function()
			{
				var isConnect:Boolean = checkNet.getStatus();
				if (i > 0)
				{
					if (!isConnect)
					{
						if (DEBUG) trace("Попытка #"+i);
						i++;
					} else
					{
						clearInterval(statusIntervalID);
						if (DEBUG) trace("Соединение установлено.");
						if (DEBUG) trace("ШАГ №2. ПОЛУЧЕНИЕ ДАННЫХ ВКОНТАКТЕ");
 
						var vkConnect:VKConnect = new VKConnect();
						var isVKConnected:Boolean = vkConnect.getVKConnected();
						var vkConnectTimeoutID:int = setTimeout(function()
						{
							trace(isVKConnected);
						},5000);
					}
				} else
				{
					clearInterval(statusIntervalID);
					if (DEBUG) trace("Количество попыток иссякло");
				}
			},1000);
		}
	}
}
В папке network лежит файл CheckNetwork.as, который проверяет соединение с сервером:
Код AS3:
package network
{
	import flash.net.*;
	import flash.events.*;
	import flash.errors.*;
	import flash.display.*;
 
	public class CheckNetwork extends Sprite
	{
		private static var random:int = Math.round(Math.random() * 10000);
		private static var DOMAIN:String = "http://*****.ru/AS3_connect.php?launch="+random;
		public var isConnected:Boolean = false;
		public var isDebug = false;
 
		public function CheckNetwork(isDebug:Boolean = false)
		{
			this.isDebug = isDebug;
			if (this.isDebug) trace("Соединяюсь с '" + DOMAIN + "'...");
			var urlLoader:URLLoader = new URLLoader();
			var urlRequest:URLRequest = new URLRequest(DOMAIN);
			urlLoader.addEventListener(Event.COMPLETE, completeListener);
			urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener);
			urlLoader.load(urlRequest);
		}
 
		private function completeListener(e:Event):void
		{
			if (this.isDebug) trace("Соединился. Получаю данные...");
 
			var requestString:String = e.target.data;
			if (this.isDebug) trace("requestString: "+requestString);
			if (requestString)
			{
				var jsonObj:Object = new Object();
				jsonObj = JSON.parse(requestString);
				var CONNECTION:String = jsonObj.response;
 
				if (CONNECTION == "CONNECTION_DONE")
				{
					isConnected = true;
					if (this.isDebug) trace("CONNECTION: " + CONNECTION);
				}
 
			} else
			{
				if (this.isDebug) trace("Нет данных в requestString");
			}
		}
		private function ioErrorListener(e:Event)
		{
			if (this.isDebug) trace(DOMAIN + ": ОШИБКА СОЕДИНЕНИЯ");
		}
 
		public function getStatus():Boolean
		{
			return isConnected;
		}
	}
}
Суть такая: соединяется с сервером. Если соединение есть CheckNetwork возвращает true. Как только он вернет true в ход вступает VKConnect.as:
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
 
	import vk.APIConnection;
	import vk.events.*;
 
	public class VKConnect extends Sprite
	{
		public var isVK:Boolean = false;
 
		public function VKConnect() {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function fetchUserInfo(data: Object): void {
			// Example of fetching info from API request
			for (var key: String in data[0]) {
				trace(key + "=" + data[0][key] + "\n");
			}
		}
		private function onApiRequestFail(data: Object): void {
			// Example of fetching fail from API request
			trace("VKAPI-ошибка: "+data.error_msg+"\n");
		}
 
		private function init(e: Event = null): void {
			if (e) {
				removeEventListener(e.type, init);
			}
			var flashVars: Object = stage.loaderInfo.parameters as Object;
 
			trace(flashVars);
 
			if (!flashVars.api_id)
			{
				flashVars['api_id'] = *****;
				flashVars['viewer_id'] = *****;
				flashVars['sid'] = "*****";
				flashVars['secret'] = "*****";
			}
 
			var VK: APIConnection = new APIConnection(flashVars);
			VK.api('getProfiles', { uids: flashVars['viewer_id'] }, fetchUserInfo, onApiRequestFail);
 
			VK.addEventListener('onConnectionInit', function(): void{
				trace("Соединение с ВКонтакте установлено");
				isVK = true;
			});
		}
 
		public function getVKConnected()
		{
			return isVK;
		}
	}
 
}
И вот тут у меня возникает вопрос. В FirstLaunch.as есть строки:
Код AS3:
var vkConnect:VKConnect = new VKConnect();
var isVKConnected:Boolean = vkConnect.getVKConnected();
var vkConnectTimeoutID:int = setTimeout(function()
{
trace(isVKConnected);
},5000);
В трейсе пишет false даже через 5 секунд. Как будет лучше вообще проверить, есть ли соединение с ВК или нет? И нужно ли оно вообще? Ну, по идее, нужно. Мне нужен будет viewer_id для получения информации по игроку...

Добавлено через 20 минут
Вопрос еще один. Как в Profeccional присвоить кадрам разные классы...
__________________
Надо сменить подпись...