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

Вернуться   Форум Flasher.ru > Блоги > Rzer

Оценить эту запись

Совместная разработка пакета классов

Запись от Rzer размещена 16.04.2012 в 21:07
Обновил(-а) Котяра 16.04.2012 в 21:20

Привет. Предлагаю новую "игру" для флешеров. Создать набор классов (некоторые могут ошибочно назвать это фреймворком) для упрощения решения повседневных задач начинающих и ленивых программистов, коих наверное большинство.

Что это за набор? Суть очень проста. Одна задача - один класс. Никаких зависимостей от других не "нативных" классов. Пихать internal класс внутрь допускается.

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

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

Вот примеры классов, для тех кто хочет попробовать свои силы:

Call - задержанный вызов функций.
Код AS3:
Call.nextFrame(func, ...args) //Вызываем функцию func передавая ей параметры args
Call.forget(func) //Отменить вызов функции
*Учесть, что в задерживаемой функции, также может быть задержанный вызов, который не должен обработаться в ту же итерацию

Music - работа со звуком.
Код AS3:
Music.playSound("http://domain.com/sound.mp3").volume(56); //Фоновая музыка - только один поток
Music.playUI(ClickSound) //Проигрывание кнопочек
*Запуск и остановка музыки с заплавлением громкости.
* Простое изменение громкости и пана.
* Проигрывание звуков кнопочек, менюшечек.
* Отлов ошибок связанных с отсутствием правильно настроенного звука на компьютере

Tween -Старый добрый твин c использованием Proxy.
Код AS3:
Tween.bounce(this, time, onTweenComplete).x(100).easeFunctionArgument(from, to);
*Использование прокси для создания записи в одну строку для заранее неизвестных твинируемых параметрах

ColorFilter -Простой в использовании ColorMatrixFilter.
Код AS3:
this.filters = [ColorFilter.hue(180).alpha(0.5).tint(0.5, 0xffffff)];
WebLoader -Упрощённая загрузка всего чего можно.
Код AS3:
addChild(WebLoader.crossBitmap("http://vk.com/empty.png").center(100,200);
*Не загружать повторно картинку по тому же пути, в таком случае возвращать копию контента (например, чтобы добавлять на сцену много экземпляров)
*функции bitmap(path:String, handler:Function = null):WebLoader, crossBitmap - в обход кроссдомена, xml, text, b т.д.
* Если указана функция handler - выдавать результат конечного типа в неё. Иначе пытаться добавить визуальный объект внутрь контейнера.

Server -взаимодействие с сервером через http.
Код AS3:
Server.json(data:*, path, handler)
*Рассмотреть различные варианты типизации данных

MixFilter -Удобный инструмент для микширования фильтров (когда на объект нужно накладывать динамически больше одного фильтра).
Код AS3:
MixFilter.add(this, "highlightarget", filter);
MixFilter.remove(this, "highlightarget");

ObjectEvent - Класс события с кастомным полем data:*, через статические методы можно подписываться на события, отписываться от всех разом, и т.д.
Код AS3:
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 nOobCrafter вне форума
nOobCrafter
>> Call - задержанный вызов функций.
Я бы такие штуки раскидал по коммандам, получает удобнее. А для вызовы методов я обычно юзаю твинлайт там есть delayedCall.
Старый 16.04.2012 21:59 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
Цитата:
ObjectEvent
Подобное приходилось делать, думаю далеко не мне одному.
Старый 16.04.2012 22:31 Rzer вне форума
Rzer
 
Аватар для Rzer
Цитата:
Не понятно зачем)
Многие, кто начинает изучать flash жалуются, на то, что он через чур сложный для pure кодинга. Качать, например, твин лайт для того, чтобы реализовать задержанный вызов не тривиально и тянет за собой кучу лишнего.

Пример номер два: в проектах, где я не использую свои наработки, например, при уничтожении объектов наблюдаются утечки. Уж очень не люблю сразу писать все removeEventListener, а потом попросту забываю.

