Совместная разработка пакета классов
Привет. Предлагаю новую "игру" для флешеров. Создать набор классов (некоторые могут ошибочно назвать это фреймворком) для упрощения решения повседневных задач начинающих и ленивых программистов, коих наверное большинство.
Что это за набор? Суть очень проста. Одна задача - один класс. Никаких зависимостей от других не "нативных" классов. Пихать internal класс внутрь допускается.
Какие могут быть задачи? Для этого нужно вспомнить рабочий опыт и на его основе придумать, чем помочь этому набору классов.
Класс можно оставлять в комментариях, с указанием зачем это нужно. И после бурного обсуждения, что всё как всегда криво и косо, совместным решением утверждать его.
Вот примеры классов, для тех кто хочет попробовать свои силы:
Call - задержанный вызов функций.
Call.nextFrame(func, ...args) //Вызываем функцию func передавая ей параметры args Call.forget(func) //Отменить вызов функции
Music - работа со звуком.
Music.playSound("http://domain.com/sound.mp3").volume(56); //Фоновая музыка - только один поток Music.playUI(ClickSound) //Проигрывание кнопочек
* Простое изменение громкости и пана.
* Проигрывание звуков кнопочек, менюшечек.
* Отлов ошибок связанных с отсутствием правильно настроенного звука на компьютере
Tween -Старый добрый твин c использованием Proxy.
*Использование прокси для создания записи в одну строку для заранее неизвестных твинируемых параметрах
ColorFilter -Простой в использовании ColorMatrixFilter.
WebLoader -Упрощённая загрузка всего чего можно.
*Не загружать повторно картинку по тому же пути, в таком случае возвращать копию контента (например, чтобы добавлять на сцену много экземпляров)
*функции bitmap(path:String, handler:Function = null):WebLoader, crossBitmap - в обход кроссдомена, xml, text, b т.д.
* Если указана функция handler - выдавать результат конечного типа в неё. Иначе пытаться добавить визуальный объект внутрь контейнера.
Server -взаимодействие с сервером через http.
*Рассмотреть различные варианты типизации данных
MixFilter -Удобный инструмент для микширования фильтров (когда на объект нужно накладывать динамически больше одного фильтра).
ObjectEvent - Класс события с кастомным полем data:*, через статические методы можно подписываться на события, отписываться от всех разом, и т.д.
ObjectEvent.addEventListener(this, MouseEvent.CLICK, onClick); ObjectEvent.removeAllListeners(this); ObjectEvent.bubble(this,"complete") //Всплывающее событие (plain - обычное)
Не бойтесь пробовать делать, если Вы только учитесь AS3. Для Вас это хорошая практика. А если уж совсем никак, поделитесь идеей, чего не хватает.
Думаю будет очень востребованным набором, если найдутся желающие помочь =)
Всего комментариев 46
Комментарии
16.04.2012 21:19 | |
Не понятно зачем)
Каждая предложенная задача имеет уже кучи решений. |
16.04.2012 21:43 | |
>> Call - задержанный вызов функций.
Я бы такие штуки раскидал по коммандам, получает удобнее. А для вызовы методов я обычно юзаю твинлайт там есть delayedCall. |
16.04.2012 21:59 | |
Цитата:
ObjectEvent
|
16.04.2012 23:46 | |
Всё равно будем драться за велосипеды.
|
17.04.2012 00:40 | |
Цитата:
Call - задержанный вызов функций.
Цитата:
Music - работа со звуком.
Цитата:
Tween -Старый добрый твин c использованием Proxy.
Цитата:
WebLoader -Упрощённая загрузка всего чего можно.
Остальное совсем уж кастомное. |
17.04.2012 10:02 | |
fljot А в чем проблема? getTimer для чего?
|
17.04.2012 14:59 | |
проблемы нет, подкидваю полезности скучающим
|
18.04.2012 11:48 | |
Цитата:
static public function getLoaders(path:String = ''):Array - загрузчик должен быть один для одного пути. Методы getLoaders, removeLoader, allLoaders, removeLoaders - по сути не используются в реальной практике.
Без этих функций тебе бы пришлось проходить по всему массиву с поиском этого лоадера. Эта функция возвращает все лоадеры с указанным путем. |
|
Обновил(-а) MikroAcse 18.04.2012 в 12:28
|
18.04.2012 13:19 | |
Цитата:
надо хранить лоадеры в объекте, а в качестве ключа использовать url
Цитата:
зачем много лоадеров на 1 url?
|
21.04.2012 15:16 | |
С пивком потянет ))
package com.in4core.navigation { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.errors.IllegalOperationError; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.text.TextField; /** * ... * @author in4core * Display or Text Object Scroller * use addScroll methods to define Scroller * Version 1.0 */ public final class UIScrollBar { //-----------------DisplayObjectInit-----------// /*objects*/ private var _scroll:Sprite; private var _mask:DisplayObject; private var _content:DisplayObject; private var _rect:Rectangle; /*coords*/ private var _startYScroll:int; private var _startYContent:int; private var _wayOfScroll:int; //-----------------TextFieldInit-----------// /*objects*/ private var _tscroll:Sprite; private var _tf:TextField; private var _trect:Rectangle; /*coords*/ private var _wayOfTextScroll:int; ///////////////////////////////////////////////////////////////////// //!4 //! 4 PUBLIC //! 4 ///////////////////////////////////////////////////////////////////// public function addScrollObject( scroll:Sprite,mask:DisplayObject,content:DisplayObject,way:int ):void { this._scroll = scroll; this._mask = mask; this._content = content; this._wayOfScroll = way; this._startYScroll = _scroll.y; this._startYContent = _content.y; this._rect = new Rectangle(_scroll.x, _scroll.y, 0, _wayOfScroll); /*events*/ _scroll.addEventListener(Event.ADDED_TO_STAGE , onScrollAdded); } private function onScrollAdded(e:Event) { _scroll.removeEventListener(Event.ADDED_TO_STAGE , onScrollAdded); _scroll.addEventListener(MouseEvent.MOUSE_DOWN, dragStart); _scroll.stage.addEventListener(MouseEvent.MOUSE_UP, dragStop); trace( 'UIScrollBar-Display : INIT' ); } public function addScrollText( tf:TextField , scroll:Sprite , way:int ):void { this._tscroll = scroll; this._tf = tf; this._wayOfTextScroll = way; this._trect = new Rectangle(_tscroll.x, _tscroll.y, 0, _wayOfTextScroll); /*events*/ _tscroll.addEventListener(Event.ADDED_TO_STAGE , onTScrollAdded); } private function onTScrollAdded(e:Event) { _tscroll.removeEventListener(Event.ADDED_TO_STAGE , onScrollAdded); _tscroll.addEventListener(MouseEvent.MOUSE_DOWN , tdragStart); _tscroll.stage.addEventListener(MouseEvent.MOUSE_UP , tdragStop); trace( 'UIScrollBar-Text : INIT' ); } public function destroy():void { if (_scroll != null ) { _scroll.stage.removeEventListener(MouseEvent.MOUSE_MOVE, updatePosition); _scroll.removeEventListener(MouseEvent.MOUSE_DOWN, dragStart); _scroll.stage.removeEventListener(MouseEvent.MOUSE_UP, dragStop); } if (_tscroll != null ) { _tscroll.removeEventListener(MouseEvent.MOUSE_DOWN , tdragStart); _tscroll.stage.removeEventListener(MouseEvent.MOUSE_UP , tdragStop); _tscroll.stage.removeEventListener(MouseEvent.MOUSE_MOVE ,updateTextPosition); } trace( 'UIScrollBar : REMOVED' ); } ///////////////////////////////////////////////////////////////////// //!4 //! 4 PRIVATE //! 4 ///////////////////////////////////////////////////////////////////// private function tdragStart(e:MouseEvent):void { _tscroll.startDrag(false, _trect); _tscroll.stage.addEventListener(MouseEvent.MOUSE_MOVE ,updateTextPosition); } private function tdragStop(e:MouseEvent):void { _tscroll.stopDrag(); _tscroll.stage.removeEventListener(MouseEvent.MOUSE_MOVE ,updateTextPosition); } private function dragStart(e:MouseEvent):void { _scroll.startDrag(false, _rect); _scroll.stage.addEventListener(MouseEvent.MOUSE_MOVE, updatePosition); } private function dragStop(e:MouseEvent):void { _scroll.stopDrag(); _scroll.stage.removeEventListener(MouseEvent.MOUSE_MOVE, updatePosition); } private function updatePosition (e:MouseEvent):void { if (_mask.height < _content.height) { _scroll.mouseEnabled = true; _content.y = _startYContent - ( (_content.height - _mask.height) / _wayOfScroll ) * ( _scroll.y - _startYScroll ); } else _scroll.mouseEnabled = false; updateVisible(); } private function updateTextPosition(e:MouseEvent):void { _tf.scrollV = Math.round(((_tscroll.y - _trect.y) / _wayOfTextScroll ) * _tf.maxScrollV); } private function updateVisible():void { if (_mask.height < _content.height) _scroll.visible = true; else _scroll.visible = false; } } } |
|
Обновил(-а) in4core 21.04.2012 в 15:22
|
21.04.2012 16:03 | |
in4core Круто! Возьму на заметку.
|
25.04.2012 05:14 | |
могу предложить в копилку вот такое решение, я его уже публиковал здесь
http://www.flasher.ru/forum/showpost...7&postcount=12 Функция в пакет обработки строк задается строка(со спец форматом) и объект. Под форматом указывается test string %var_name% la la la la %var_name2% Если в объекте есть поля с именами var_name и var_name2, то вернется строка в которой %var_name%, %var_name2% будут заменены на значения из объекта |
25.04.2012 20:51 | |
Завёл сайтик - туда буду выкладывать файлики с классами. http://atflash.ru/simplify/
|
26.04.2012 11:59 | |
Цитата:
Завёл сайтик
|
26.04.2012 12:16 | |
Цитата:
Может всё-таки bitbucket или github?
|
26.04.2012 20:07 | |
Цитата:
Может всё-таки bitbucket или github?
|
27.04.2012 10:24 | |
Цитата:
Это для серъёзных проектов
|
27.04.2012 14:11 | |
Завёл проект на GitHub https://github.com/rzer/simplify
|
28.04.2012 10:53 | |
Отсебятина приветствуется? Или надо только писать под задачи, перечисленные в посте?
|
29.04.2012 03:00 | |
Потихоньку выкладываю файлы на http://atflash.ru/simplify/
Очень хочется услышать мнение о полезности классов от начинающих программистов. |
30.04.2012 01:23 | |
В классе Call onEnterFrame вызывается всегда, не зависимо от того, нужен или нет вызов.
В моем велосипеде слушатель добавляется только по требованию. |
02.05.2012 21:50 | |
illuzor, идея отличная. Мне, как любителю масок скругляющих на картинках углы, это бы очень пригодилось.
|
04.05.2012 01:53 | |
MikroAcse ну и зачем все это надо? Редко когда тербуется фабрика ректов и т.п. В каждом отдльеном проекте достаточно своей фабрики под определенные нужды.
Универсальность убивает... все это не нужно по факту. Мульти лоадеры уже есть, скроллеры есть, все уже есть, и новые реализации вряд ли будут лучше старых. Rzer вот опять к вам. Зачем по факту нужен Call в 90% проектов ? Вы его используете сами вообще? Из того, что действительно может понадобится ВСЕМ, это логгер например ( онлайн дебаггер во флеше) . Апгрейдированный скроллер ( блюр при прокрутке, движение с задержкой ) . Хотя данная тема скорее больше подходит не для *классы для новичков* , а скорее примеры классов, как можно написать реализацию, тоесть новички смотрят и разбираются ( но для этого нужна хорошая документация, например ASdoc ) .... |
|
Обновил(-а) in4core 04.05.2012 в 02:02
|
04.05.2012 13:58 | |
in4core, без реализации задержанных вызовов не обходится ни один мой проект. Попробуй его использовать и поймёшь, как это удобно. Про старое молчу, в нашем автопроме, наверное, придерживаются твоей точки зрения. Нужно ориентироваться на старые удачные реализации, завоевавшие популярность - это да.
Документация очень полезна, спору нет. Но тут есть одно но: все предложенные классы используют минимум функциональности - посмотрев пример из комментария класса становится понятно, как его использовать. Я не претендую на лучшую реализацию функционала заточенную под определённые задачи. Мне не удобно использовать половину чужих разработок. Это как минимум снижает понимание того, что происходит у тебя в коде. Как максимум заставляет меня задуматься, что не такой я уж и хороший программист, если не могу реализовать такие вот небольшие функции, которыми пользуюсь. Понятно, что 3d или физический движок я скорее возьму готовый, так как не разбираюсь во всех тонкостях оптимизации этих сложных процессов. Например почему JavaScript+HTML набирает такую популярность? По моему мнению, это происходит от того, что там есть такие наборы, как jquery, bootstrap и прочие - сводят 90% всех задач к одной строчке кода, и с подключением одного, двух фреймворков. Для сравнения, возьмём Flex. Сколько нужно знать правил и тонкостей, чтобы добавить на стандартную кнопку свою картинку? Программирование должно быть лёгким и решать стандартные задачи быстро, а не заставлять программиста каждый раз вспоминать школьные уроки Черепашки для рисования. |
|
Обновил(-а) Rzer 04.05.2012 в 14:08
|
04.05.2012 15:10 | |
Цитата:
без реализации задержанных вызовов не обходится ни один мой проект
Кроме того, раз уж показываете новичкам, то давайте осмысленные имена методам. Что такое nextFrame ? следюущий кадр? И причем тут задержанные вызовы? Что такое afterForget - после забытый ? чего чего ? .... Что такое forget - забыть ? Что забыть ? Зачем забыть ? ( addMethod , removeMethod - звучат понятнее всем ) Далее почему Call extends Sprite ? Зачем утилитному классу быть наследником спрайта? ... приплыли... Если уж нужен так интер фрейм ( хотя подписать на таймер разница не вилика, то создайте приватный спрайт и вешайте на него что хотите, скажу вам по секрету addChild для него делать не надо, чтобы интефрейм работал |
|
Обновил(-а) in4core 04.05.2012 в 15:30
|
04.05.2012 15:46 | |
Call (in) next frame - вызовите в следующем кадре. Call after - вызовите через.. addMethod , removeMethod - не несут смысловой нагрузки.
Так и не надо добавлять добавлять Call на сцену. Это такой хитрый приём инициализации статического класса. Можно написать и как в Tween.as через метод, если так более понятно. Пример: У класса есть публичный метод который добавляет строчку наверх, при этом нужно сдвинуть строчки вниз. Строчек из вне добавляется много в произвольные моменты времени, метод движения тяжёлый. И чтобы минимизировать количество вызовов последнего применяю задержанный вызов. Или другой пример: отправил запрос на сервер. Создал задержанный вызов, что если через 5 секунд ответ не пришёл, то выпонить другой код. Ответ пришёл раньше - отписался от метода. settimeout - это конечно хорошо, но вот тебе придётся запоминать идентификатор, который был возвращён. Следить за тем подписался ты или нет. Открываем документацию: Код:
Instead of using this method, consider creating a Timer object, with the specified interval, using 1 as the repeatCount parameter (which sets the timer to run only once). |
|
Обновил(-а) Rzer 04.05.2012 в 16:02
|
04.05.2012 16:02 | |
04.05.2012 16:04 | |
Дополнил предыдущий пост.
|
04.05.2012 17:07 | |
04.05.2012 17:36 | |
Не буду с тобой спорить. Скажу лишь, что таких частных случаев в реальном проекте набралось аж 252. Про пример с сервером - так, например, делает наш любимый вконтакте.
|
|
Обновил(-а) Rzer 04.05.2012 в 17:39
|
16.05.2012 15:20 | |
Хм... Большая часть примеров решается TweenMax, BulkLoader.
От себя могу дать три простых, но полезных класса(они с описанием в моем блоге) Есть еще очень полезная вещь которой постоянно пользуюсь printf, класс для форматирования строк. Довольно удобно. |
18.05.2012 15:37 | |
Предлагаю свою небольшую наработку для быстроты форматирования текстовых полей и строк.
Сама утилитка: package com.delger.utils { import flash.text.TextField; import flash.text.TextFormat; /** * Text format generation utility * * @author Pascal Delger */ public class TextUtil { /** * Generates HTML string using function parameters */ public static function HTMLString(text:String, bold:Boolean, fontColor:String=undefined, fontSize:uint=undefined, fontFace:String=""):String{ var str:String = ""; if (bold) str += "<b>"; if (fontSize||fontColor||fontFace){ str += "<font"; if (fontFace) str += " face='"+fontFace+"'"; if (fontSize) str += " size='"+fontSize+"'"; if (fontColor) str += " color='#"+fontColor+"'"; str += ">"; } str += text; if (fontSize||fontColor||fontFace) str += "</font>"; if (bold=="true") str += "</b>"; return str; } /** * * Applying your custom text format * * @param field Text field to format * @param format CustomTextFormat objects which describes format parameters */ public static function applyFormat(field:TextField, format:CustomTextFormat):void{ var tf:TextFormat = new TextFormat; if (format.font) tf.font = format.font; if (format.align) tf.align = format.align; if (format.bold) tf.bold = true; if (format.size) tf.size = format.size; if (format.color) tf.color = Number("0x"+format.color); field.defaultTextFormat = tf; if (format.bgColor){ field.background = true; field.backgroundColor = Number("0x"+format.bgColor); } if (format.borderColor){ field.border = true; field.borderColor = Number("0x"+format.borderColor); } field.selectable = format.selectable; } /** * * Generates HTML string using CustomTextFormat object * * @param str String to format * @param format CustomTextFormat objects which describes format parameters */ public static function formatedString(str:String, format:CustomTextFormat):String { var resultStr:String = HTMLString(str, format.bold, format.color, format.size, format.font); return resultStr; } } } package com.delger.utils { /** * Class which describes format parameters * * @author Pascal Delger */ public class CustomTextFormat { public var font:String; public var align:String; public var color:String; public var size:uint; public var bold:Boolean; public var bgColor:String; public var borderColor:String; public var selectable:Boolean; } } |
|
Обновил(-а) pas.delger 18.05.2012 в 16:08
|
Последние записи от Rzer
- Радиальный прогресс бар для Starling 2 (01.07.2016)
- Приложения для изучающих AS3 (21.12.2014)
- Математика игр. Часть 1. (10.07.2014)
- Подключаем SWC как внешнюю библиотеку. (07.07.2014)
- Обновился набор классов simplify as3 (20.11.2012)