Обозреватель

Observer

Показаны сообщения с ярлыком На заметку. Показать все сообщения
Показаны сообщения с ярлыком На заметку. Показать все сообщения

среда, 18 февраля 2009 г.

Оригинал. No Title flash.

Как отформатировать размер файла
Для этой задачи я взял пример кода из интернета и переписал под Action Script 3. Получился метод который всегда выводит размер файла 4 значным числом, будь то 1,234 или 1000 и приставку kb, Mb, и т.д.


private function formatSizeValue( size : Number) : String
{

//Эти переменные лучше всего вынести в константы и, как вы догадались, они равты колличеству байт.

var longPB : Number = 1024 * 1024 * 1024 * 1024 * 1024;
var longTB : Number = 1024 * 1024 * 1024 * 1024;
var longGB : Number = 1024 * 1024 * 1024;
var longMB : Number = 1024 * 1024;
var longKB : Number = 1024;

var byteSize : String;
var displayNumber : Number;

Дальше выбикаем величину, в которой будем показывать размер

if (size >= longPB)
{
displayNumber = size / longPB;
byteSize = "Pb";
}
else if (size >= longTB)
{
displayNumber = size / longTB;
byteSize = "Tb";
}
else if (size >= longGB)
{
displayNumber = size /longGB;
byteSize = "Gb";
}
else if (size >= longMB)
{
displayNumber = size /longMB;
byteSize = "Mb";
}
else if (size >= longKB)
{
displayNumber = size / longKB;
byteSize = "kb";
}
else
{
displayNumber = size;
byteSize = "bytes";
}

// А здесь попрошу обратить внимание на метод toPrecision(n : int), вот он и делает число n значным, с округлением. Подробнее - читайте хелп :)

return displayNumber.toPrecision(4).toString() + ' ' + byteSize;

}


Как обнаружить, что файл был удален, или перемещен
Столкнулся с проблемкой что пользователь, открыв окошко для выбора файлов, начинает там наводить порядок. И бывали случаи когда этот файл был уже добавлен в список претендентов на закачку. И естественно, нажав upload происходил креш приложения.
Для этого я написал след метод:


private var _fr : FileReference;

public function get size() : uint
{

// Если фал был удален, то обращение к полю size у FileReference будет выдавать ошибку. Вот тут я и воспользовался try/catch

try {
return _fr.size;
}
catch(error : Error) {
dispatchEvent(new Event('itemWasDeleted') );
isError = true;
return 0;
}
return _fr.size;
}


Как раскрасить элементы листа в зависимости от местоположения
На этот вопрос развелась бурная дискуссия в чате UAFPUG. Внутри itemRenderer я изобрел след. велосипед:


return List(owner).itemRendererToIndex(this) % 2 ? 0xCCCCCC : 0xFFFFFF;

Rostislav Siryk: Тут лист используется только как ссылка на метод получения индекса из провайдера.

Если делать так, чтобы всего лишь разукрасить фон под itemRenderer - то лучше применить стиль alternatingItemColors. Но если вам нужно будет разукрасить внутренние компоненты, или сдвинуть их, то этот метод оптимальный.


Как получить ответ от сервера
Для этого я подсмотрел рецепт у http://flexcookbook.ru/ а именно: этот пост.

В интернете довольно много примеров по тому, как использовать FileReference для отправки файла на сервер, но мало где поясняется, как же все-таки отследить дальнейшую судьбу файла. Ведь событие Event.COMPLETE возникает всего лишь при удачной отправке файла на сервер. Как узнать, удалось ли вашему серверному приложению корректно обработать файл. Есть еще очень хорошее событие DataEvent.UPLOAD_COMPLETE_DATA которое возникает, если сервер вернул какие-то данные.

Итак, на COMPLETE у меня высвечивается Processing... а на UPLOAD_COMPLETE_DATA я выставляю галочку, что файл зааплодился успешно, и запрашиваю к нему путь через веб сервис.

Ну и напосдедок скажу, что отвечу на любые вопросы в комментариях :)

четверг, 14 августа 2008 г.

Стандарты кодирования в AS3. //Полезно

Стандарты кодирования в AS3. Flash. Flex. AIR. Haxe.

Статья посвящена систематизации стиля кодирования AS3.