На текущей стадии развития, я пришёл к выводу, что такой функционал позволяет существенно ускорять разработку и даёт время, чтобы сосредоточится на деталях, а не писать каждый раз soundTransform = new SoundTransform(...) - не забывая о том, что просто изменить свойство уже присвоенного соундтрансформа не даст никакого результата.
Старый 16.04.2012 23:05 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
WebLoader
В моей библиотеке есть ULoad и Ready.
Ready - для загрузки изображений.
Вызов:
Код AS3:
Ready.load(path:String) // path - путь к изображению
Дополнительные функции:
Код AS3:
static public function get allLoaders():Array // возвращает массив всех загрузок.
Код AS3:
static public function getLoaders(path:String = ''):Array // возвращает массив загрузок с одинаковым путем к изображению.
Код AS3:
static public function removeLoaders(path:String = '', unloadBefore:Boolean = false):void // удаляет все загрузки с одинаковым путем к изображению. Если unloadBefore равен true, то все загрузки выгружаются.
Код AS3:
static public function removeLoader(loader:Loader, unloadBefore:Boolean = false):void // удаляет данную загрузку. Если unloadBefore равен true, то загрузка выгружается.
ULoad - для загрузки и отправки данных.
Вызов:
Код AS3:
ULoad.load(url:String, parameters:Object) // url = путь, parameters = параметры загрузчика (dataFormat, contentType, data, digest, method, requestHeaders)
Дополнительные функции:
Код AS3:
static public function get allLoaders():Array // возвращает массив всех загрузок.
Код AS3:
static public function getLoaders(url:String = ''):Array // возвращает массив загрузок с одинаковым путем.
Код AS3:
static public function removeLoaders(path:String = '', unloadBefore:Boolean = false):void // удаляет все загрузки с одинаковым путем. Если closeBefore равен true, то все загрузки останавливаются.
Код AS3:
static public function removeLoader(loader:Loader, unloadBefore:Boolean = false):void // удаляет данную загрузку. Если closeBefore равен true, то загрузка останавливается.
Старый 16.04.2012 23:14 Rzer вне форума
Rzer
 
Аватар для Rzer
static public function getLoaders(path:String = ''):Array - загрузчик должен быть один для одного пути. Методы getLoaders, removeLoader, allLoaders, removeLoaders - по сути не используются в реальной практике.

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

Как в твоём коде выглядел бы код загрузки изображения на сцену?
Старый 16.04.2012 23:46 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Всё равно будем драться за велосипеды.
Старый 17.04.2012 00:40 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Call - задержанный вызов функций.
as3-commons-async

Цитата:
Music - работа со звуком.
Хватает и стандартов. Если надо больше у scmorr
Цитата:
Tween -Старый добрый твин c использованием Proxy.
Твинов хоть свиней корми. Твои требования какие-то странные. Мне нравится ease
Цитата:
WebLoader -Упрощённая загрузка всего чего можно.
Я сам разрабатывал недавно собственный универсальный лоадер, но дело в том, что они все проектно зависимы. Ну и много их.

Остальное совсем уж кастомное.
Старый 17.04.2012 01:20 fljot вне форума
fljot
@Rzer @MikroAcse (я так полагаю последнему скучно?) вот, можете найти недочёты и добавить поддержку задержки по миллисекундам (callback:Function, delay:uint, useFrames:Boolean = true, ...args)

