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

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

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

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

Для доступа к вложенным объектам (детям) в XML вы можете использовать оператор точка (.) (XML dot operator). Пример:
Код:
var myXML:XML = 
    <foo>
        <bar />
        <bar />
        <bar />
    </foo>;
    
trace(myXML.bar.toXMLString());
Результат:
Код:
<bar/>
<bar/>
<bar/>
Это аналогично использованию метода elements (XML.elements()).
Код:
trace(myXML.elements("bar").toXMLString());
Однако, есть еще похожий оператор две точки (..) (descendant accessor operator). Который работает аналогично, но возвращает и объекты более глубокого уровня вложенности. Пример:
Код:
var myXML:XML = 
    <note>
        <replying-to>
            <note>
                <author>Julie</author>
                <title>Reminder</title>
                <body>Take out the trash</body>
            </note>
        </replying-to>
        <author>Kevin</author>
        <title>Re: Reminder</title>
        <body>I will.</body>
    </note>;
    
trace("Children:");
trace(myXML.author.toXMLString());
trace("Decendants:");
trace(myXML..author.toXMLString());
Результат:
Код:
Children:
<author>Kevin</author>
Decendants:
<author>Julie</author>
<author>Kevin</author>
Есть и специальный метод, который выполняет ту же задачу decendants (XML.descendants()).
Код:
 trace(myXML.descendants("author").toXMLString());
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

В классе Array (Top level Array) добавлены новые методы indexOf и lastIndexOf.
Код:
AS3 function indexOf(searchElement:*, fromIndex:int = 0):int
AS3 function lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int
По сути они работают аналогично String.indexOf и String.lastIndexOf, возвращают позицию искомого элемента в массиве. Если объект не найден возвращается -1
Код:
var sprite:Sprite = new Sprite();
var object:Object = new Object();
var boolean:Boolean = true;
var number:Number = 10;

var array:Array = new Array(sprite, object, number);
trace(array.indexOf(sprite)); // 0
trace(array.indexOf(number)); // 2
trace(array.indexOf(boolean)); // -1
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

Для создания ссылок в текстовом поле, клик по которым можно программно отловить, теперь нужно использовать слово event (flash.text.TextField.event:link), а не asfunction как это было в ActionScript 1 и 2. Кроме того, event теперь не вызывает указанную функцию а создает событие TextEvent (flash.events.TextEvent) с типом TextEvent.LINK, а в свойство text записывается текст указанный в ссылке после слова event.
Пример:
Код:
var linkText:TextField = new TextField();
linkText.htmlText = 'Link: <a href="event:Link Clicked">Click</a>';
addChild(linkText);

linkText.addEventListener(TextEvent.LINK, linkEvent);

