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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0 > Статьи

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.10.2006, 13:56
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 31  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Дополнение к заметке про абстрактные классы. Для создания своего абстрактного класса, можно использовать такой код:
Код:
package {
    public class Abstract {
        public function Abstract() {
            if( toString() == "[object Abstract]" ) throw( new Error( "Abstract must be extended" ) );
        }
    }
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 09.10.2006, 16:37
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 32  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 37. Оператор is вместо instanceof

В ActionScript 3 введен новый оператор “is” (is operator) для проверки принадлежности экземпляра класса к типу класса или интерфейса.
Код:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite);           // true
trace(mySprite is DisplayObject);    // true
trace(mySprite is IEventDispatcher); // true
Оператор is заменяет оператор instanceof (instanceof operator), использовавшийся в ActionScript 1 и 2. Оператор is проверяет цепочку наследования AS3 класса, в то время как instanceof проверяет цепочку прототипов (prototype). Отсюда несколько нюансов:
1. поскольку, AS3 классы воссоздают цепочку прототипов, то с помощью instanceof теоретически можно проверить принадлежность экземпляра класса к определенному типу AS3 класса, но не к интерфейсу:
Код:
var mySprite:Sprite = new Sprite();
trace(mySprite instanceof Sprite);           // true
trace(mySprite instanceof DisplayObject);    // true
trace(mySprite instanceof IEventDispatcher); // false – нет в цепочке прототипов
2. С помощью оператора is нельзя проверить тип динамического класса созданного не через наследование, а через прототип (стиль AS1):
Код:
var AS1StyleClass:Function = function(){}
AS1StyleClass.prototype = new MovieClip();

var as1Instance:* = new AS1StyleClass();
trace(as1Instance instanceof AS1StyleClass);    // true
trace(as1Instance instanceof MovieClip);        // true
trace(as1Instance is AS1StyleClass);    // true
trace(as1Instance is MovieClip);        // false
В AS3 следует использовать только оператор is, прежний оператор instanceof хоть и поддерживается, но компилятор будет выдавать предупреждение:
The instanceof operator is deprecated, use the is operator instead.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 09.10.2006, 16:57
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 33  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 38. Timelines как класс