Код AS3:
package com.inreflected.utils 
{
	import flash.events.EventDispatcher;
	import flash.events.Event;
	import flash.display.Shape;
 
	[Event(name="complete", type="flash.events.Event")]
	[Event(name="cancel", type="flash.events.Event")]
	/**
	 * @author Pavel fljot
	 */
	public class FrameDelay extends EventDispatcher
	{
		private static const dispatcher:Shape = new Shape();
		private static var queue:Array/* of FrameDelay*/ = [];
		private static var queueLength:uint = 0;
 
		private var callback:Function;
		private var frameCount:uint;
		private var args:Array;
 
 
		public function FrameDelay(callback:Function = null, frameCount:uint = 1, args:Array = null)
		{
			this.callback = callback;
			this.frameCount = frameCount;
			this.args = args ? args.concat() : null;
 
			queueLength = queue.unshift(this);
 
			dispatcher.addEventListener(Event.ENTER_FRAME, callLaterDispatcher_enterFrameHandler);
		}
 
 
		public static function add(callback:Function, frameCount:uint = 1, ...args):FrameDelay
		{
			return new FrameDelay(callback, frameCount, args);
		}
 
 
		public function cancel():void
		{
			var i:int = queue.indexOf(this);
			if (i > -1)
			{
				queue.splice(i, 1);
				queueLength--;
			}
 
			if (hasEventListener(Event.CANCEL))
			{
				dispatchEvent(new Event(Event.CANCEL));
			}
		}
 
 
		private static function callLaterDispatcher_enterFrameHandler(event:Event):void
		{
			var frameDelay:FrameDelay;
			var i:uint = queueLength;
			while (i-- > 0)
			{
				frameDelay = queue[i] as FrameDelay;
				if (--frameDelay.frameCount == 0)
				{
					queue.splice(i, 1);
					queueLength--;
					if (frameDelay.callback != null)
					{
						if (frameDelay.args == null)
						{
							frameDelay.callback();
						}
						else
						{
							frameDelay.callback.apply(null, frameDelay.args);
						}
					}
 
					if (frameDelay.hasEventListener(Event.COMPLETE))
					{
						frameDelay.dispatchEvent(new Event(Event.COMPLETE));
					}
				}
			}
 
			if (queueLength == 0)
			{
				dispatcher.removeEventListener(Event.ENTER_FRAME, callLaterDispatcher_enterFrameHandler);
			}
		}
	}
}
Старый 17.04.2012 10:02 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
fljot А в чем проблема? getTimer для чего?
Старый 17.04.2012 14:59 fljot вне форума
fljot
проблемы нет, подкидваю полезности скучающим
Старый 18.04.2012 11:48 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
static public function getLoaders(path:String = ''):Array - загрузчик должен быть один для одного пути. Методы getLoaders, removeLoader, allLoaders, removeLoaders - по сути не используются в реальной практике.
Почему? Например, ты хочешь удалить какой-то лоадер с определенным путем загрузки.
Без этих функций тебе бы пришлось проходить по всему массиву с поиском этого лоадера.
Эта функция возвращает все лоадеры с указанным путем.
Обновил(-а) MikroAcse 18.04.2012 в 12:28
Старый 18.04.2012 12:35 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Цитата:
Почему? Например, ты хочешь удалить какой-то лоадер с определенным путем загрузки.
Без этих функций тебе бы пришлось проходить по всему массиву с поиском этого лоадера.
надо хранить лоадеры в объекте, а в качестве ключа использовать url
Цитата:
Эта функция возвращает все лоадеры с указанным путем.
зачем много лоадеров на 1 url?
Старый 18.04.2012 13:19 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
надо хранить лоадеры в объекте, а в качестве ключа использовать url
Неплохо.
Цитата:
зачем много лоадеров на 1 url?
Ну, я это неочень еще пока продумал
Старый 21.04.2012 00:50 zuxul вне форума
zuxul
Думаю, такие велосипеды есть у многих:
Код AS3:
public static function play(mc:MovieClip):void {
	mc.play();
	var len:int = mc.numChildren;
	for (var i:int = 0; i < len; i++) {
		var obj:DisplayObject = mc.getChildAt(i);
		if (obj is MovieClip) {
			play(MovieClip(obj));
		}
	}
}
 
public static function gotoAndPlay(mc:MovieClip, frame:int):void {
	mc.gotoAndPlay((frame - 1) % mc.totalFrames + 1);
	var len:int = mc.numChildren;
	for (var i:int = 0; i < len; i++) {
		var obj:DisplayObject = mc.getChildAt(i);
		if (obj is MovieClip) {
			gotoAndPlay(MovieClip(obj), frame);
		}
	}
}
 