function linkEvent(event:TextEvent):void {
    trace(event.text); // Link Clicked
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 93. Proxy: методы перечисления (nextName(), nextValue(), nextNameIndex())

Помимо создания динамических свойств и методов в Proxy (flash.utils.Proxy) есть возможность управлять порядком перечисления свойств в циклах for..in и for each..in. Для этого используются методы класса:
  • nextName(index:int):String
  • nextValue(index:int):*
  • nextNameIndex(index:int):int
Метод nextName возвращает название свойства по порядковому номеру для цикла for..in (аналогично nextValue для цикла for each..in). nextNameIndex вызывается перед началом каждой итерации в цикле и отвечает за две вещи:
1) предоставляет порядковый номер для nextName и nextValue (если возвращаемое значение >0), или
2) прерывает цикл (если возвращаемое значение равно нулю).
При начале цикла nextNameIndex получает порядковый номер равный нулю. Каждое последующее значение возвращаемое nextNameIndex отлично от нуля и передается методам nextName и nextValue. Если nextNameIndex возвращает ноль, то цикл заканчивается.
К примеру, proxy имеет 3 свойства (x,y,visible), попробуем их перечислить в цикле for..in
Код:
for (var prop:String in proxy) {
    trace(prop);
}
Здесь будут вызываться методы nextNameIndex и nextName:
Код:
for (var prop:String in proxy) {
	[ proxy.nextNameIndex(0) -> return 1 ]
	[ proxy.nextName(1) -> return "x" ]
	[ prop = "x" ]
	trace(prop); // x
	(end for block, repeat)
	[ proxy.nextNameIndex(1) -> return 2 ]
	[ proxy.nextName(2) -> return "y" ]
	[ prop = "y" ]
	trace(prop); // y
	(end for block, repeat)
	[ proxy.nextNameIndex(2) -> return 3 ]
	[ proxy.nextName(3) -> return "visible" ]
	[ prop = "visible" ]
	trace(prop); // visible
	[ proxy.nextNameIndex(3) -> return 0 ]
	(0 index, break from for block)
}
Если использовать цикл for each..in, то nextValue будет вызываться вместо nextName.
Поскольку в циклах используется порядковый номер, то удобно хранить динамические свойства в массиве и в методах nextName или nextValue просто вернуть элемент массива index-1 (поскольку nextName и nextValue никогда не получают порядкового номера 0).
Создадим прокси-класс, который реализует пример выше. Помните, что методы proxy определены в пространстве имен flash_proxy.
Код:
package {
    
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;
    
    public class ProxyEnum extends Proxy {
        
        private var props:Array = ["x", "y", "visible"]; // массив свойств
        
        // nextNameIndex вызывается при начале итерации в цикле
        override flash_proxy function nextNameIndex (index:int):int {
            if (index < props.length) {
                // первый вызов 0, возвращаем 1 + index
                // т.е. порядковый номер будет 1, затем 2, 3
                return index + 1;
            } else {
                // все свойства перечислены для прерывания цикла
                // возвращаем 0
                return 0;
            }
        }
        
        // nextName вызывается после nextNameIndex и порядковый номер начинается с 1
        override flash_proxy function nextName(index:int):String {
            // возвращаем элемент массива index – 1
            return props[index - 1];
        }
    }
}
Пример использования:
Код:
var proxy:ProxyEnum = new ProxyEnum();
for (var prop in proxy) {
    trace(prop);
}
/* output:
x
y
visible
*/
Для полной картины необходимо еще переопределить методы nextValue и getProperty. Но для них нужны возвращаемые значения, пусть класс принимает в конструкторе ссылку на какой-то отображаемый объект, его свойства и будем возвращать.
Код:
package {
    
    import flash.display.DisplayObject;
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;
    
    public class ProxyEnum extends Proxy {
        
        private var props:Array = ["x", "y", "visible"]; // массив свойств
        private var _target:DisplayObject;
        
        function ProxyEnum(target:DisplayObject) {
            _target = target;
        }
        
        // nextNameIndex вызывается при начале итерации в цикле
        override flash_proxy function nextNameIndex (index:int):int {
            if (index < props.length) {
                // первый вызов 0, возвращаем 1 + index
                // т.е. порядковый номер будет 1, затем 2, 3
                return index + 1;
            } else {
                // все свойства перечислены для прерывания цикла
                // возвращаем 0
                return 0;
            }
        }
        
        // nextName вызывается после nextNameIndex и порядковый номер начинается с 1
        override flash_proxy function nextName(index:int):String {
            // возвращаем элемент массива index – 1
            return props[index - 1];
        }
        
        // nextValue вызывается после nextNameIndex в циклах for each..in
        override flash_proxy function nextValue(index:int):* {
            // получаем название свойства из массива
            var prop:String = props[index - 1];
            // и возвращаем его значение
            return _target[prop];
        }
        
        // возвращает значение свойства по его имени
        override flash_proxy function getProperty(name:*):* {
            return _target[name];
        }
    }
}
Пример использования:
Код:
var proxy:ProxyEnum = new ProxyEnum(my_mc);

for (var prop:String in proxy) { // nextName/nextNameIndex
    trace(prop);
    trace(proxy[prop]); // getProperty
}
/* output:
x
34
y
76
visible
true
*/

for each(var value:* in proxy) { // nextValue/nextNameIndex
    trace(value);
}
/* output:
34
76
true
*/
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

MerlinTwi: Поскольку этот совет (Event Capturing and mouseEnabled) в оригинале практически дублирует (72. mouseEnabled и блокирование событий), видимо senocular где-то ошибся, то я сам расскажу еще про mouseEnabled.
К примеру, создаем класс текстовой кнопки, есть фоновый мувиклип, который растягивается под ширину текста и сверху на него накладывается текст (TextField). Если обработчики событий от мышки (MOUSE_OVER, MOUSE_OUT, CLICK) добавить к фоновому мувиклипу, то события будут срабатывать только на краях кнопки, где нет текста. Это происходит потому, что все интерактивные отображаемые объекты создаются по умолчанию с mouseEnabled=true, т.е. реагируют на события от мышки, а как было показано в предыдущих советах событие от мышки получает только самый верхний объект на сцене. Поэтому в таких случаях нужно не забывать запрещать текстовому полю перехватывать события от мышки:
Код:
mouseEnabled=false;
А вообще, при создании кнопки лучше сделать:
Код:
buttonMode=true;
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.


Последний раз редактировалось MerlinTwi; 09.11.2006 в 23:00.
Старый 09.11.2006, 21:17
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 6  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

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

Работая с XML в ActionScript 3 вы в основном имеете дело с двумя объектами: XML (Top level XML) и XMLList (Top level XMLList). Существенная разница между ними в том, что XML – это один элемент XML-дерева, например узел (который может содержать произвольное количество вложенных узлов), а XMLList массив элементов (1 или более).
Код:
// XML:
<foo>
	<foo />
	<foo />
	<foo />
