Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   данные из функции AS3 (http://www.flasher.ru/forum/showthread.php?t=211769)

exsites 04.11.2015 03:21

данные из функции AS3
 
Доброй ночи. потихому изучаю AS3 вот получилось что получилось..

Код AS3:

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);
 
function onComplete(event:Event) {
        var img:Array = [event.target.data];
 
        //trace(img)
 
        //return img;
}

как получить массив img вне функции?
Спасибо.

ALeXVoz 04.11.2015 10:54

Хендлеры всегда должны быть void
В onComplete вызвать другую функцию и передать как параметр.

Код AS3:

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);
 
function onComplete(event:Event):void {
        var img:Array = [event.target.data];
        someFun(img)
}
 
function someFun(arr:Array):void {
        //do something
}


Zebestov 04.11.2015 14:10

Или объявить var img:Array вне метода (в данном случае обработчика события).

Код AS3:

var img:Array;
 
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);
 
function onComplete(event:Event):void {
        img = [event.target.data];
        test();
}
 
function test():void {
        trace(img);
}


caseyryan 04.11.2015 19:26

Цитата:

Хендлеры всегда должны быть void
Совсем не обязательно. Просто в общем случае из них нет смысла что-либо возвращать

ALeXVoz 04.11.2015 19:40

Цитата:

Сообщение от Zebestov (Сообщение 1188624)
Или объявить var img:Array вне метода (в данном случае обработчика события).

Глобальные переменные - не лучший метод. По возможности нужно избегать.

Zebestov 04.11.2015 19:42

О чем ты говоришь :) парень код в кадре пишет! В противном случае разумеется переменная img была бы полем класса.

exsites 05.11.2015 04:58

Спасибо, разобрался.
Да, про поле класса я знаю, не судьба пока мне писать в отдельных файлах.

caseyryan 05.11.2015 07:21

Цитата:

Да, про поле класса я знаю, не судьба пока мне писать в отдельных файлах.
Надо сразу привыкать к написанию кода в классах. Установить какую-нибудь нормальную IDE, типа FlashDevelop или Flash Builder (FlashDevelop бесплтаная и очень крутая, так что я руками и ногами за нее :D)

exsites 05.11.2015 08:11

Я Flex попробовал, вроде бы написать что-то можно, но я хоть ты апстену не понимаю как там рисовать на swf какие-нибудь картинки поля или еще что-то... Во флеше можно и нарисовать и написать..

caseyryan 05.11.2015 09:56

Цитата:

Сообщение от exsites (Сообщение 1188643)
Я Flex попробовал, вроде бы написать что-то можно, но я хоть ты апстену не понимаю как там рисовать на swf какие-нибудь картинки поля или еще что-то... Во флеше можно и нарисовать и написать..

эти понятия нужно разделять

exsites 05.11.2015 10:44

То есть? Рисовать во флеше а кодить в билдере? Да это по моему еще хуже извращение чем кодить в о фреймах:-))))

udaaff 05.11.2015 12:12

Кадры - это жутко неудобно для написания чего-то сложнее баннера. И как раз таки написание в оных, имея более удобные инструменты, можно считать извращением. Почему бы сразу не пойти по верному пути?

ps: в старых иде можно было кодить даже на клипах, что позволяло сделать программу еще более запутанной.

exsites 05.11.2015 14:27

Не знаю, может быть. Мне кажется можно код по кадрам растолкать, то же самое что и файлы в папках... Только в файлы все на сервер тащить надо а тут адна swf... савсэм адна..:-)

udaaff 05.11.2015 14:31

Файлы точно также компилируются в swf, их не нужно никуда тащить.

exsites 05.11.2015 15:04

Да ладно?! Вот это уже интереснее.. ТО есть мне не придется их тащить на сервер? Блин. Я думал .. Век живи. Походу надо попробовать, тем более у меня стоит Flash Builder 4.6. Он нормален для этих целей?

Кстати не подскажете как можно текстовое поле масштабировать? У меня там картинка выводится. Её надо сделать по размерам поля, тут наверное надо получить как-то его ширину в текущем состоянии этого поля. Ну и хотелось бы что бы она разворачивалась на фулскрине..

udaaff 05.11.2015 15:40