public static function stop(mc:DisplayObjectContainer):void {
	if (mc) {
		if (mc is MovieClip) (mc as MovieClip).stop();
		var len:int = mc.numChildren;
		for (var i:int = 0; i < len; i++) {
			var obj:DisplayObject = mc.getChildAt(i);
			if (obj is MovieClip) {
				stop(MovieClip(obj));
			}
		}
	}
}
 
/**
 * Возвращает объект с ключами - меткам таймлайна и значениями - номерам фреймов.
 * Например {"default": 1, "play": 5, "effect": 15}
 * @param mc мувиклип с метками на таймлайне
 * @return Object
 */
public static function getLabels(mc:MovieClip):Object {
	var labels/*FrameLabel*/:Array = mc.currentLabels;
	var result:Object = { };
	for each (var item:FrameLabel in labels) {
		result[item.name] = item.frame;
	}
	return result;
}
Старый 21.04.2012 15:16 in4core вне форума
in4core
 
Аватар для in4core
С пивком потянет ))
Код AS3:
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 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
in4core Круто! Возьму на заметку.
Старый 23.04.2012 00:45 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Немного обновил классы ULoad и Ready.
Теперь getLoaders, removeLoaders работают по другому.
Например, если написать removeLoaders('http://site.ru/'), то удалятся все лоадеры, в путях которых присутствует 'http://site.ru'.
Например, есть лоадеры: 'http://site.ru/image1.png', 'http://site.ru/sounds/sound1.mp3', 'http://site.ru/scripts/php1.php', 'http://othersite.ru/image.jpg'.
Если написать removeLoaders('http://site.ru/'), то все они удалятся, кроме 'http://othersite.ru/image.jpg'.
Еще пример:
Лоадеры: 'http://site.ru/image1.png', 'http://site.ru/image2.png', 'http://site.ru/sounds/sound1.mp3', 'http://site.ru/sounds/sound2.mp3', 'http://othersite.ru/image.jpg'.
Код AS3:
removeLoaders('sounds');
Лоадеры теперь: 'http://site.ru/image1.png', 'http://site.ru/image2.png', 'http://othersite.ru/image.jpg'.
И так далее.
Старый 25.04.2012 05:14 ramshteks вне форума
ramshteks
 
Аватар для ramshteks
могу предложить в копилку вот такое решение, я его уже публиковал здесь
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 Rzer вне форума
Rzer
 
Аватар для Rzer
Завёл сайтик - туда буду выкладывать файлики с классами. http://atflash.ru/simplify/
Старый 26.04.2012 11:59 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Завёл сайтик
Может всё-таки bitbucket или github?
Старый 26.04.2012 12:16 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
Цитата:
Может всё-таки bitbucket или github?
Не надо, пусть на "сайтике" будет.
Старый 26.04.2012 20:07 Rzer вне форума
Rzer
 
Аватар для Rzer
Цитата:
Может всё-таки bitbucket или github?
Это для серъёзных проектов, а набор пока не дотягивает. Классы потихоньку прибавляются, помогайте своими.
Старый 27.04.2012 10:24 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Это для серъёзных проектов
Если вы не воспринимаете свой проект как "серьёзный" нечего тогда и заморачиваться вообще.
Старый 27.04.2012 14:11 Rzer вне форума
Rzer
 
Аватар для Rzer
Завёл проект на GitHub https://github.com/rzer/simplify
Старый 28.04.2012 10:53 Silicium вне форума
Silicium
 
Аватар для Silicium
Отсебятина приветствуется? Или надо только писать под задачи, перечисленные в посте?
Старый 28.04.2012 12:39 Rzer вне форума
Rzer
 
Аватар для Rzer
Конечно приветствуется. Все классы предложенные в посте - это то, что было бы мне полезно, основываясь на своём опыте. У кого-то опыт другой, и под другие задачи - нужны абсолютно другие классы.
Старый 29.04.2012 03:00 Rzer вне форума
Rzer
 