http://flash-santer.com/docs/Coding%20Standards.doc - документ, описывающий систему.

воскресенье, 9 марта 2008 г.

AS2 автоматическая сборка компонентов без Flash IDE, с помощью FlashDevelop //Инструкция

Оригинал.

Да-да стоят перед некоторыми и такие задачи :)

Итак, надо:
собрать swc, включающий swf компонента, catalog.xml, asi-файлы классов.

swf должен содержать клип, ассоциированный с классом компонента и все
графические ассеты в библиотеке.

здесь помогает swfmill - пишем xml собираем swf. ( :) предварительно
пришлось поразбирать несколько swf, компиленных во FLASH IDE чтоб
понять как писать xml)

<... редакция класса ... >

компилим mtasc - с инъекцией кода (проще говоря обновляем классы в ролике)

для генерации asi используем igen из тулзов flashdevelop'a
(оказывается asi это intrinsic :) )

пишем bat-файл (запускаем его как post-build команду), нечто вроде:

rem установка переменных

set tools="C:\Documents and Settings\ddns\Local Settings\Application
Data\FlashDevelop\Tools\"

rem вызываем igen

%tools%\igen\igen -clean src bin

rem переименовываем получившиеся *.as файлы в *.asi

for /R bin\ %%A in (*.as) do if exist %%A (
erase /q bin\%%~nA.asi // если такой файлик есть то стираем его.
rename %%A %%~nA.asi
)

erase bin\3d.swc

rem архивируем winrar'ом в zip

C:\Progra~1\winrar\winrar a -afzip bin\3d -r -ep1 -m5 -x*.bat -x*.exe bin\

rem изменяем расширение на *.swc
rename bin\3d.zip 3d.swc

rem :) опционально подкладываем файлик в папку компонентов флеша.

copy /Y /B bin\3d.swc "C:\Documents and Settings\ddns\Local
Settings\Application Data\Adobe\Flash
CS3\en\Configuration\Components\"

/////////////////////


Остается нерешенным вопрос, а как бы сгенерировать автоматически catalog.xml
для компонента?
Кто-нибудь что-нибудь посоветует?

xml вида:

<componentPackage xmlns="http://www.macromedia.com/flash/swccatalog/7">
<component id="myComponent" class="ComponentClass"
implementation="libc.swf" iconFile="libc.png"
src="Component3Dworks.asi" modified="1204586771">
<movieBounds xmin="0" xmax="11000" ymin="0" ymax="8000" />
<include id="boundingBox_mc"/>
<include id="activity"/>
<exportAfter id="__Packages.ComponentClass"/>
<class id="ComponentClass" >
</class>
<class id="MovieClip" >
</class>
<asset id="boundingBox_mc" modified="1204576209">
</asset>
<asset id="activity" modified="1204578626">
</asset>
<asset id="__Packages.ComponentClass" src="ComponentClass.asi"
modified="1204586020">
</asset>
</component>

вторник, 15 января 2008 г.

SmartFont //Класс загрузки внешних библиотек шрифтов

Оригинал. Блог одиноко стоящего игрока вспышки.

Над проблемой загрузки внешних библиотек шрифтов не трудился, наверное, только ленивый.
Вариантов решения проблемы много. Коммерческие, не коммерческие, рабочие, не рабочие, удобные и неудобные.
Вашему вниманию мой класс SmartFont.На сайте поддержки описаны все телодвижения, здесь же упомяну только общий ход использования:

var my_font:SmartFont = new SmartFont();
my_font.load(“someFont.swf”);
my_font.onLoad = function():Void {
trace(“Шрифт: “+this._font+” готов к использованию”);
}

понедельник, 14 января 2008 г.

ScrollRect vs setMask //Без комментариев.

Оргигнал. Блог одиноко стоящего игрока вспышки.

Если нужно применить к клипу прямоугольную маску, вместо MovieClip.setMask(mc:MovieClip) лучше воспользоваться свойством scrollRect (доступно от 8-й версии и выше).
Плюс в производительности на лицо. Более того - под такой “маской” не пропадают системные и не-внедренные шрифты.
Использование предельно просто:

import flash.geom.Rectangle;
var maskRect:Rectangle = new Rectangle(x,y,width,height);
my_mc.scrollRect = maskRect;