Во Flash 9 вы можете ассоциировать timeline с классом, в том числе и рутовый. Timeline мувиклипа ассоциируется с классом так же как и в ActionScript 2 используя диалог linkage. Timeline рута может быть ассоциирован с классом в диалоге property inspector или в настройках публикации (publish settings - ActionScript settings).
Если вы написали код внутри фрейма в timeline, то он будет автоматически преобразован в класс. При этом переменные объявленные внутри какого-либо фрейма становятся свойствами класса, а функции методами класса. Поэтому вы не сможете объявить переменную или функцию с одинаковым названием в разных фреймах. Любой скрипт внутри фрейма ассоциируются с методом, который автоматически называется, когда происходит переход на этот фрейм.
Например, такой код написанный внутри фрейма:
Код:
var num:Number = 1;
function showNum():void {
    trace(num);
}
showNum();
Будет преобразован в примерно такой класс:
Код:
package {
    class TimelineClass extends MovieClip {
        
        public var num:Number = 1;

        public function showNum():void {
            trace(this.num);
        }
        // метод автоматически вызываемый при переходе на первый фрейм
        public function frame1():void { 
            showNum();
        }
    }
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 09.10.2006, 17:01
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 34  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 39. Использование RegExp для проверки корректности написания email

Пример, как можно использовать регулярное выражение (Top level RegExpх) для проверки корректности написания email:
Код:
function isValidEmail(email:String):Boolean {
    var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
    return emailExpression.test(email);
}
//...
trace(isValidEmail("senocular@example.com")); // true
trace(isValidEmail("@example.com")); // false
trace(isValidEmail("senocular@example")); // false
trace(isValidEmail("seno\\cular@example.com")); // false
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 11.10.2006, 12:51
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 35  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 41. Оператор @ для работы с атрибутами XML

В ActionScript 3 для удобства работы с XML добавлен новый оператор “@”, предназначенный для доступа к атрибутам XML, и является аналогом метода attribute (Top level XML.attribute()).
Код:
var myXML:XML = <user name="senocular" id="2867" />;
trace(myXML.attribute("name")); // senocular
trace(myXML.attribute("id")); // 2867
trace(myXML.@name); // senocular
trace(myXML.@id); // 2867
В операторе @ можно использовать звездочку (*) для получения списка всех атрибутов узла XML в формате XMLList, это будет аналогом метода attributes() (Top level XML.attributes()). Пример:
Код:
var myXML:XML = <user name="senocular" id="2867" />;
var atts:XMLList;

atts = myXML.attributes();
trace(atts.toXMLString());
/* Output:
senocular
2867
*/
atts = myXML.@*;
trace(atts.toXMLString());
/* Output:
senocular
2867
*/
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 11.10.2006, 13:05
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 36  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 42. Распространение событий

ActionScript 3 поддерживает распространение события (event propagation) – передача одного события нескольким объектам. К примеру, в ActionScript 1 и 2 события для кнопок (такие как onPress, onRelease, …) перехваченные мувиклипом никогда не дойдут до вложенных в него мувиклипов, даже если мышкой кликнули именно по вложенному мувиклипу. Например, кликаем мышкой по мувиклипу child_mc, который вложен в parent_mc:
Код:
// AS1 и AS2
parent_mc.onPress = function(){
    trace("parent pressed");
}
parent_mc.child_mc.onPress = function(){
    trace("child pressed");
}

/* trace при клике мышкой по child_mc:
parent pressed
*/
А в ActionScript 3 событие будет передано обоим мувиклипам:
Код:
// AS3
parent_mc.addEventListener(MouseEvent.CLICK, parentClick);
parent_mc.child_mc.addEventListener(MouseEvent.CLICK, childClick);

function parentClick(event:MouseEvent):void {
    trace("parent pressed");
}
function childClick(event:MouseEvent):void {
    trace("child pressed");
}

/* trace при клике мышкой по child_mc:
child pressed
parent pressed
*/
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 12.10.2006, 17:00
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 37  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 43. Получение спектра звука

Используя ActionScript 3 можно получить информацию о спектре проигрываемого flash-плеером в данный момент звука/музыки. Для этого можно вызывать статичный метод computeSpectrum класса SoundMixer (flash.media.SoundMixer), и в качестве параметра передать массив ByteArray, куда и будет записана информация о спектре: 256 чисел с плавающей запятой (floating-point в диапазоне -1.0 … 1.0) для левого канала и следом 256 чисел для правого канала.
Код:
// запустить проигрывание музыки
// ...
var spectrumInfo:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(spectrumInfo);
// spectrumInfo теперь содержит информацию о спектре
Эту информацию можно использовать для создания визуализации звука, как в популярных медиа-плеерах.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 12.10.2006, 17:10
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 38  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 44. Преобразование Number() больше не поддерживает восьмеричную систему

В ActionScript 1 и 2 преобразовывая строку в число, используя Number(), если строка начиналась с нуля “0”, то число интерпретировалось как восьмеричное. Если строка начиналась с “0x”, то число интерпретировалось как шестнадцатеричное:
Код:
// ActionScript 1 и 2
trace(Number("010")); // 8
Это могло создать определенные проблемы, если вы ожидали получить обычное десятичное число. Теперь ActionScript 3 интерпретирует строку, начинающуюся с нуля как десятичное число.
Код:
// ActionScript 3
trace(Number("010")); // 10
Если же нужно интерпретировать строку как восьмеричное число (или в любую другу систему счисления), то нужно использовать функцию parseInt:
Код:
trace(parseInt("010", 8)); // 8
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 13.10.2006, 11:48
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 39  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 45. Сборщик мусора (Garbage Collection)

Сборщик мусора (Garbage Collection - GC) автоматический процесс во Flash-плеере, который удаляет данные из памяти, когда они более не нужны. GC оценивает необходимость удаления по двум критериям: счетчик ссылок (reference counting) и очистка по меткам (mark and sweep)

1. Счетчик ссылок - это процесс, который следит за количеством переменных, ссылающихся на объекты в памяти.
Код:
var a:Object = new Object(); //создается новый объект и новая переменная "a", которая ссылается на этот объект, счетчик ссылок = 1
var b:Object = a; // еще одна ссылка на тот же объект, счетчик ссылок = 2
Когда не останется ни одной ссылки на объект, то он будет удален из памяти.
Код:
a=null; // счетчик ссылок стал равен 1
b=null; // счетчик ссылок стал равен 0, и объект будет удален из памяти
Есть случаи, когда счетчик ссылок не сработает, например:
Код:
var a:Object = new Object(); // счетчик ссылок на первый объект = 1
var b:Object = new Object(); // счетчик ссылок на второй объект = 1
a.b = b; // счетчик ссылок на второй объект = 2
b.a = a; // счетчик ссылок на первый объект = 2
a=null; // счетчик ссылок на первый объект = 1
b=null; // счетчик ссылок на второй объект = 1
Обе переменные "a" и "b" более не ссылаются на объекты, но первый объект доступен из второго и второй доступен из первого. В данном случае счетчик ссылок не сработает, пора приниматься за дело процессу очистке по меткам.

2. Очистка по меткам – это процесс, который сканирует все объекты от базового класса (root или stage) и помечает каждого, кого нашел. Все не найденные объекты недоступны и потому будут удалены. Из предыдущего примера про "a" и "b", поскольку "a" и "b" более недоступны из root они не будут помечены и будут удалены.
Код:
[root] <- сканирование...
     [objectRef (помечен)] <- сканирование...
          [objectRef (помечен)] <- сканирование...
          [objectRef (помечен)] <- сканирование...
     [objectRef (помечен)] <- сканирование...
     [objectRef (помечен)] <- сканирование...
...
[удалить все непомеченное]
Очистка по меткам очень ресурсоемкий процесс, поэтому выполняется редко, решение о том, когда запустить процессы удаления данных из памяти принимает flash-плеер сам, и программно инициировать эти процессы мы не можем.

MerlinTwi: Хочу обратить ваше внимание на то, что добавление обработчиков событий к объекту (или setInterval) не позволит сборщику мусора (GC) удалить этот объект, т.к. на него остаются ссылки из процессов рассылающих события. Например:
Код:
init();

function init():void {
	var test:Sprite = new Sprite();
	test.addEventListener(Event.ENTER_FRAME, handle);
}

function handle(e:Event):void {
	trace("enterFrame");
}
Локальная переменная test, ссылающаяся на созданный спрайт удалена, сам спрайт недоступен из root или stage, но он не будет удален из памяти т.к. спрайт слушает событие enterFrame, и функция handle будет продолжать срабатывать. Для того чтобы объект был удален, нужно освобождать слушаемые им события, когда они более не нужны:
Код:
test.removeEventListener(Event.ENTER_FRAME, handle);
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 13.10.2006, 12:29
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 40  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 46. Мягкие ссылки

В ActionScript 3 есть две возможности поставить мягкую ссылку (Weak Reference) на объект, которая не будет учитываться счетчиком ссылок.
1. При использовании класса Dictionary его конструктору можно передать параметр true, чтобы использовались мягкие ссылки на объекты.
Код:
var dict:Dictionary = new Dictionary(true); // использовать мягкие ссылки
В этом случае Dictionary в качестве ключей будет использовать мягкие ссылки на объекты, которые не учитываются счетчиком ссылок и не мешают удалению объектов из памяти.
Код:
var obj:Object = new Object();
dict[obj] = true;
delete obj; // сборщик мусора удалит объект obj, поскольку ссылка на него из dict мягкая
2. Можно добавить слушатель события с мягкой ссылкой. У addEventListener последний параметр указывает, использовать мягкую ссылку или обычную (по умолчанию). При использовании мягкой ссылки, не удаленный обработчик события не помешает удалению объекта из памяти.
Код:
// addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
addEventListener(MouseEvent.CLICK, clickHandler, false, 0 true); // использовать мягкую ссылку
MerlinTwi: Для понимания мягкой ссылки в addEventListener, рассмотрим случай из предыдущего примера. Используем мягкую ссылку при создании слушателя события enterFrame:
Код:
init();

function init():void {
	var test:Sprite = new Sprite();
	test.addEventListener(Event.ENTER_FRAME, handle, false,0,true);
}

function handle(e:Event):void {
	trace("enterFrame");
}
Теоретически сборщик мусора должен удалить спрайт, т.к. на него не остается ссылок из переменных, из root он недоступен, и обработчик события enterFrame стоит мягкий. Вот только когда сработает сборщик мусора, решает flash-плеер сам… через секунду, через час, день? И до тех пор, пока сборщик мусора не удалит спрайт из памяти, функция handle будет исправно срабатывать каждый фрейм.
Экспериментально был найден способ заставить сборщик мусора сработать немедленно, нужно создать много объектов для которых потребуется выделение большого куска памяти. Подтолкнем таким способом сборщик мусора сработать по клику мышки:
Код:
init();
addEventListener(MouseEvent.CLICK, immediatelyGC);

function init():void {
	var test:Sprite = new Sprite();
	test.addEventListener(Event.ENTER_FRAME, handle, false,0,true);
}

function handle(e:Event):void {
	trace("enterFrame");
}

function immediatelyGC(e:Event):void {
	trace("run GC");
	var ar:Array = new Array();
	for (var i:int=0; i<100000; i++) {
		ar.push( new Object() );
	}
}
В трейсе будет:
. . .
enterFrame
enterFrame
enterFrame
run GC

После клика мышки и запуска функции immediatelyGC, сборщик мусора удалил спрайт из памяти и более функция handle не вызывается.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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