Аватар для Rzer
Потихоньку выкладываю файлы на http://atflash.ru/simplify/
Очень хочется услышать мнение о полезности классов от начинающих программистов.
Старый 30.04.2012 01:23 zuxul вне форума
zuxul
В классе Call onEnterFrame вызывается всегда, не зависимо от того, нужен или нет вызов.
В моем велосипеде слушатель добавляется только по требованию.
Старый 02.05.2012 21:39 illuzor вне форума
illuzor
 
Аватар для illuzor
Rzer, у меня лоадер практически такой же =). Интересно, что разные люди могут так одинаково мыслить...

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

Код AS3:
package {
 
	import flash.display.Shape;
 
	/**
	 * Класс быстрого прямоугольника
	 * 
	 * @example
	 *
	 * addChild(new FastRect(100, 200, 0x0, .5));
	 * 
	 * @author illuzor
	 */
 
	public class FastRect extends Shape {
 
		private var _color:uint;
		private var _width:uint;
		private var _height:uint;
		private var _aplha:Number;
 
		public function FastRect(width:uint, height:uint, color:uint = 0x0, alpha:Number = 1) {
			_color = color;
			_width = width;
			_height = height;
			_aplha = alpha;
			draw();
		}
 
		public override function set width (value:Number):void {
			_width = value;
			draw();
		}
 
		public override function get width():Number {
			return _width;
		}
 
		public override function set height (value:Number):void {
			_height = value;
			draw();
		}
 
		public override function get height():Number {
			return _height;
		}
 
		public function get color():uint {
			return _color;
		}
 
		public function set color(value:uint):void {
			_color = value;
			draw();
		}
 
		private function draw():void {
			this.graphics.clear();
			this.graphics.beginFill(_color, _aplha);
			this.graphics.drawRect(0, 0, _width, _height);
			this.graphics.endFill();
		}
 
	}
}
Код AS3:
package {
 
	import flash.display.Shape;
 
	/**
	 * Класс быстрого круга. Рисуется по диаметру. Визуально круг смещён на координаты x:0, y:0.
	 * 
	 * @example
	 *
	 * addChild(new FastCircle(100, 0xFF00FF, .6));
	 * 
	 * @author illuzor
	 */
 
	public class FastCircle extends Shape {
 
		private var _diameter:uint;
		private var _alpha:Number;
		private var _color:uint;
 
		public function FastCircle(diameter:uint, color:uint = 0x0, alpha:Number = 1) {
			_color = color;
			_alpha = alpha;
			_diameter = diameter;
			draw();
		}
 
		public function get diameter():uint {
			return _diameter;
		}
 
		public function set diameter(value:uint):void {
			_diameter = value;
			draw();
		}
 
		public function get color():uint {
			return _color;
		}
 
		public function set color(value:uint):void {
			_color = value;
			draw();
		}
 
		private function draw():void {
			this.graphics.clear();
			this.graphics.beginFill(_color, _alpha);
			this.graphics.drawCircle(_diameter / 2, _diameter / 2, _diameter / 2);
			this.graphics.endFill();
		}
 
	}
}
Старый 02.05.2012 21:50 Rzer вне форума
Rzer
 
