Просмотр полной версии : Помогите с архитектурой классов в приложении
EndoCrinologist
02.04.2015, 19:37
В одной папке лежат:
- fla-файл
- папка vk с классами для работы с API
- папка network
- as-файлы FirstLaunch.as, VKConnect.as
Во fla-файле в свойствах кадра указан FirstLaunch.as
Вот его содержимое
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, который проверяет соединение с сервером:
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:
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 есть строки:
var vkConnect:VKConnect = new VKConnect();
var isVKConnected:Boolean = vkConnect.getVKConnected();
var vkConnectTimeoutID:int = setTimeout(function()
{
trace(isVKConnected);
},5000);
В трейсе пишет false даже через 5 секунд. Как будет лучше вообще проверить, есть ли соединение с ВК или нет? И нужно ли оно вообще? Ну, по идее, нужно. Мне нужен будет viewer_id для получения информации по игроку...
Добавлено через 20 минут
Вопрос еще один. Как в Profeccional присвоить кадрам разные классы...
caseyryan
02.04.2015, 20:03
Как в Profeccional присвоить кадрам разные классы...
Никак. Стоит вообще забыть про кадры и писать только в классах. Вообще, к слову, флеш далеко не лучший способ научиться программировать. Да, может странно это слышать от флешера на форуме по флешу, но это так. Лучше учиться на чем-то более серьезном, типа Java или C++. Вот где точно можно понять что такое классы и как ими пользоваться без всяких там таймлайнов и кадров, которые только кашу в голове создают.
Как будет лучше вообще проверить, есть ли соединение с ВК или нет?
О каком соединении идет речь? Это же не сокет сервер. Тут все через простые http запросы происходит, и никакого соединения не поддерживается. Результат каждого запроса приходит в колбэк и никаких костылей и интервалами делать не нужно.
И вот тут у меня возникает вопрос. В FirstLaunch.as есть строки:
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(), чтобы обновить состояние соединения.
var vkConnectTimeoutID:int = setTimeout(function()
{
trace(vkConnect.getVKConnected());
},5000);
EndoCrinologist
02.04.2015, 20:40
dimarik, хм, да, спасибо. Не додумался.....
caseyryan, да я знаю, что через HTTP.. Поэтому просто подключиться и проверить. Заодно и viewer_id получить для дальнейшего соединения
ZackMercury
02.04.2015, 20:51
Для начала неплохо бы разобраться с базовой структурой и ООП, а потом уже лезть в связь с сервером итд.
Вот тут я и Wolsh пытались объяснить основные особенности объектно-ориентированной структуры:
http://www.flasher.ru/forum/showthread.php?t=210113
EndoCrinologist
02.04.2015, 21:01
ZackMercury,о, спасибо
А такой вопрос: вот написал я класс. Как инициируется его запуск, если я пользуюсь только FD? Там где написано // entry point?
ZackMercury
02.04.2015, 21:09
EndoCrinologist, экземпляр главного класса приложения создаётся автоматически и сразу добавляется в дисплей лист stage, его можно получить по stage.getChildAt(0) - по умолчанию это будет ваш главный класс.
Как только создается его экземпляр, выполняется метод-конструктор класса, как и в случае с любым другим классом. Ваша заготовка с if(stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init);
нужна только если вы планируете в будущем грузить эту флешку другой флешкой. Она обеспечивает вам доступ к stage(по умолчанию пока DisplayObject не добавлен в список отображения - ссылка на stage == null) однако если ваша флешка запускается сразу из страницы или стендалон-плеера, то ссылка на stage в главном классе доступна уже в его конструкторе.
EndoCrinologist
02.04.2015, 21:13
О боже, как все сложно... Столько мороки... Раньше понарисовал что надо, понаприкреплял код и сиди-радуйся.. Нееет.. Им надо было гемор составить.. Теперь вместо того, чтобы ДЕЛАТЬ автомобиль, люди днями сидят и продумывают КОД для робота, который этот автомобиль бы сделал..... bueh......
ZackMercury
02.04.2015, 21:17
EndoCrinologist, люди стараются уходить от быдлокода и пытаются сделать код универсальным(не зависящим от проекта или даже платформы/языка).
Это вполне нормальный процесс. Никто не хочет переписывать проект несколько раз, чтобы поменять отдельный модуль(например, внешний вид или отдельно логику работы кнопки).
EndoCrinologist
02.04.2015, 21:38
Дык, проблема как раз-таки в том, чтобы создать такую универсальную кнопку... Проблема в том, что в коде тебе придется учитывать всевозможные случаи поведения.. А это ли не гемор?...
ZackMercury
02.04.2015, 22:02
Смотря как делать. В моём случае это довольно увлекательный процесс. Главное, засечь фишку.
Постепенно перед вами откроются все её плюсы.
EndoCrinologist
02.04.2015, 22:19
для меня сейчас as3 предстает злым дядькой, который оторвал мне мышь и сказал "пиши игру. кодом.". а я стою с открытым ртом и не знаю, что делать... наверное, сейчас все среды поудаляю, а Вы мне скажите - что установить и чем пропатчить?
ZackMercury
02.04.2015, 22:28
Вы просто привыкли писать в кадрах, всем трудно поначалу в классы перейти, но когда переходят - не сожаоеют о времени, уж поверьте с: А некоторые и вовсе с классов начинают, и им норм.
Дык, проблема как раз-таки в том, чтобы создать такую универсальную кнопку... Проблема в том, что в коде тебе придется учитывать всевозможные случаи поведения.. А это ли не гемор?..
Мммм, автоматизация, вкусняшка. Это самое кайфовое, что может быть. Сидишь, продумываешь, пишешь, и вот когда все отлажено, ты подаешь разные входные данные и нажимаешь волшебную кнопку. А в ответ получаешь правильный результат, который, если делать руками требуется раза в 4 больше времени и усталый мозг взрывает оргазмммМ.
EndoCrinologist
02.04.2015, 23:10
GBee, тоже неплохой подход. но мне как-то вспомнился 1 один хороший сатирический примерЖили-были два разработчика.
Допустим, одного звали Ваня, а другого Петя. И вот начал каждый из них писать один и тот же продукт. Ваня быстренько приступил к делу, даже толком не подумал, какой будет архитектура, и так же быстренько закончил писать свой *****код. Тем временем Петя тщательно разрабатывал архитектуру, потом еще месяц делал удобный интерфейс, писал тесты, самостоятельно написал код (на что ушло еще два месяца), и, в конце концов, из этого вышло достойное качественное приложение.
Ваня же уже через месяц быстренько выпустил первую версию программы (с багами, конечно, но рабочую). Спустя месяц вышла вторая версия, в которой старые баги были исправлены, но вылезли новые. После месяца продаж он на заработанные деньги нанял двух толковых программистов, они ему исправили код, доделали интерфейс, выпустили еще одну версию программы.
Итого: у Вани два работника, море клиентов, более-менее работающее приложение. У Пети хорошее, но неизвестное приложение, ни одного клиента, на счете в банке ноль. Ваня легко может купить Пеню с потрохами.
И пока я буду трахаться возиться с этим, другие могут перехватить идею. и я останусь БЕЗ хлебушка...
Добавлено через 3 минуты
as3 - это тот самый Петя, который остался без всего...
Кстати, такой вопрос. Возможна работа с api-vk через as2 БЕЗ IFrame?
Ну пример тут не в тему.
Все-таки автоматизатор, назовем его условно Генри, сделал бы быстрее Вани.
EndoCrinologist
02.04.2015, 23:29
Мне кажется Генри=Петя, когда он огромную часть времени затратит на выстроение логики и написание кода этой самой автоматизации..
ZackMercury
03.04.2015, 05:51
EndoCrinologist, программист с месяцами и годами собирает готовые инструменты(классы), и использует их с успехом повсеместно. Например MVC, это Model и Controller кнопки, вью которого может быть написан заново для любого проекта, например это система окон в приложении(наподобии Flash Professional), вам не нужно писать её с нуля, вы можете использовать прежде написанные классы, если они грамотно организованы(и дело не только в том, сколько вы нпд ними просидите, а скорее в том, сколько у вас опыта и насколько хорошо вы представляете правильную структуру).
К тому же, AS3 позволяет точно так же работать в кадрах, и если вы аниматор, а не программист - пишите там. Но если вы собираетесь работать программистом, вам стоит усвоить одну интересную вещь - код в кадрах Adobe Flash автоматически собирает в код в классах(ни о какой оптимизированности кода в кадрах не может быть и речи). Тоесть, работая в кадрах вы неявным образом работаете в классах, и преобразованием занимается программа. А программа означает лишний код или затратные операции, которых можно избежать, если грамотно использовать объекты.
Так не лучше ли обрести больший функционал/потенциал, обрасти сотнями полезных собственных классоа, и писать Петину работу быстрее Вани.
caseyryan
03.04.2015, 07:39
as3 - это тот самый Петя, который остался без всего...
Кстати, такой вопрос. Возможна работа с api-vk через as2 БЕЗ IFrame?
EndoCrinologist, похоже это просто не ваше. Не стоит вообще браться за программирование при таком настрое. Это либо нравится, либо нет. Другого не дано. Если с самого начала не нравится, то ничего толкового из этого не выйдет.
Все вот эти заморочки, про которые вы говорите, это наоборот круто. Это большая универсальность. Более высокий порог вхождения, но и гораздо больше возможностей. Никаким "нажал кнопку и прикрепил" ничего дельного не собрать. Максимум игрушки на 5 минут типа старых масянь и тому подобных.
Лично для меня этот процесс офигенно увлекательный. Я могу днями писать код и это мне совсем не надоедает. Как раз больше напрягает возиться со всякими кнопками и таймлайнами.
п.с. А если нужны кнопки и кадры, as2 ведь никто не отменял. Можно продолжать работать точно так же, как и раньше
EndoCrinologist
03.04.2015, 11:52
Спасибо всем за ответы, друзья.
caseyryan, да, Вы правы. Если настроя нет, то и дела не пойдут на лад. Согласен. Я люблю программирование. Например, у меня 2 полностью вручную написанных сайта. Я не люблю CMS и тем более, разбираться в них. Нравится, когда код полностью мой и больше ничей. Думаю, ZackMercury прав: мне просто нужно больше опыта и больше литературы, которая ответит на мои вопросы. Просто, когда начинаю что-то делать и думаю, что всё получится, но ничего не получается, начинаешь вдумываться, а почему не сработало? И через час возни, когда думал, что пофиксил уже все баги, но ничего не вышло опять - сразу как-то настрой пропадает и ничего не охота делать...
Добавлено через 5 минут
Можете помочь с FlashDevelop? Я хочу полностью удалить всё, что понаустанавливал: профешнал, develop, lime, haxe, sdk (кроме установочных). Что из этого и в каком порядке надо установить?
Godwarlock
03.04.2015, 15:34
Можете помочь с FlashDevelop? Я хочу полностью удалить всё, что понаустанавливал: профешнал, develop, lime, haxe, sdk (кроме установочных). Что из этого и в каком порядке надо установить?
Профешанал оставь, он сгодится в качестве библиотеки. Скачиваешь FD, устанавливаешь в любую папку. Скачиваешь flexsdk вроде и закидываешь его в FD в папку Tools. Вот в прочем то и всё. А ну и в настройках FD выбери папку SDK которую ты скинул в папку FD
EndoCrinologist
03.04.2015, 18:10
а haxe и lime вообще нужны в этом трио?
OlmerDale
03.04.2015, 18:37
haxe это язык, as3 тоже язык. И это два разных языка.
EndoCrinologist
03.04.2015, 19:04
А haxe вообще что может?
caseyryan
03.04.2015, 19:13
Можете помочь с FlashDevelop? Я хочу полностью удалить всё, что понаустанавливал: профешнал, develop, lime, haxe, sdk (кроме установочных). Что из этого и в каком порядке надо установить?
Процесс такой:
1) Скачать AIR SDK (http://www.adobe.com/devnet/air/air-sdk-download.html), и дополнительно можно скачать Apache Flex (http://flex.apache.org/)
Но с апачи флекс есть заморочка, так как он перестал принадлежать адоби, но некоторые библиотки, например парсеры шрифтов, по прежнему принадлежат адоби, их придется докачивать и доустанавливать отдельно, если потребуются.
2) Скачать собственно FlashDevelop (http://www.flashdevelop.org/downloads/releases/FlashDevelop-4.7.2.exe)
И установить ее убрав все галочки автоматической загрузки SDK. Не знаю что за косяк с ней, но вот как раз на загрузке этих дополнений, про которые я написал выше, процесс падает (может так только у меня, не знаю)
3) Скачать 32 битную JRE (http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html). И установить в директорию, которая не содержит пробелов, каких-то букв кроме латинских, и первых цифр. Я обычно ставлю просто в C:\Java\jre_x.x.x
Нужна именно 32 битная версия джавы!, даже если сама система х64
4) Создать переменную среды JAVA_HOME и прописать в нее путь до этой джавы, не включая папку bin
То есть если джава установлена в C:\Java\jre_1.8.40\bin\java.exe, то указать нужно C:\Java\jre_1.8.40, а в переменную Path вписать как раз C:\Java\jre_1.8.40\bin. При чем можно попутно устанавливать и другие версии джавы.
5) Открыть FD, зайти в Tools - Program Settings - AS3Context - Installed Flex SDKs и добавить туда пути до скачанного и распакованного флекса и эйра
6) Профит.
а haxe и lime вообще нужны в этом трио?
Нет. Можно снести.
А haxe вообще что может?
собирать один и тот же код под разные платформы (http://haxe.org/use-cases/)
OlmerDale
03.04.2015, 19:21
haxe, по мимо того, что может компилироваться почти в любой язык, ещё способствует заживлению ран,
рассасыванию рубцов и полное излечение от мозолей на ногах. Так же его можно настаивать на спирту и понемного отсыпать детям в школу. А ещё поговаривают, что он помогает при охоте на липриконов.
Если Вам так безразлично что учить, то учите уж плюсы или шарп, что Вам этот флеш сдался, а тем более haxe, который не пойми во что компилируется. В js например тысяча препроцесоров, которые компилируются в js и только один реально хороший. Именно это и заставляем меня сомневаться в итоговом годе скомпилированным из haxe. Не говоря уже о том, что fd позиционирующий себя как ide для такого специфического языка как haxe не может сделать эмулятор производительности различных устройств.
И если Вы даже fd поставить не можете, то лучше не спешите с изучением haxe с которым будет в тысячи раз сложнее из-за узкого круга разработчиков, которые с ним работают.
Странный язык и если он не обновляется хотя бы раз в месяц, то он мертвый.
caseyryan
03.04.2015, 21:07
Не говоря уже о том, что fd позиционирующий себя как ide для такого специфического языка как haxe не может сделать эмулятор производительности различных устройств.
А какая IDE может? Именно IDE, а не подключенные к ней сторонние разработки типа того же apache flex или android sdk.
с которым будет в тысячи раз сложнее из-за узкого круга разработчиков
Он довольно простой. Очень сильно похож на as3
ZackMercury
03.04.2015, 21:17
Прошу прощение за вторжение, я лично не знаком с хэкс, но зачем он автору темы?) За все 2 года работы с флешем мне он не понадобился ни разу.
caseyryan
03.04.2015, 21:50
Прошу прощение за вторжение, я лично не знаком с хэкс, но зачем он автору темы?)
Незачем. Но раз уж речь о нем зашла сразу от ТС, то можно и о хексе поговорить)
Хотя говоря по правде, я тоже не вижу в нем никаких плюсов. По мне так лучше изучить целевые языки, на которых собираешься писать. Хекс - это что-то вроде редакторов WYSIWYG для создания сайтов, в том плане, что работу то он сделает, но добавит кучу всякого левого хлама, без которого легко можно было бы обойтись, если написать вручную
ZackMercury
03.04.2015, 22:50
caseyryan, а зачем тогда на haXe писать ресурсоёмкие алгоритмы (http://www.flasher.ru/forum/blog.php?b=203)?
Я думал, он сразу в байткод аналогично AS3 компилит. Хотя Блуд тут же говорит о каком-то мусоре от хэкс :)
EndoCrinologist
04.04.2015, 00:00
caseyryan, спасибо за подробное объяснение, буду переделывать.
Такой вопрос по классам возник. Допустим, у меня написан класс, который выполняется первым. Он проверил соединение с вк, получил id пользователя, затрейсил данные в текстовое поле для видимости, так сказать. А как осуществить переход далее? Имею в виду, как мне после всех этих проверок уже сгенерировать основной интерфейс? я не в том плане, как писать кнопки, а в том, что... как бы... как перейти на другой кадр, грубо говоря? Надеюсь, вы поняли что я имел в виду...
ZackMercury
04.04.2015, 00:20
Сам основной класс(Main) не должен конкретно заниматься сервером. Максимум, что он должен делать - это создавать экземпляры "работников" - тех, кто конкретно и напрямую общается с частями приложения.
Например, пример с соцсетями, который я однажды вычитал в блоге у тигры. Написали вы вот класс, который общается с ВК, ну съделали игру, она удалась и тут начальник требует портировать игру в фейсбук и ОК. Что вы будете делать? Переписывать не всё приложение, а только 1 класс, который запрашивает методы у соцсети и возвращает данные. У разных соцсетей разные апи, т.е. названия методов и возможности.
Решение проще некуда: создать не VKConnector, а, к примеру, SocialConnector, который реализует интерфейс ISocial, и методы, которые используются в приложении(пост на стену, запрос друзей, фоток и тд), вам в итоге не придётся переписывать всюду во всём приложении запросы, а лишь переписать один класс, который реализует эти методы(SocialConnector), изменить в нём ссылки на апи и названия методов выставить соответствующие.
Вот руководствуясь такой логикой нужно "хитро" строить приложение надеясь на дальнейшую модификацию.
Ответ на ваш вопрос, если я правильно понял:
Допустим, удалить окошко входа(экземпляр класса LogInWindow) со сцены и добавить например экземпляр класса Game.
EndoCrinologist
04.04.2015, 01:12
Так... Вот у меня класс Main... Там я проверил соединение с вк получил ид...
Теперь, делаю что-то вроде if-конструкции, мол, "если ид получен и соединение есть, значит": и тогда я:
1) удаляю текстовое поле
2) создаю экземпляр класса MyInterface, который генерит всё наше меню. Так?
ZackMercury
04.04.2015, 01:14
Ну, для начала учёбы сойдёт и так. Я наверное наперёд забежал. Чуть позже, как въедете - прочитайте предыдущее сообщение ещё разок.
EndoCrinologist
04.04.2015, 13:49
Наверное, я что-то делаю не так... Вот мой Main.as:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import vk.APIConnection;
import vk.events.*;
/**
* ...
* @author Volodin Alexandr Sergeevich
*/
public class Main extends Sprite
{
private var tracer:TextField;
private var DEBUG:Boolean = true;
public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var flashVars:Object = stage.loaderInfo.parameters as Object;
tracer = new TextField();
tracer.x = 10;
tracer.y = 50;
tracer.width = 587;
tracer.height = 349;
tracer.border = true;
tracer.borderColor = 0xDAE2E8;
tracer.background = true;
tracer.backgroundColor = 0xFFFFFF;
tracer.embedFonts = false;
var format:TextFormat = new TextFormat();
format.font = "Tahoma";
format.color = 0x000000;
format.size = 11;
tracer.defaultTextFormat = format;
addChild(tracer);
if (DEBUG) tracer.appendText("Приложение запущено\n");
if (flashVars.api_id)
{
if (DEBUG) tracer.appendText("\n// -- Переменные тестирования:\n");
if (DEBUG) tracer.appendText("flashVars['api_id'] = " + flashVars['api_id'] + ";\n");
if (DEBUG) tracer.appendText("flashVars['viewer_id'] = " + flashVars['viewer_id'] + ";\n");
if (DEBUG) tracer.appendText("flashVars['sid'] = \"" + flashVars['sid'] + "\";\n");
if (DEBUG) tracer.appendText("flashVars['secret'] = \"" + flashVars['secret'] + "\";\n");
if (DEBUG) tracer.appendText("// -- //\n\n");
if (DEBUG) tracer.appendText("Подключение API\n");
var VK: APIConnection = new APIConnection(flashVars);
VK.addEventListener('onConnectionInit', function(): void
{
if (DEBUG) tracer.appendText("Соединение установлено\n");
removeChild(tracer);
title = new TextField();
title.x = 0;
title.y = 260;
title.width = 800;
title.height = 80;
var format:TextFormat = new TextFormat();
format.font = "Tahoma";
format.color = 0x000000;
format.size = 30;
format.align = "center";
title.defaultTextFormat = format;
addChild(title);
title.appendText("Добро пожаловать на шоу\n");
title.appendText("ДЕСЯТЬ МИЛЛИОНОВ");
var nextStep1ID:int = setTimeout(function():void
{
removeChild(title);
var myIntroduce:Introduce = new Introduce();
},5000);
});
}
}
}
}
Вот Introduce.as:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import vk.ui.VKButton;
/**
* ...
* @author Volodin Alexandr Sergeevich
*/
public class Introduce extends Sprite
{
public function Introduce()
{
var btn: VKButton = new VKButton('НОВАЯ ИГРА');
btn.x = 15;
btn.y = 15;
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, function(e: Event):void
{
removeChild(btn);
});
}
}
}
Вроде бы, я создаю экземпляр класса в Main.as:
90. var myIntroduce:Introduce = new Introduce();
но при заливе в вк, сцена остается пустой и ничего на сцене не отображается. Я так понимаю, мне нужно прочитать опять области видимости?
Где addChild(myIntroduce) ?
ZackMercury
04.04.2015, 15:43
В AS3 не принято использовать анонимные функции(и не то, что просто не принято - они также пагубно сказываются на производительности).
Оформляйте обработчики методами.
EndoCrinologist
04.04.2015, 16:10
ZackMercury, Вы имеете в виду get-функции? Или что? Если да, то как возвращать данные в Main?
ZackMercury
04.04.2015, 16:17
Причём тут гет-функции?
У вас вот тут и вот тут анонимные функции:
btn.addEventListener(MouseEvent.CLICK, function(e: Event):void
{
removeChild(btn);
});
var nextStep1ID:int = setTimeout(function():void
{
removeChild(title);
var myIntroduce:Introduce = new Introduce();
},5000);
Добавлено через 2 минуты
Как надо бы:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import vk.ui.VKButton;
/**
* ...
* @author Volodin Alexandr Sergeevich
*/
public class Introduce extends Sprite
{
private var btn:VKButton;
public function Introduce()
{
btn = new VKButton('НОВАЯ ИГРА');
btn.x = 15;
btn.y = 15;
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, btnClicked);
}
private function btnClicked(e:MouseEvent):void
{
removeChild(btn);
}
}
}
caseyryan
04.04.2015, 16:44
В AS3 не принято использовать анонимные функции(и не то, что просто не принято - они также пагубно сказываются на производительности).
Есть места, где они гораздо удобнее и смотрятся красивее, чем отдельные обработчики
К примеру твины в старлинге
public function animateAppear(displayObject:DisplayObject):void {
var initScaleX:Number = displayObject.scaleX;
var initScaleY:Number = displayObject.scaleY;
displayObject.scaleX = initScaleX * .7;
displayObject.scaleY = initScaleY * .7;
var tween:Tween = new Tween(displayObject, .3, Transitions.EASE_IN_OUT_BACK);
tween.animate("scaleX", initScaleX);
tween.animate("scaleY", initScaleY);
// вот здесь гораздо удобнее сделать анонимную функцию
tween.onComplete = function():void {
Starling.juggler.remove(tween);
}
Starling.juggler.add(tween);
}
И подобных примеров можно привести много. Да и на производительность это никак не повлияет. Что метод класса, что анонимная функция - объекты типа Function. И такое присвоение будет просто передачей ссылки на объект.
ZackMercury
04.04.2015, 16:45
caseyryan, только твины. В остальном стоит придерживаться конвенций. Обработчики событий следует оформлять методами.
Новичку следует приучиться этому, так что ваше сообщение не в тему. А потом он сам уже будет решать, что ему использовать и когда с: А то так его код превратится в кашу и будет совсем нечитаем.
caseyryan
04.04.2015, 16:56
caseyryan, только твины
Не только твины. Я там написал, что таких примеров много можно привести. Колбэки в большинстве случаев удобнее делать именно анонимами.
Да и конвенции - это еще далеко не истина первой инстанции.
Но по поводу обработчиков событий да, лучше отдельными методами делать
EndoCrinologist
06.04.2015, 07:53
Причём тут гет-функции?
Как надо бы:
Спасибо, помогло. Запомню этот совет :)
Добавлено через 3 часа 42 минуты
Кстати, вопрос по поводу интерфесного меню. Я так понимаю, нажав на кнопку в меню и для загрузки нового раздела нужно сделать removeChild(myInterface) и объявить новый класс, относящийся к разделу кнопки? Или как по умному такое делается?
ZackMercury
06.04.2015, 16:41
Спасибо, помогло.
От чего помогло? Вам Wolsh на ваш вопрос ответил, я только замечание сделал по поводу кода)
Кстати, вопрос по поводу интерфесного меню. Я так понимаю, нажав на кнопку в меню и для загрузки нового раздела нужно сделать removeChild(myInterface) и объявить новый класс, относящийся к разделу кнопки? Или как по умному такое делается?
Всё зависит от ситуации и кому как больше нравится тот так и делает.
Обычно на кнопки делается общий обработчик клика и в нём свитчем на каждую кнопку определяется по действию.
И в этом действии лучше не писать конкретный код, а вызвать соответствующий метод, хотя часто бывает удобно если код небольшой оставить его в кейсе.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.