Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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 присвоить кадрам разные классы...
__________________
Надо сменить подпись...

Старый 02.04.2015, 20:03
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Как в Profeccional присвоить кадрам разные классы...
Никак. Стоит вообще забыть про кадры и писать только в классах. Вообще, к слову, флеш далеко не лучший способ научиться программировать. Да, может странно это слышать от флешера на форуме по флешу, но это так. Лучше учиться на чем-то более серьезном, типа Java или C++. Вот где точно можно понять что такое классы и как ими пользоваться без всяких там таймлайнов и кадров, которые только кашу в голове создают.

Цитата:
Как будет лучше вообще проверить, есть ли соединение с ВК или нет?
О каком соединении идет речь? Это же не сокет сервер. Тут все через простые http запросы происходит, и никакого соединения не поддерживается. Результат каждого запроса приходит в колбэк и никаких костылей и интервалами делать не нужно.

Старый 02.04.2015, 20:11
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от EndoCrinologist Посмотреть сообщение
И вот тут у меня возникает вопрос. В FirstLaunch.as есть строки:
Код AS3:
var vkConnect:VKConnect = new VKConnect();
var isVKConnected:Boolean = vkConnect.getVKConnected();
var vkConnectTimeoutID:int = setTimeout(function()
{
trace(isVKConnected);
},5000);
В трейсе пишет false даже через 5 секунд.
Даже через 100 лет trace так напишет. Догадаетесь сами? Ну ладно, значение isVKConnected присваивается на тот момент, когда соединение недоступно. Но трейс этого значения вы зачем-то откладываете до лучших времен (на 5 секунд). Вместо этого необходимо повторно читать vkConnect.getVKConnected(), чтобы обновить состояние соединения.

Код AS3:
var vkConnectTimeoutID:int = setTimeout(function()
{
trace(vkConnect.getVKConnected());
},5000);
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
dimarik, хм, да, спасибо. Не додумался.....
caseyryan, да я знаю, что через HTTP.. Поэтому просто подключиться и проверить. Заодно и viewer_id получить для дальнейшего соединения
__________________
Надо сменить подпись...

Старый 02.04.2015, 20:51
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 5  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Для начала неплохо бы разобраться с базовой структурой и ООП, а потом уже лезть в связь с сервером итд.
Вот тут я и Wolsh пытались объяснить основные особенности объектно-ориентированной структуры:
http://www.flasher.ru/forum/showthread.php?t=210113
__________________
There is no thing in this world that is not simple.

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

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
ZackMercury,о, спасибо
А такой вопрос: вот написал я класс. Как инициируется его запуск, если я пользуюсь только FD? Там где написано // entry point?
__________________
Надо сменить подпись...

Старый 02.04.2015, 21:09
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 7  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
EndoCrinologist, экземпляр главного класса приложения создаётся автоматически и сразу добавляется в дисплей лист stage, его можно получить по stage.getChildAt(0) - по умолчанию это будет ваш главный класс.

Как только создается его экземпляр, выполняется метод-конструктор класса, как и в случае с любым другим классом. Ваша заготовка с if(stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init);
нужна только если вы планируете в будущем грузить эту флешку другой флешкой. Она обеспечивает вам доступ к stage(по умолчанию пока DisplayObject не добавлен в список отображения - ссылка на stage == null) однако если ваша флешка запускается сразу из страницы или стендалон-плеера, то ссылка на stage в главном классе доступна уже в его конструкторе.
__________________
There is no thing in this world that is not simple.

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

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
О боже, как все сложно... Столько мороки... Раньше понарисовал что надо, понаприкреплял код и сиди-радуйся.. Нееет.. Им надо было гемор составить.. Теперь вместо того, чтобы ДЕЛАТЬ автомобиль, люди днями сидят и продумывают КОД для робота, который этот автомобиль бы сделал..... bueh......
__________________
Надо сменить подпись...

Старый 02.04.2015, 21:17
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 9  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
EndoCrinologist, люди стараются уходить от быдлокода и пытаются сделать код универсальным(не зависящим от проекта или даже платформы/языка).
Это вполне нормальный процесс. Никто не хочет переписывать проект несколько раз, чтобы поменять отдельный модуль(например, внешний вид или отдельно логику работы кнопки).
__________________
There is no thing in this world that is not simple.

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

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
Дык, проблема как раз-таки в том, чтобы создать такую универсальную кнопку... Проблема в том, что в коде тебе придется учитывать всевозможные случаи поведения.. А это ли не гемор?...
__________________
Надо сменить подпись...

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.