Аватар для Rzer
illuzor, идея отличная. Мне, как любителю масок скругляющих на картинках углы, это бы очень пригодилось.
Старый 02.05.2012 22:11 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Rzer У меня в библиотеке есть класс DrawUtil.
Код AS3:
package com.mikroacse.display.utils 
{
	import flash.display.Sprite;
	/*
	 * @author MikroAcse studio
	 */
	/**
	*  Функции для быстрого рисования.
	* 
    * @langversion 3.0  
	*/ 
	public class DrawUtil {
		/**
	*  Создание круга.
	* @param circleArgs Параметры создания круга. (x, y, radius)
	* @param useFill Использовать или не использовать заливку.
	* @param fillArgs Параметры заливки круга. (color, alpha)
	* @param useBorder Использовать или не использовать обводку.
	* @param borderArgs Параметры обводки круга. (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit)
    * @langversion 3.0  
	*/ 
		public static function newCircle(circleArgs:Array=null, useFill:Boolean = true, fillArgs:Array = null, useBorder:Boolean = true, borderArgs:Array = null):Sprite {
			if (circleArgs == null) circleArgs = [0, 0, 50];
			if (fillArgs == null) fillArgs = [0xFF0000, 1];
			if (borderArgs == null) borderArgs = [1, 0x000000];
 
			var sprite:Sprite = new Sprite();
			if (useFill) sprite.graphics.beginFill.apply(null, fillArgs);
			if (useBorder) sprite.graphics.lineStyle.apply(null, borderArgs);
			sprite.graphics.drawCircle.apply(null, circleArgs);
			return sprite;
		}
		/**
	*  Создание эллипса.
	* @param ellipseArgs Параметры создания эллипса. (x, y, width, height)
	* @param useFill Использовать или не использовать заливку.
	* @param fillArgs Параметры заливки эллипса. (color, alpha)
	* @param useBorder Использовать или не использовать обводку.
	* @param borderArgs Параметры обводки эллипса. (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit)
    * @langversion 3.0  
	*/ 
		public static function newEllipse(ellipseArgs:Array=null, useFill:Boolean = true, fillArgs:Array = null, useBorder:Boolean = true, borderArgs:Array = null):Sprite {
			if (ellipseArgs == null) ellipseArgs = [0, 0, 50];
			if (fillArgs == null) fillArgs = [0xFF0000, 1];
			if (borderArgs == null) borderArgs = [1, 0x000000];
 
			var sprite:Sprite = new Sprite();
			if (useFill) sprite.graphics.beginFill.apply(null, fillArgs);
			if (useBorder) sprite.graphics.lineStyle.apply(null, borderArgs);
			sprite.graphics.drawEllipse.apply(null, ellipseArgs);
			return sprite;
		}
		/**
	*  Создание прямоугольника.
	* @param boxArgs Параметры создания прямоугольника. (x, y, width, height)
	* @param useFill Использовать или не использовать заливку.
	* @param fillArgs Параметры заливки прямоугольника. (color, alpha)
	* @param useBorder Использовать или не использовать обводку.
	* @param borderArgs Параметры обводки прямоугольника. (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit)
    * @langversion 3.0  
	*/ 
		public static function newBox(boxArgs:Array=null, useFill:Boolean = true, fillArgs:Array = null, useBorder:Boolean = true, borderArgs:Array = null):Sprite {
			if (boxArgs == null) boxArgs = [0, 0, 20, 20];
			if (fillArgs == null) fillArgs = [0xFF0000, 1];
			if (borderArgs == null) borderArgs = [1, 0x000000];
 
			var sprite:Sprite = new Sprite();
			if (useFill) sprite.graphics.beginFill.apply(null, fillArgs);
			if (useBorder) sprite.graphics.lineStyle.apply(null, borderArgs);
			sprite.graphics.drawRect.apply(null, boxArgs);
			return sprite;
		}
	}
 
}
Старый 04.05.2012 01:53 in4core вне форума
in4core
 
Аватар для in4core
MikroAcse ну и зачем все это надо? Редко когда тербуется фабрика ректов и т.п. В каждом отдльеном проекте достаточно своей фабрики под определенные нужды.
Универсальность убивает... все это не нужно по факту.
Мульти лоадеры уже есть, скроллеры есть, все уже есть, и новые реализации вряд ли будут лучше старых.
Rzer вот опять к вам. Зачем по факту нужен Call в 90% проектов ? Вы его используете сами вообще?
Из того, что действительно может понадобится ВСЕМ, это логгер например ( онлайн дебаггер во флеше) . Апгрейдированный скроллер ( блюр при прокрутке, движение с задержкой ) .
Хотя данная тема скорее больше подходит не для *классы для новичков* , а скорее примеры классов, как можно написать реализацию, тоесть новички смотрят и разбираются ( но для этого нужна хорошая документация, например ASdoc ) ....
Обновил(-а) in4core 04.05.2012 в 02:02
Старый 04.05.2012 09:54 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
MikroAcse ну и зачем все это надо? Редко когда тербуется фабрика ректов и т.п. В каждом отдльеном проекте достаточно своей фабрики под определенные нужды.
Универсальность убивает... все это не нужно по факту.
Мульти лоадеры уже есть, скроллеры есть, все уже есть, и новые реализации вряд ли будут лучше старых.
Все это нужно. Есть куда стремится! Не надо говорить, что все уже сделано и мы не можем сделать лучше.
Старый 04.05.2012 13:58 Rzer вне форума
Rzer
 
