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

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

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

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

В ActionScript 3 добавлено два новых ключевых слова для описания прав доступа и усовершенствовано свойство private по сравнению с ActionScript 2. Итак, теперь мы имеем следующие ключевые слова для регулирования прав доступа:
  • public
  • protected
  • private
  • internal (по умолчанию)

public: то же самое, что и в ActionScript 2, все определенное как public может быть прочитано откуда угодно.
Конструкторы теперь всегда public.

protected: новое ключевое слово, указывает, что метод или переменная скрыта от всех кроме классов потомков.
Классы и конструкторы не могут быть определены как protected.

private: в ActionScript 2 было это ключевое свойство, но фактически работало как protected, т.е. классы потомки имели полный доступ к методу или свойству, описанному как private. Теперь в ActionScript 3 private это полноценная приватность, т.е. доступ только в этом классе, в котором метод или переменная описана, для всех остальных, включая потомков, она не будет существовать. Это означает, что в классе-потомке можно объявить еще одну переменную или метод с таким же именем и при этом не возникнет никаких конфликтов.
Классы и конструкторы не могут быть определены как private.

internal: аналогично public, но ограничено пределами пакета (package). Только классы, описанные в этом же пакете, будут иметь доступ к internal переменным или методам.
Internal ставится по умолчанию для любого класса, переменным или методам класса, кроме конструкторов, которые всегда public.

Права доступа во вспомогательных классах немного отличаются. Поскольку они фактически описываются вне пакета (package), то переменные или методы, объявленные как internal будут доступны только классам, описанным в этом же файле.

В ActionScript 3 проверка прав доступа осуществляется не только на этапе компиляции, но и при выполнении, т.е. хаки использовавшиеся в ActionScript 2, чтобы получить доступ к скрытым методам больше не будут работать.

Рассмотрим все это на примерах.
Пример 1.
Код:
package {
    
    import flash.display.Sprite;
    
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
        
        // Конструктор всегда public
        function AccessControl() {
            
            // Только классы описанные в этом файле 
            // имеют доступ к вспомогательным классам
            var helper:Helper = new Helper();
            
            trace(helper.pubNum); // OK - это public
            // trace(helper.protNum); // Error – нет доступа к protected
            // trace(helper.privNum); // Error – нет доступа к private
            trace(helper.interNum); // OK - это internal
        }
    }
}

// Класс Helper по умолчанию internal
class Helper {
    
    // public – переменная видна отовсюду
    public var pubNum:Number = 1;
    
    // protected – доступ только из классов потомков
    protected var protNum:Number = 2;
    
    // private – доступно только в этом классе
    private var privNum:Number = 3;
    
    // internal – доступно только в этом же package,
    // но для вспомогательного класса это означает, 
    // что только для классов описанных в этом файле
    internal var interNum:Number = 4;
        
    // Конструктор всегда public
    function Helper() {
    }
}

// класс SubHelper будет internal
// Потомок вспомогательного класса Helper 
class SubHelper extends Helper {
    