Цитата:

Он нормален для этих целей?
Рекомендую вам использовать FlashDevelop или IDEA. Сам пользуюсь FDT, но он платный во всех смыслах.
Цитата:

Кстати не подскажете как можно текстовое поле масштабировать? У меня там картинка выводится. Её надо сделать по размерам поля, тут наверное надо получить как-то его ширину в текущем состоянии этого поля. Ну и хотелось бы что бы она разворачивалась на фулскрине..
Не сталкивался с таким. Если вопрос не относится к теме, то создавайте новую тему.

exsites 05.11.2015 15:44

А как же рисовать??? Сейчас сижу и не понимаю.. Вот например форму для отправки обратной связи например как рисовать в билдере?

udaaff 05.11.2015 16:03

Как вариант: готовите графику во флеш иде (прописываете необходимым объектам имена классов, в настройках в библиотеке, которые будут доступны в вашем проекте после подключения либы), далее экспортируете её в swc и подключаете её к своему проекту.

PS: Должны быть тысячи примеров раскрывающих такой подход.

exsites 05.11.2015 16:13

ну вот теперь более менее картина проясняется.
а если один какой-то объект надо перерисовать? или размеры подогнать? надо после каждого движения делать экспорт?

udaaff 05.11.2015 16:17

Конечно.

exsites 05.11.2015 16:20

Зачем тогда флеш если там не нужно писать код?
Вот у адоба все через ж.. что видео редакторы, то и флеш...

udaaff 05.11.2015 16:36

Приложения можно делать на дисплей листе или на stage3d (используя, например Starling framework). В первом варианте флеш удобен для верстки (т.е. позиционирование, вложенность элементов, масштабирование и т.п.), чего очень и очень не хватает во втором варианте, только не давно появилось расширения для того же старлинга http://www.flasher.ru/forum/blog.php?b=718 . А так или расставлять всё "руками", или писать скрипты для графического редактора, или использовать прочие менее удобные подходы.

exsites 05.11.2015 19:47

а что такое дисплей лист?

udaaff 05.11.2015 20:00

"Обычный способ", то как вы делаете сейчас, без использования stage3d.

exsites 06.11.2015 05:00

конечно сейчас буду глупости спрашивать... но все же:
как перетащить отсюда:
Код AS1/AS2:

        stage.addEventListener(Event.RESIZE, resizeHandler);
        function resizeHandler(event:Event):void {
 
                x_ = 320;
 
        }

вот сюда:

Код AS1/AS2:

function completeLoadImage(event:Event):void
{
 var X:Number = x_;
}

Подскажите.
Спасибо.

Добавлено через 24 минуты
Кстати на вопрос так никто и не ответил... Вопрос был как получить вне функции а не засунуть в другую функцию!

udaaff 06.11.2015 11:14

Цитата:

Вопрос был как получить вне функции а не засунуть в другую функцию!
Загрузка данных выполняется асинхронно. Даже если вы загружаете что-то локально, данные не будут загружены моментально, доступ будет как минимум на след. кадре. Поэтому так как вы хотите работать у вас не получится, "плясать" так или иначе надо от функции-обработчика.

exsites 06.11.2015 15:51

На след кадре... это как на след фрейме...., а это может быть выходом..., если результат один то идем в один фрейм а если другой в другой.. а вы говорите во флеше писать не надо... Да в любой, перечисленной вами программе, голову сломать можно :-) :-). То ли дело php, открыл блокнот и пофиг...
Я так понимаю в том примере на один пост выше мне не передать результат первой функции во вторую из-за того что там события -> event:Event ?
Или все так можно что-то сделать?

Tails 06.11.2015 16:08

Ничего, никто ещё не сломал.
Книжку почитайте, Мука. С контекстом видимости переменных ознакомьтесь, атрибутами доступа. Давно бы уже сами всё узнали, вместо того чтоб пестрить тут нубскими вопросами.

Zebestov 06.11.2015 16:15

Цитата:

Сообщение от exsites (Сообщение 1188695)
на вопрос так никто и не ответил... вопрос был как получить вне функции а не засунуть в другую функцию!

А это что?

exsites 06.11.2015 16:40

Цитата:

Сообщение от Zebestov (Сообщение 1188723)


Вот:
Код AS1/AS2:

var img:Array;
 
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);
 
function onComplete(event:Event):void {
        img = [event.target.data];
        test();
}
 
function test():void {
        trace(img);
}


А вот так сможно?

Код AS1/AS2:

var img:Array;
 
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);
 
function onComplete(event:Event):void {
        img = [event.target.data];
        test();
}
 
 var new_img =img;

Добавлено через 1 минуту
Цитата:

Сообщение от Tails (Сообщение 1188721)
Ничего, никто ещё не сломал.
Книжку почитайте, Мука. С контекстом видимости переменных ознакомьтесь, атрибутами доступа. Давно бы уже сами всё узнали, вместо того чтоб пестрить тут нубскими вопросами.

Мук это автор?
Зря вы про нубские вопросы. У каждого языка есть свои тараканы. И невозможность получить результат выполнения функции в любом месте это "надевание трусов через голову".
И то что вам кажется очевидным....

Zebestov 06.11.2015 16:47

Цитата:

Сообщение от exsites (Сообщение 1188724)
А вот так можно?

Ну конечно можно! Другое дело, что new_img в этом месте выполнение программы будет равен null, как и img. И зачем тебе это?

ZackMercury 06.11.2015 17:03

Цитата:

И невозможность получить результат выполнения функции в любом месте это "надевание трусов через голову".
И в каком месте нельзя получить результат выполнения функции?

Wolsh 06.11.2015 19:47

резоннее спросить, в какое время.

ZackMercury 06.11.2015 20:34

Ну что ж вы, сир, не вдумываетесь, временами, в столь простые вещи?
Неужто вы хотите полагать, что код, за телом функции линейно следующий лишь выполнится не сразу, а после окончания загрузки?
В таком бы случае, зачем там нужна функция вообще? По вашей логике, там было проще прописать загрузку, а ассет на строке чуть ниже стал уже б загружен.
Нет, здесь, внимание, такое есть понятие, как асинхронность. Сиё, извольте объяснить, означает, что слушаем мы "onComplete" событие лишь для того, чтобы поймать то место, самое то место, где ассет наш уже загружен, а всё, что далее идёт за функцией начинает выполняться в тот же миг, как начинается загрузка.

Извольте иной раз, прежде, чем язык винить - представить, будто вы не понимаете чего-то, и почитать примеры и разъяснения из справки и других полезных книжек.

exsites 06.11.2015 20:43

А я и не понимаю, как получить мне новую координату и ширину в следующей функции?

Код AS1/AS2:

var x_ = 320;
var y_ = 0;
var new_width = stage.stageWidth - 320;
stage.addEventListener(Event.RESIZE, resizeHandler);
function resizeHandler(event:Event):void {
 if (stage.stageWidth == '800') {
        x_ = 320;
        new_width = stage.stageWidth - 320;
 } else {
        x_ = 0;
        new_width = stage.stageWidth;
 }
}
 
 
 
function completeLoadImage(event:Event):void
{
 
containerImages_mc.removeChildAt(0);
var bitmapData:BitmapData = event.target.loader.content.bitmapData as BitmapData;
var bitmap:Bitmap = new Bitmap(bitmapData);
containerImages_mc.addChildAt(bitmap, 0);
 
 
var w= bitmap.width;
var h= bitmap.height;
var ar= w / h;       
var new_h = new_w / ar;
 
containerImages_mc.x = x_; // вот тут получить координату
containerImages_mc.y = y_;
var new_w = new_width; // вот тут получить новую ширину
 
containerImages_mc.width = new_w;
containerImages_mc.height = new_h;
var bitmapW:Number = bitmap.width;
var bitmapH:Number = bitmap.height;
 
bitmap.width = Math.floor(bitmapW);
bitmap.height = Math.floor(bitmapH);
}


Psycho Tiger 06.11.2015 20:46

Цитата:

Сообщение от ZackMercury (Сообщение 1188732)
Ну что ж вы, сир, не вдумываетесь, временами, в столь простые вещи?
Неужто вы хотите полагать, что код, за телом функции линейно следующий лишь выполнится не сразу, а после окончания загрузки?
В таком бы случае, зачем там нужна функция вообще? По вашей логике, там было проще прописать загрузку, а ассет на строке чуть ниже стал уже б загружен.
Нет, здесь, внимание, такое есть понятие, как асинхронность. Сиё, извольте объяснить, означает, что слушаем мы "onComplete" событие лишь для того, чтобы поймать то место, самое то место, где ассет наш уже загружен, а всё, что далее идёт за функцией начинает выполняться в тот же миг, как начинается загрузка.

Извольте иной раз, прежде, чем язык винить - представить, будто вы не понимаете чего-то, и почитать примеры и разъяснения из справки и других полезных книжек.

Что-то у меня от таких формулировок затошнило.

Для меня, кстати, совсем не просто и далеко не логично, почему я не могу загружать что-то синхронно. Да, даже в одном потоке. Да, нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронные.

udaaff 06.11.2015 20:59

Цитата:

А я и не понимаю, как получить мне новую координату и ширину в следующей функции?
Сделайте одну функцию отвечающую за масштабирование изображения, если оно загружено.
Код AS3:

function update(newWidth:Number, newHeight:Number):void
{
    if (!myImage)
        return;
    // здесь изменяем размеры
}

Изменился размер - вызвали update(), есть уже у нас изображения - ок, меняем размер, нет - ничего не происходит.
Загрузилось изображение - вызвали update(stage.stageWidth, stage.stageHeight), выставили текущие размеры сцены.

ZackMercury 06.11.2015 21:00

exsites, друг мой, успокойтесь вы, расслабьтесь, отдохните.
Существуют в мире программирования глобальные - общие, и локальные переменные.
Работающая программа на коем-то ни было языке - это совокупность глобальных переменных(классов с переменными), кои изменяются по всяким событиям, на которые мы добавим слушатель.
Представьте себе это, как таймлайн, на котором одно за другим по очереди всплывают какие-то события, и код ваш обрабатывает их, тот, который внутри обработчиков(функций).
https://pp.vk.me/c625826/v625826630/...L8yEj7A-hY.jpg

exsites 06.11.2015 21:20

Цитата:

Сообщение от Psycho Tiger (Сообщение 1188734)
Да, нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронные.

Вот как-то я об этом же.

Цитата:

Сообщение от udaaff (Сообщение 1188735)
Сделайте одну функцию отвечающую за масштабирование изображения, если оно загружено.
Код AS3:

function update(newWidth:Number, newHeight:Number):void
{
    if (!myImage)
        return;
    // здесь изменяем размеры
}

Изменился размер - вызвали update(), есть уже у нас изображения - ок, меняем размер, нет - ничего не происходит.
Загрузилось изображение - вызвали update(stage.stageWidth, stage.stageHeight), выставили текущие размеры сцены.

Так опять же переменные получаются внутри функции, наружу-то их не вытащить... Как я передам их туда куда хочу..?



Цитата:

Сообщение от ZackMercury (Сообщение 1188736)
exsites, друг мой, успокойтесь вы, расслабьтесь, отдохните.
Существуют в мире программирования глобальные - общие, и локальные переменные.

Да спокоен я как стадо мамонтов:-)))
Глобальные переменные зло. Во всяком случае в php.

Меня интересует, могу ли я результат выполнения функции передать в другую функцию как я написал в предыдущем посте? Можно или нет? Или мне надо весь код заново переписывать ввиду того что надо по другому?

Zebestov 06.11.2015 21:28

Цитата:

Сообщение от Psycho Tiger (Сообщение 1188734)
нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронные

Но здесь-то не тот случай. Здесь имеется пользователь, которому надо что-то насвистывать, пока что-то грузится. Это же тебе не PHP, где все процессы и так фоновые и пользователю пабарабану, что весь код скрипта ждет, пока что-то куда-то загрузится, пользователь ждет конечного результата в той или иной форме, тупо втыкая в экран.

Кстати! Этот процесс тоже, выходит, асинхронный: пока ты крутишь перед носом пользователя фронтенд-прелоадер, где-то там в бэкенде скрипт синхронно для себя, но асинхронно для пользователя, пыхтит над результатом, которого этот самый пользователь ожидает.


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

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