Аватар для Rzer
in4core, без реализации задержанных вызовов не обходится ни один мой проект. Попробуй его использовать и поймёшь, как это удобно. Про старое молчу, в нашем автопроме, наверное, придерживаются твоей точки зрения. Нужно ориентироваться на старые удачные реализации, завоевавшие популярность - это да.

Документация очень полезна, спору нет. Но тут есть одно но: все предложенные классы используют минимум функциональности - посмотрев пример из комментария класса становится понятно, как его использовать.

Я не претендую на лучшую реализацию функционала заточенную под определённые задачи. Мне не удобно использовать половину чужих разработок. Это как минимум снижает понимание того, что происходит у тебя в коде. Как максимум заставляет меня задуматься, что не такой я уж и хороший программист, если не могу реализовать такие вот небольшие функции, которыми пользуюсь. Понятно, что 3d или физический движок я скорее возьму готовый, так как не разбираюсь во всех тонкостях оптимизации этих сложных процессов.

Например почему JavaScript+HTML набирает такую популярность? По моему мнению, это происходит от того, что там есть такие наборы, как jquery, bootstrap и прочие - сводят 90% всех задач к одной строчке кода, и с подключением одного, двух фреймворков. Для сравнения, возьмём Flex. Сколько нужно знать правил и тонкостей, чтобы добавить на стандартную кнопку свою картинку? Программирование должно быть лёгким и решать стандартные задачи быстро, а не заставлять программиста каждый раз вспоминать школьные уроки Черепашки для рисования.
Обновил(-а) Rzer 04.05.2012 в 14:08
Старый 04.05.2012 15:10 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
без реализации задержанных вызовов не обходится ни один мой проект
Приведите пример, когда мне может это понадобится в каком либо проекте. Тем более вы говорите, что в каждом у вас требуется. У меня лично ни в одном не нужно. Может проекты у нас разные ? Собственно покажите пример - где требуется

Кроме того, раз уж показываете новичкам, то давайте осмысленные имена методам.

Что такое nextFrame ? следюущий кадр? И причем тут задержанные вызовы?
Что такое afterForget - после забытый ? чего чего ? ....
Что такое forget - забыть ? Что забыть ? Зачем забыть ?
( addMethod , removeMethod - звучат понятнее всем )

Далее почему Call extends Sprite ? Зачем утилитному классу быть наследником спрайта?
Код AS3:
var call:Call = new Call();
call.addChild(graphic)
... приплыли...
Если уж нужен так интер фрейм ( хотя подписать на таймер разница не вилика, то создайте приватный спрайт и вешайте на него что хотите, скажу вам по секрету addChild для него делать не надо, чтобы интефрейм работал

Код AS3:
Call.after(1000, onNextSecond); //Метод onNextSecond будет вызван через одну секунду
Код AS3:
setTimeout(func , 1000 , args) // не, не слышал
Обновил(-а) in4core 04.05.2012 в 15:30
Старый 04.05.2012 15:46 Rzer вне форума
Rzer
 
Аватар для Rzer
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 Silicium вне форума
Silicium
 
Аватар для Silicium
Цитата:
Код AS3:
setTimeout(func , 1000 , args) // не, не слышал
Ну дык а в чем преимущество Call-а?
Старый 04.05.2012 16:04 Rzer вне форума
Rzer
 
Аватар для Rzer
Дополнил предыдущий пост.
Старый 04.05.2012 17:04 ramshteks вне форума
ramshteks
 
Аватар для ramshteks
Rzer, у меня к вам два вопроса что ли...
Во первых. Забейте на всех яростных анти-велосипедистов. В топку их. Крикуны сродни инквизиции сжигающей за "сатанинскую" деятельность.
Во вторых. Дайте ссылочку на такую тему для FD =)
Старый 04.05.2012 17:07 Rzer вне форума
Rzer
 
