![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
В ActionScript 3 можно определить что мышка ушла за пределы флеш-ролика, используя событие mouseLeave для stage. Это событие происходит каждый раз, когда мышка покидает пределы ролика. Нет события mouseEnter, но можно использовать mouseMove для определения того, что мышка вернулась к нам.
Простой пример использования нарисованного квадрата в качестве своего курсора. Код:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.ui.Mouse;
public class Test extends Sprite {
private var cursor:Sprite = new Sprite();
public function Test() {
cursor.graphics.beginFill(0xFF);
cursor.graphics.drawRect(0, 0, 25, 25);
addChild(cursor);
stage.addEventListener(Event.MOUSE_LEAVE, cursorHide);
stage.addEventListener(MouseEvent.MOUSE_MOVE, cursorFollow);
Mouse.hide();
}
public function cursorHide(evt:Event):void {
cursor.visible = false;
}
public function cursorFollow(evt:MouseEvent):void {
if (!cursor.visible) cursor.visible = true;
cursor.x = stage.mouseX;
cursor.y = stage.mouseY;
evt.updateAfterEvent();
}
}
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
При определении массива в ActionScript 3 с использованием квадратных скобок, теперь можно оставить запятую после последнего элемента и это не вызовет ошибки. Например:
Код:
var myList:Array = [
"The",
"quick",
"brown",
"fox",
];
Это не работает с Array() или new Array(), только с []. Это конечно мелочь, но при отладке может сэкономить время, если вам, к примеру, нужно временно убрать последний элемент массива, просто закомментировать его. Раньше еще приходилось и убирать запятую перед ним, теперь все проще. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
Пакеты в ActionScript 3 немного отличаются от пакетов в ActionScript 2. Теперь пакет это не часть имени класса, а блок определяемый ключевым словом package, который содержит в себе определение класса. Структура такова:
Код:
package my.package.path {
class MyClass {
}
}
Код:
// ActionScript 2:
class my.package.path.MyClass {
}
Код:
package {
class NotInAPackageClass {
}
}
Код:
package com.kirupa.utils {
function StripString(str:String):void {
// ...
}
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
К сожалению, ActionScript 3 НЕ поддерживает абстрактные классы (экземпляры которых нельзя создать, а можно только унаследовать). Т.е. вы не можете создавать ваши собственные абстрактные классы. Однако, обратите внимание, что некоторые из внутренних классов ActionScript сами по себе являются абстрактными. Эти классы включают:
Код:
var myObj:InteractiveObject = new InteractiveObject(); // ERROR Код:
package {
import flash.display.DisplayObject;
public class MyDisplay extends DisplayObject{
public function MyDisplay (){
// ERROR
}
}
}
Вместо этого вам необходимо расширять те внутренние классы, которые уже являются наследниками этих классов. К примеру, если вы хотите расширить DisplayObject, вы можете вместо этого расширить Shape, легкий встроенный класс, унаследованный от DisplayObject. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
Перекрытием (overriding) называется переопределение метода в классе, который в противном случае был бы унаследован. Новый метод будет использоваться вместо унаследованного (хотя унаследованный метод остается доступен с использованием super).
В ActionScript 3, когда вы перекрываете метод или свойство родительского класса, вы должны использовать аттрибут override. Он указывает на то, что создаваемый вами член класса будет перекрывать тот, который иначе был бы унаследован. Если вы не укажете override для метода, который уже существует в родительском классе, возникнет ошибка компиляции. Пример: Код:
package {
import flash.display.*;
class MySprite extends Sprite {
private var children:Array = new Array();
public function MySprite() {
}
public override function addChild(child:DisplayObject):DisplayObject {
children.push(child);
super.addChild(child);
return child;
}
}
}
Обратите внимание, что описание метода должно соответствовать перекрываемому Перекрытие работает как с обычными методами класса, так и с getter/setter методами (свойствами), однако оно не будет работать ни с чем из нижеперечисленного:
Обратите также внимание, что перекрытие не требуется для методов, которые наследуются непосредственно от класса Object. Это:
Однако, если расширяется класс, в котором приведенные выше методы являются частью его описания, ключевое слово override необходимо. Например, если вы расширяете класс Object, вам не нужно использовать override для метода toString. Но если вы расширяете класс Sprite, вам потребуется перекрывать toString, т.к. класс Sprite имеет в своем описании собственный toString. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
Для доступа к вложенным объектам (детям) в XML вы можете использовать оператор точка (.) (XML dot operator). Пример:
Код:
var myXML:XML =
<foo>
<bar />
<bar />
<bar />
</foo>;
trace(myXML.bar.toXMLString());
Код:
<bar/> <bar/> <bar/> Код:
trace(myXML.elements("bar").toXMLString());
Код:
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> Код:
trace(myXML.descendants("author").toXMLString());
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
В классе Array (Top level Array) добавлены новые методы indexOf и lastIndexOf.
Код:
AS3 function indexOf(searchElement:*, fromIndex:int = 0):int AS3 function lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int Код:
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 |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
Для создания ссылок в текстовом поле, клик по которым можно программно отловить, теперь нужно использовать слово 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
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
Помимо создания динамических свойств и методов в Proxy (flash.utils.Proxy) есть возможность управлять порядком перечисления свойств в циклах for..in и for each..in. Для этого используются методы класса:
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);
}
Код:
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)
}
Поскольку в циклах используется порядковый номер, то удобно хранить динамические свойства в массиве и в методах 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
*/
Код:
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
*/
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 327
|
MerlinTwi: Поскольку этот совет (Event Capturing and mouseEnabled) в оригинале практически дублирует (72. mouseEnabled и блокирование событий), видимо senocular где-то ошибся, то я сам расскажу еще про mouseEnabled.
К примеру, создаем класс текстовой кнопки, есть фоновый мувиклип, который растягивается под ширину текста и сверху на него накладывается текст (TextField). Если обработчики событий от мышки (MOUSE_OVER, MOUSE_OUT, CLICK) добавить к фоновому мувиклипу, то события будут срабатывать только на краях кнопки, где нет текста. Это происходит потому, что все интерактивные отображаемые объекты создаются по умолчанию с mouseEnabled=true, т.е. реагируют на события от мышки, а как было показано в предыдущих советах событие от мышки получает только самый верхний объект на сцене. Поэтому в таких случаях нужно не забывать запрещать текстовому полю перехватывать события от мышки: Код:
mouseEnabled=false; Код:
buttonMode=true; Последний раз редактировалось MerlinTwi; 09.11.2006 в 22:00. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:23. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|