    // Конструктор всегда public
    function SubHelper() {
        trace(pubNum); // OK – это public
        trace(protNum); // OK – т.к. мы являемся потомком
        // trace(privNum); // Error – нет доступа к private
        trace(interNum); // OK – в этом же файле
    }
}
Пример 2.
Код:
package {
    
    import flash.display.Sprite;
    import containers.*; // описано ниже
    
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
        
        // Конструктор всегда public
        function AccessControl() {
            
            // Есть доступ из другого пакета (packages)
            // только если класс public
            var bowl:Bowl = new Bowl(); // OK
            // var basket:Basket = new Basket(); // Error – нет доступа к internal
            
            trace(bowl.pubNum); // OK
            // trace(bowl.protNum); // Error - нет доступа к protected
            // trace(bowl.privNum); // Error - нет доступа к private
            // trace(bowl.interNum); // Error - нет доступа к internal
        }
    }
}
Код:
package containers {

    // Класс public доступен везде
    public class Bowl {
        
        // Переменная public доступна везде
        public var pubNum:Number = 1;
        
        // protected – доступ только у наших потомков
        protected var protNum:Number = 2;
        
        // private – доступ только в этом классе 
        private var privNum:Number = 3;
        
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
            
        // Конструктор всегда public
        function Bowl() {
            
            // Есть доступ к inteneral т.к. в этом же пакете
            var basket:Basket = new Basket();
            
            trace(basket.pubNum); // OK
            // trace(basket.protNum); // Error – нет доступа к protected
            // trace(basket.privNum); // Error - нет доступа к private
            trace(basket.interNum); // OK – в этом же пакете
            
            // clone объявлен как public 
            var basketCopy:Basket = basket.clone();
        }
    }
}
Код:
package containers {
    
    // interal – доступ только в этом пакете (package)
    internal class Basket {
        
        // public – доступ отовсюду
        public var pubNum:Number = 1;
        
        // protected – доступ только у потомков
        protected var protNum:Number = 2;
        
        // private – доступ только в этом классе
        private var privNum:Number = 3;
        
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
        
        // Конструктор всегда public
        function Basket() {
        }
        
        // public – доступ отовсюду
        public function clone():Basket {
            var basket:Basket = new Basket();
            basket.pubNum = pubNum; // OK
            basket.protNum = protNum; // OK – этот же класс
            basket.privNum = privNum; // OK - этот же класс
            basket.interNum = interNum; // OK
            return basket;
        }
    }
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 29.09.2006, 12:14
Огион вне форума Посмотреть профиль Отправить личное сообщение для Огион Найти все сообщения от Огион
  № 12  
Ответить с цитированием
Огион

Регистрация: Aug 2004
Сообщений: 16
19. Абстрактные классы
20. Ключевое слово override

Временно не буду иметь возможность продолжить, минимум до понедельника.


Последний раз редактировалось Огион; 29.09.2006 в 12:57.
Старый 30.09.2006, 22:38
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 13  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
По умолчанию 23 Подход к сортировке глубин

В ActionScript 3.0, подход к управлению глубинами DibsplayObject'ов изменился. Разберем пример, когда мы хотим поставить мувики с наибольшей "y" координатой наверх, а наименьшей в низ, в AS 1-2, мы могли просто назначить им глубину, в ActionScript 3, мы работаем с массивом дочерних объектов, а значит никаких пустых глубин между двумя мувиками быть не может.

Один из способов сделать это, это отсортировать наши мувики в массиве. Сначала мы создадим массив с сылками на на мувики, после чего отсортируем его с помощью свойства sortOn.

Код:
var sortedItems:Array = new Array(mc1, mc2, mc3);
function arrange():void {
    sortedItems.sortOn("y", Array.NUMERIC);
    var i:int = sortedItems.length;
    while(i--){
        if (getChildAt(i) != sortedItems[i]) {
            setChildIndex(sortedItems[i], i);
        }
    }
}
Данный способ не столь краток как AS 1-2 вариант, но делает свое дело.

Nirth: я писал статью-обзор о коллекциях в AS3 и Flex Framework, с некоторыми другими коллекциями можно сотворить более качественную глубинную сортировку.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 30.09.2006, 23:09
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 14  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
По умолчанию 24 Полное Копирование объекта

С помощью класса ByteArray, мы можем копировать полностью объекты. Под полным копированием имеется ввиду, что мы можем копировать так же "дочерние" объекты копируемого объекта, и так далее. Например если у нас есть массив с объектами, и мы копируем его, то кроме самого массива скопируются и объекты.

Пример функции:
Код:
import flash.utils.ByteArray;

function clone(source:Object):* {
    var copier:ByteArray = new ByteArray();
    copier.writeObject(source);
    copier.position = 0;
    return(copier.readObject());
}
Использование:
Код:
newObjectCopy = clone(originalObject);
Nirth: Информация о классе не сохраняется, но мы можем воспользоватся кастингом:
Код:
package {
	import flash.display.*;
	import flash.utils.*;

	dynamic public class Test extends Sprite
	{
		public function Test()
		{
			var user:UserInfo 	= new UserInfo();
				user.name     	= "David";
				user.email    	= "david@david.com";
				user.page	  	= new HomePage();
				user.page.title = "David";
				user.page.url	= "david.com";
				
			trace("user class name:",getQualifiedClassName(user));
			trace("user.page class name:",getQualifiedClassName(user.page));
			
			var user2:UserInfo = clone(user) as UserInfo;
			
			trace("user2 class name:",getQualifiedClassName(user));
			trace("user2.page class name:",getQualifiedClassName(user.page));
			
		}
		
		private function clone(source:Object):* {
		    var copier:ByteArray = new ByteArray();
		    copier.writeObject(source);
		    copier.position = 0;
		    return(copier.readObject());
		}
	}
}

class UserInfo
{
	internal var name:String;
	internal var email:String;
	internal var page:HomePage;
	
	public function UserInfo()
	{		
	}
}
class HomePage
{
	internal var url:String;
	internal var title:String;
	
	public function HomePage()
	{
	}	
}
Данный метод хорошо подходит для чистых DTO/VO объектов.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 30.09.2006, 23:37
Aziz Zaynutdinoff вне форума Посмотреть профиль Отправить личное сообщение для Aziz Zaynutdinoff Посетить домашнюю страницу Aziz Zaynutdinoff Найти все сообщения от Aziz Zaynutdinoff
  № 15  
Ответить с цитированием
Aziz Zaynutdinoff
 
Аватар для Aziz Zaynutdinoff

Регистрация: Feb 2006
Адрес: Moscow
Сообщений: 552
По умолчанию 21. Использование прототипов (prototype)

Прототип объекта в ActionScript — это объект, который существует среди классов, чьи значения доступны для всех экземпляров класса, к которым он (объект) принадлежит. В ActionScript 1.0/2.0 prototype использовался для контроля наследования класса. Когда экземпляр подкласса обращается к переменной, сначала проверяется наличиие этой переменной в текущем экземпляре класса, потом (если не нашел) в прототипе данного класса, потом в прототипе базового класса, и так далее по цепочке наследственности (прототипов), до тех пор пока есть базовые классы.

В ActionScript 3.0 наследование в основном управляется через Класс Наследований и не зависит от прототипа объекта. Однако, прототип объекта всё же существует и обеспечивает большую часть функциональности, как это было и в AS1.0/2.0

Каждый класс и внутриклассовая функция (метод), созданные в ActionScript 3.0 имеют прототипный объект связанный с ними. Для классов прототип имеет имеет аттрибут «read-only», что значит, что вы не можете изменять его значение новым. Однако, это вовсе не значит, что вы не можете задать новую переменную и присвоить ей значение внутри прототипа (иначе наличие прототипа было б бессмысленным ). Прототипы функций изменяемы, что позволяет создавать динамические классы, используя определение классов написанием функций и определением наследований через прототипы («old style» как это делалось раньше).

Пример:

ActionScript Code:
Код:
package {
   
    import flash.display.Sprite;
   
    public dynamic class MyClass extends Sprite {
       
        public function MyClass(){
           
            // prototype = new Object(); // ОШИБОЧНО, нельзя изменить прототип класса
            prototype.newValue = 1; // OK, добавляем (или удаляем) переменные в прототип
           
            trace(this.newValue); // 1
            trace(prototype.toString); // function Function() {}
            trace(prototype.addChild); // undefined
            trace(addChild); // function Function() {}

            // динамическое определение класса («old style»)
            var TempClass:Function = function():void {
                trace("Создаём TempClass");
            }
           
            TempClass.prototype = prototype; // OK, можно утсанавливать наследствования
           
            var tempObject:* = new TempClass(); // «Создаём TempClass»
           
            trace(tempObject.newValue); // 1
        }
    }
}
Помните: обязательно ставить префикс this, обращаясь к динамичным перемнным. Также следует учитывать, что методы класса Object динамичны и определены прототипом (поэтому не могу перекрываться при помощи override). также следует отметить, что tempObject имеет тип «*» вместо TempClass. Потому что TempClass распознаётся всего лишь как функция в AS3.0, не класс, хотя может использоваться и как класс. Все динамические классы (созданные как TempClass) всегда будут распознаваться как функции (хотя и существует тип Class), поэтому созданные таким путём классы всегда порождают собой экземпляры простых объектов.

Старый 01.10.2006, 00:30
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 16  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
По умолчанию 25 Одинаковые имена свойств

В ActionScript 1, мы могли дать свойству экземпляра и свойству класса одинаковое имя, в ActionScript 2 ввели ограничение на это. Теперь в ActionScript 3 мы опять можем это делать.
Код:
package {
   
    import flash.display.Sprite;
   
    public class MyApp extends Sprite {
   
        private var variable:String;
        private static var variable:String;
           
        public function MyApp() {         
            this.variable = "foo";
            MyApp.variable = "bar";
           
            trace(this.variable); // "foo"
            trace(MyApp.variable); // "bar"
            trace(variable); // "foo"
        }
    }
}
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 01.10.2006, 00:52
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 17  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
В ActionScript 3 используется класс flash.events.EventDispatcher для работы с событиями (рассылка, подписка обработчиков). Одна из реализаций данного класса была доступна в ActionScript 2, но это был внешний класс, для работы с событиями в mx.* пакетах. Теперьэто встроенный класс, а значит он работает быстрее.

Кажды раз когда вы хотите обработать событие в ActionScript 3 (например "enterFrame" или "click") вы должны использовать методы EventDispatcher.
Теперь у классов нету методов вроде onEnterFrame, onPress, onLoad.

У EventDispatcher'а есть следующие методы:

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Метод подписывает обработчик события.
type - Тип(имя) события
listener - ссылка на функцию - обработчика
useCapture - используется ли capture фаза или bubbles фаза.
priority - приоритет вызова обработчика
useWeakReference - использовать слабую проверку типов.

dispatchEvent(event:Event):Boolean
Метод рассылает события.
event - Экземпляр класса Event или подкласса, который будет разослан.

hasEventListener(type:String):Boolean
Проверяет есть ли обработчик события у события указанного в параметре type

removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Удаляет обработчик событий, параметры аналогичны addEventListener

willTrigger(type:String):Boolean

Запомните, теперь в качестве слушателя выступают функции а не объекты как это было в случае с addListener.

Теперь о хорошем:
Нам больше не нужно использовать mx.utils.Delegate или подобные ему, теперь this указывает на то что надо.

У класса Event есть свойство target, которое ссылается на экземпляр который разослал событие, при использовании capture или bubble фаз, так же можно испоьзовать свойство currentTarget.

Простой пример
Код:
package {
   
    import flash.display.Sprite;
    import flash.events.Event;
   
    public class MyDispatcher extends Sprite {
       
        public function MyDispatcher() {
            addEventListener("customEvent", handleEvent);
            dispatchEvent(new Event("customEvent"));
        }
       
        private function handleEvent(event:Event):void {
            trace(event.type); // "customEvent"
        }
    }
}
Путем расширения класса EventDispatcher или любого другого класса, который его расширяет (все DisplayObject'ы его расширяют), ваш класс получает возможность разсылать и принимать события, тоесть они могут использовать dispatchEvent и addEventListener.

Но иногда нам нужно наследовать классы, которые не расширяют EventDispatcher, в этом случае мы можем реализовать интерфейс IEventDispatcher, и создать в классе экземпляр EventDispatcher. Тоесть мы используем композицию вместо наследования.

Пример:
Код:
package {
   
    import flash.display.Sprite;
    import flash.events.Event;
   
    public class MyDispatcher extends Sprite {
       
        public function MyDispatcher() {
            var dispatcher:CustomDispatcher = new CustomDispatcher();
            dispatcher.addEventListener("customEvent", handleEvent);
            dispatcher.dispatchEvent(new Event("customEvent"));
        }
       
        private function handleEvent(event:Event):void {
            trace(event.type); // "customEvent"
        }
    }
}

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;

class CustomDispatcher implements IEventDispatcher {

    private var eventDispatcher:EventDispatcher;
       
    public function CustomDispatcher() {
        eventDispatcher = new EventDispatcher(this);
    }
   
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {
        eventDispatcher.addEventListener.apply(null, arguments);
    }
    public function dispatchEvent(event:Event):Boolean {
        return eventDispatcher.dispatchEvent.apply(null, arguments);
    }
           
    public function hasEventListener(type:String):Boolean {
        return eventDispatcher.hasEventListener.apply(null, arguments);
    }
           
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
        eventDispatcher.removeEventListener.apply(null, arguments);
    }
           
    public function willTrigger(type:String):Boolean {
        return eventDispatcher.willTrigger.apply(null, arguments);
    }
}
Класс CustomDispatcher не наследует EventDispatcher, вместо этого он реализует интерфейс IEventDispatcher и содержит в себе экземпляр EventDispatcher, который занимается работой с событиями.

Nirth: В FAQ на flasher.ru есть еще несколько статей о событиях:
Создание и рассылка собственных событий
Обработка событий
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

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

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
По умолчанию 97. Закрытие сетевых соединений

Предыдущие версии Flash плеера не могли оборвать соединение после начала загрузки данных с сервера. Например, если вы начали загружать 50-ти мегабайтный swf в свой ролик, но хотите прекратить загрузку т.к. юзер решил не ждать загрузки а посмотреть что-то другое, у вас ничего не получится. Единственным способом избежать продолжения загрузки было бы закрыть плэйер (например перейти на другую html страницу)

Теперь, исползуя AS3, вы можете остановить соединения и оборвать загрузку запросов сделанных плеером. Рассмотрим класс Loader (flash.display.Loader). Это субкласс displayObjectContainer-а который загружает внешний контент в ваш ролик. Вы можете загружать содержимое в этот класс используя метод load. Что бы оборвать процесс загрузки, вы должны исползовать метод close.

Пример:
Код:
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("image.jpg");
loader.load(request);
addChild(loader);

// abort loading if not done in 3 seconds
var abortID:uint = setTimeout(abortLoader, 3000);

// abort the abort when loaded
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, abortAbort);