</foo>
Код:
// XMLList:
<foo />
<foo />
<foo />
В первом примере есть один корневой узел и это будет представлено как XML объект. Во втором примере список узлов, это уже будет XMLList.
В отличие от старого XML объекта из предыдущих версий ActionScript (который теперь XMLDocument), новые XML и XMLList могут представлять из себя не только узлы XML дерева (nodes), но и другие значения, например атрибуты:
Код:
var myXML:XML = <foo>
    <foo bar="bar1" />
    <foo bar="bar2" />
    <foo bar="bar3" />
</foo>;

trace(myXML.foo.@bar.toXMLString());
/* Output:
bar1
bar2
bar3
*/
trace(myXML.foo.@bar is XMLList); // true
Заметьте, что атрибуты всегда возвращаются как XMLList, даже если в итоге получается только один атрибут:
Код:
trace(myXML.foo[0].@bar is XMLList); // true
Для того чтобы получить XML объект, нужно из возвращаемого массива взять первый элемент:
Код:
trace(myXML.foo[0].@bar[0] is XML); // true
Аналогичная ситуация и с вложенными узлами XML:
Код:
var myXML:XML = <foo>
    <foo />
</foo>;
trace(myXML.foo is XMLList); // true
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 99. Взаимодействие между AVM2 (AS3) и AVM1 (AS2/AS1) через LocalConnection

Код ActionScript выполняется во flash-плеере в специальной «виртуальной машине», для ActionScript 1 и 2 это была AVM1, для ActionScript 3 была разработана новая AVM2. Нет возможности напрямую взаимодействовать между программами выполняющимся в разных виртуальных машинах, поскольку они несовместимы. К примеру, если в мувик созданный на ActionScript 3 загрузить внешний мувик из ActionScript 1 или 2, то не удастся напрямую управлять им: запустить, остановить, вызвать функцию, считать значение свойства и т.п.
Но можно создать специальный канал для взаимодействия при помощи LocalConnection, используя:Пример:
Код:
// файл на ActionScript 2: AS2animation.fla
// на timeline размещен один мувиклип названный animation_mc

//Устанавливаем  local connection для получения команд извне
var AVM_lc:LocalConnection = new LocalConnection();

// обработчик события stopAnimation
AVM_lc.stopAnimation = function(){
    animation_mc.stop();
}

// слушаем события по каналу  "AVM2toAVM1"
AVM_lc.connect("AVM2toAVM1");
Код:
// Файл на ActionScript 3: AS3Loader.fla

// local connection для взаимодействия с мувиклипом в AVM1
var AVM_lc:LocalConnection = new LocalConnection();

// загружаем внешнюю SWF AVM1
var loader:Loader = new Loader();
loader.load(new URLRequest("AS2animation.swf"));
addChild(loader);

// при клике мышкой по загруженному мувиклипу вызывается stopPlayback
loader.addEventListener(MouseEvent.CLICK, stopPlayback);

function stopPlayback(event:MouseEvent):void {
    // вызывается stopAnimation по каналу "AVM2toAVM1"
    AVM_lc.send("AVM2toAVM1", "stopAnimation");
}
Здесь AS3-мувик подгружает к себе AS2-мувик и размещает на сцене. Когда AS2-мувик подгружен и проигрывается пользователь может кликнуть по нему для прекращения проигрывания, при этом вызывается stopPlayback, который отсылает событие "stopAnimation" по local connection каналу "AVM2toAVM1". AS2-мувик получает событие и вызывается обработчик stopAnimation, который приказывает мувиклипу animation_mc остановиться.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

В ActionScript 3 добавлена возможность работать с бинарными данными, используя класс ByteArray (flash.utils.ByteArray). Класс ByteArray наследуется от массива Array (Top level Array) и может содержать в себе байты любой бинарной информации, аналогично тому, как она размещена в памяти компьютера. Работать с классом довольно просто, поэтому лучше посмотреть примеры, что можно с его помощью сделать:
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
В аттаче все советы в html формате (можно добавить на свой сайт)
Вложения
Тип файла: rar tips.rar (50.2 Кб, 6022 просмотров)
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 11.12.2007, 17:31
Evgeniya вне форума Посмотреть профиль Отправить личное сообщение для Evgeniya Найти все сообщения от Evgeniya
  № 10  
Ответить с цитированием
Evgeniya

Регистрация: Dec 2007
Сообщений: 2
Подскажите, пожалуйста, как временно запомнить только что нарисованную картинку для последующего ее изменения в movie clip (например, заставить вращаться)

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

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

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


 


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


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