Аватар для Rzer
Старый 04.05.2012 17:29 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Call (in) next frame - вызовите в следующем кадре. Call after - вызовите через.. addMethod , removeMethod - не несут смысловой нагрузки.

Так и не надо добавлять добавлять Call на сцену. Это такой хитрый приём инициализации статического класса.
doInNextFrame - это одно. А вот Call.nextFrame это mc.nextFrame(). C колл афтер аналогия таже.

Правльно, не надо. Но нафига у статического класса запускать конутсрктор? Это такой тонкий троллинг? Яж написал , что логичнее иметь внутренний приватный спрайт, и создать метод Call.initialize() для запуска вашего интерфрейма. Это нормальная практика, у вас же непонятно что. - хитрее не придумаешь.

По поводу примеров, более понятен пример два с сервером. Про него и поговорим.
У вас часто бывают ситуации, что во время запроса к серверу в течении например часа работы, постоянные задержки на ответ в 5 секунд ??? Значит у вас фиговый сервер, и его надо бросать срочно. Задержки могут быть такие если идут большие данные, но в этом случае, можно и 10 секунд ждать, раз требуется. Я вижу только 1 разумность, это первый запуск сервера и ожидание его подключения, если за 10 секунд не подключится выполнили другой код, но для этого использовать целый класс, вместо одного метода - нецелесообразно.
Ага осилил первый пример, ну там схема та же, для данного конкретного случая метод в пару строк будет удобнее, тем более это специфический случай, а не конвеерный, как ты говоришь во всех проектах.
Я в данном случае сделаю проще. Я запущу обычный таймер и если в течении 5 секунд, новая строчка не добавилась - ресечу таймер и показываю строки
Старый 04.05.2012 17:36 Rzer вне форума
Rzer
 
Аватар для Rzer
Не буду с тобой спорить. Скажу лишь, что таких частных случаев в реальном проекте набралось аж 252. Про пример с сервером - так, например, делает наш любимый вконтакте.
Обновил(-а) Rzer 04.05.2012 в 17:39
Старый 04.05.2012 18:17 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Не буду с тобой спорить. Скажу лишь, что таких частных случаев в реальном проекте набралось аж 252
Ну вот про себя если сказать. Я конечно многого не видел, и многих проектов не делал, конечно. Занимался и онлайн казино, и даже какую то игру в ВК заказывали, букмейкерские конторы и прочее, что уж говорить про мелкие проекты типа флеш галлерей и т.п., хмл-сайтов. Но вот хоть убей ну ни разу не писал что то подобное. не требовалось.
Я не хочу сказать, что ваша штука бесполезна, она скорее специфична о чем я и пытался указать, она не для широкого круга, а для гурманов ( ценителей ).
Старый 16.05.2012 15:20 Партизан вне форума
Партизан
 
Аватар для Партизан
Хм... Большая часть примеров решается TweenMax, BulkLoader.
От себя могу дать три простых, но полезных класса(они с описанием в моем блоге)
Есть еще очень полезная вещь которой постоянно пользуюсь printf, класс для форматирования строк. Довольно удобно.
Старый 18.05.2012 15:37 pas.delger вне форума
pas.delger
 
Аватар для pas.delger
Предлагаю свою небольшую наработку для быстроты форматирования текстовых полей и строк.

Сама утилитка:

Код AS3:
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;
		}
 
	}
 
}
И классик содержащий описание формата:

Код AS3:
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
 

 


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


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