function abortLoader(){
    try {
        loader.close();
    }catch(error:Error) {}
}
function abortAbort(event:Event){
    clearTimeout(abortID);
}
Обратите внимания что метод close() был помещён внутрь блока try..catch. Это сделано потому что сlose будет выдавать ошибку (IOError) в том случае если в данный момент нету открытого соединения (хотя в данном случае этого никогда не произойдёт, потому что после окончания загрузки Timeout будет удалён - тем не менее это хорошая практика)
__________________
Хороший отдых - половина работы.

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

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

ActionScript 3 поддерживает регулярные выражения! Реализация аналогична что и в JavaScript. Для создания регулярного выражения можно использовать конструктор RegExp или строку заключенную в слеши (/), например:
Код:
var reCon:RegExp = new RegExp("\\w+", "i");
var reLit:RegExp = /\w+/i;
Методы RegExp:
  • RegExp.exec()
  • RegExp.test()
Методы строк (String), которые работают в регулярными выражениями:
  • String.match()
  • String.replace()
  • String.search()
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

В ActionScript 3 все события имеют свой класс. Базовые события расположены в классе Event (flash.events.Event), события связанные с мышкой в классе MouseEvent ( flash.events.MouseEvent). Остальные классы событий расположены в пакете flash.events и все они потомки базового класса Event.
Вызывая EventDispatcher.dispatchEvent(), в качестве аргумента нужно передать экземпляр класса события Event (или любой потомок от Event). Например, для рассылки события "enterFrame" вызываем dispatchEvent, передавая ему экземпляр класса Event с типом (type) "enterFrame".
Код:
dispatchEvent(new Event("enterFrame"));
Когда вызывается функция обработчика события, ей в качестве аргумента передается этот экземпляр класса, из свойств которого можно узнать подробности о событии. Например, в type записан тип события.
Код:
addEventListener("enterFrame", eventHandler);
dispatchEvent(new Event("enterFrame"));
...
private function eventHandler(event:Event):void {
    trace(event.type); // "enterFrame"
}
Тип события это строка (String), все возможные типы событий записаны в константах классов событий. Например, событие "enterFrame" лучше записывать так: Event.ENTER_FRAME. События от мышки расположены в классе MouseEvent, например, событие по клику мышки: MouseEvent.CLICK. Для работы с событиями лучше использовать эти константы, чем писать тип события строкой, это убережет вас от ошибок и опечаток. Пример выше правильнее записать так:
Код:
addEventListener(Event.ENTER_FRAME, eventHandler);
dispatchEvent(new Event(Event.ENTER_FRAME));
Для генерации своих событий, можно использовать класс Event, указывая свои типы событий или же, создать класс потомок от Event, прописав в нем константы новых типов событий.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

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


 


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


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