С такой “маской” удобно делать также и скроллеры (собственно название выдает). Достаточно поменять значение x, y для Rectangle, и визуально мы видим смещение контента мувиКлипа.

Прелоадер для ‘img’ //Управление изображениями, подгружаемыми в Textfield

Оригинал. Блог одиноко стоящего игрока вспышки.

TextField - субстанция крайне интересная, взбаломошная и мистическая.Обуздание оной подчас превращается в подвиг Геракла.Несколько статей о TеxtField я обязательно размещу на страницах этого блога.
Многие знают, что в текстовое поле с подключенным html можно грузить картинки и флешки, а также вставлять символы из библиотеки.Но вот вопрос - а можно ли взаимодействовать с этими объектами? Например возможен ли прелоадер?ДА и очень просто. Фактически тег img создает внутри тексатового поля новый MovieClip. Если в html-коде прописан id для IMG, то будет создан клип именно с таким instance name. И обращаться к этому клипу можно через текстовое поле. К примеру если в текстовое поле my_txt внедряется картинка

[img src="http://murejib.wordpress.com/wp-admin/someIMG" id="img" /]

То мы можем обратиться к ней my_txt.img
Но что если у нас есть html-текст с img без id, и таких картинок много, а нам необходимо сделать скроллер для текстового поля. Пока картинки не загружены мы с большой долей вероятности получим неверную высоту поля.Есть простой способ - нам нужно просто завести массив для учета встроенных картинок

var htmlIMG:Array = [];

И пройтись по текстовому полю циклом for…in, помня, что картинки - это объекты типа MovieClip.

for (var mc in my_txt) {
if (typeof(my_txt[mc]) == “movieclip”) {
trace (”found IMG: “+my_txt[mc]);
htmlIMG.push(my_txt[mc])
}
}

Теперь у нас есть массив, в которые занесены ссылки на все клипы.А дальше - прелоадер должен собрать все загруженные байты этих клипов и все тотальные байты этих же клипов. Суммируем, делим, получаем процент. По завершению загрузки - проверяем высоту поля, и приделываем наш бесценный скроллер.

expRandom. //Управление распределением вероятности

Оригинал. Блог одиноко стоящего игрока вспышки.

Иногда бывает нужно, чтобы случайное число с большей вероятностью выпадало ближе к минимальным, или максимальным значениям.
Простой пример - Слот машина.Бонусные символы должны выпадать гораздо реже обычных символов.Существует масса способов реализовать такой рандом, о них, к примеру была речь на форуме flash-mx
Более того мне необходимо, что бы числа возвращались в жестко заданном диапазоне.Немного мозгового скрипа дало мне вот такую функцию.

function expoRandom(range:Number,w:Number):Number {
w = Math.max(w,1);
w = Math.min(w,709);
return Math.log(1+Math.random()*(Math.exp(w)-1))*(range/w);
}

В функцию передается два параметра - собственно диапазон, и, не знаю как это правильно обозвать, степень разброса. От это степени зависит насколько сильно выпадающие значения будут тесниться к максимальному краю. Чем больше степень, тем ближе к краю.
В функцию вставлена небольшая проверка - чтобы ширина не была меньше 1 (в этом случае мы получим обычный рандом) и не была больше 709 (в этом случае выражение Math.exp(w) даст нам infinity). Их собсвенно можно убрать, дабы не забивать процессор лишней работой.
Вся магия тут завязана на простой принцип - есть график логарифма. Мы берем случайное число по оси X и находим его логарифм по оси Y. Немного корректируем под наш диапазон - и результат на лице.

Вот к примеру такой:http://bbexp.ru/blog/_stuff/random.html

Анимация статичного растра. Имитация 3D. //Анимационный прием

Оригинал. Блог одиноко стоящего игрока вспышки.

Если у нас есть кусок растра, который во чтобы то ни стало надо как то анимировать - можно воспользоваться увлекательной нарезкой персонажа на куски )Принцип метода достаточно прост.
Имея представление о рельефе анимируемой фигуры, разбиваем растр на несколько клипов, фигурно отсекая лишние части на каждом уровне. Очень неплохо таким способом можно анимировать лица, морды, руки и т.д.
Первый пример наглядно иллюстрирует суть метода.

Смотреть

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