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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.01.2016, 03:54
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 1  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
По умолчанию Собственные события

Доброго.
Начал читать про собственные события, гугл/Мук, но что-то я до конца так и не понял что и как работает. Вот отрывок из Мука
Код AS3:
package
{
	import flash.events.Event;
 
	public class ToggleEvent extends Event
	{
		public static const TOGGLE:String = "toggle";
		public var isOn:Boolean;
 
		public function ToggleEvent(type:String, 
									bubblts:Boolean = false, 
									cancable:Boolean = false, 
									isOn:Boolean = false)
		{
			super(type, bubblts, cancable);
			this.isOn = isOn;
		}
		public override function clone ():Event
		{
			return new ToggleEvent (type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем?
		}
 
		public override function toString ():String
		{
			return formatToString ("ToggleEvent", "bubbles",
									"cancable", "EventPhase", "isOn");//А это вообще не пойму для чего нужно
		}
	}
}

Старый 13.01.2016, 05:52
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Код AS3:
public override function clone():Event {
	return new ToggleEvent(type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем?
}
Если не переопределить метод clone(), то твое событие будет скопировано без этого самого isOn, ради которого (в данном примере) мы вообще создали собственный Event. Ты переопределяешь его, чтобы он возвращал копию себя не как Event(type, bubbles, cancelable) (по умолчанию), а именно как ToggleEvent(type, bubbles, cancelable, isOn). Следует отметить, что метод clone() вызывается порой неявно, так что переопределять его в кастомных события обязательно.

Код AS3:
public override function toString():String {
	return formatToString("ToggleEvent", "bubbles",
	"cancable", "EventPhase", "isOn"); //А это вообще не пойму для чего нужно
}
А это для отладки. Не обязательно, но удобства может прибавить.
__________________
Поймай яблоко 2!

Старый 13.01.2016, 15:26
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Если не переопределить метод clone(), то твое событие будет скопировано без этого самого isOn, ради которого (в данном примере) мы вообще создали собственный Event. Ты переопределяешь его, чтобы он возвращал копию себя не как Event(type, bubbles, cancelable) (по умолчанию), а именно как ToggleEvent(type, bubbles, cancelable, isOn). Следует отметить, что метод clone() вызывается порой неявно, так что переопределять его в кастомных события обязательно.
Что значит "возвращал копию себя"?
Цитата:
А это для отладки. Не обязательно, но удобства может прибавить.
Если можно, приведите пример, хочу разобраться

Добавлено через 3 минуты
Код AS3:
public static const TOGGLE:String = "toggle";
Почему String? Да, вываливает ошибку, если другой тип, но почему?
Мы же только тут и задаём значение "toggle", тут ведь можно написать что угодно?

Старый 13.01.2016, 15:59
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Почему String? Да, вываливает ошибку, если другой тип, но почему?
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Цитата:
Если можно, приведите пример, хочу разобраться
Код AS3:
trace(event);
Цитата:
Что значит "возвращал копию себя"?
Каждый EventDispatcher в цепочке передачи события отдает подписчикам КОПИЮ полученного события, а не ссылку на некий изначальный объект (экземпляр) события. Почему? Да потому что любой объект может вносить изменения в полученное событие перед тем как отдать его дальше — например, записать свои данные в его свойства, которые интересуют следующего получателя. Но, если событие передавать как ссылку на один единственный объект, то предыдущие получатели события при обращении к его свойствам получат не изначальные — предназначенные для них, а обновленные после них значения, предназначенные не им.
__________________
Reality.getBounds(this);

Старый 13.01.2016, 16:21
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
Что значит "возвращал копию себя"?
Этот метод возвращает клон события (неожиданное поведение для метода с таким названием, isn't it?) — новый экземпляр класса ToggleEvent, у которого type, bubbles и cancelable (а в нашем кастомном событии еще и isOn) такие же. Если не переопределишь, то это будет новый экземпляр уже другого класса — Event (без isOn), как и определено в суперклассе Event, от которого ты наследуешь свой ToggleEvent.

Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
Если можно, приведите пример, хочу разобраться.
Код AS3:
function onToggleEvent(event:ToggleEvent):void {
    trace(event);
}
Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
Почему String?
Потому что в Event определено, что type должен быть типа String. Разумеется, можно сделать свой собственный type не строковым. Тогда при передаче его в качестве аргумента конструктора суперкласса (вот этот вот super(…) у тебя в конструкторе) просто придется дописать к нему .toString() (или сделать из не строкового type строку еще каким-то своим индивидуальным способом). Вот только зачем это нужно, если type — является лишь меткой, позволяющей понять, что именно за событие произошло. Если твоему событию нужен какой-то идентификатор (а это таки бывает нужно, когда доходит до кастомных событий) — сделай его еще одним полем класса ToggleEvent точно так же, как это сделано с полем isOn.

Добавлено через 48 секунд
P.S. Как мы синхронненько
__________________
Поймай яблоко 2!

Старый 14.01.2016, 02:36
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 6  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
спасибо, господа, что-то начинает прояснятся.
Вот код следующего класса из Мука, тот же пример идёт
Код AS3:
package
{
	import flash.display.Sprite;
 
	public class ToggleSwitch extends Sprite
	{
		private var isOn:Boolean;
 
		public function ToggleSwitch()
		{
			isOn = false;
		}
 
		public function toggle():void
		{
			isOn = !isOn;
			dispatchEvent(new ToggleEvent(ToggleEvent.TOGGLE, true, false, isOn));//вот тут не ясно, 
//мы тут получается в "ручную" объявляет о свершении события
//т.е. все слушатели, которые подписаны на это событие, получат его, так?
//Но чтобы объявить о событии, мы должны в ручную вызвать функцию "toggle()"?
		}
	}
}
а ещё натыкался где-то, что расширяют класс EventDispatcher, тогда как логика меняется?

Старый 14.01.2016, 03:21
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
//вот тут не ясно
Скорее дела обстоят так. Мы вызываем у экземпляра класса ToggleSwitch метод toggle(), который переключает туда-сюда состояние isOn. Так вот если бы не dispatchEvent(…), то все происходило бы по-тихому. Даже более: из-за того, что поле isOn приватное, о его состоянии снаружи вообще никак было бы не узнать (ну, за некоторым исключением, которое здесь несущественно).

Выходит, что при "щелчке" (вызове vетода toggle) согласно архитектуре приложения-примера из книжки нужно всякий раз сообщать всем заинтересованным*, что isOn сменил значение, и, что самое важное, еще и указать, какое именно значение сейчас имеет этот самый isOn. Это конечно лучше было сделать по-другому (в данном случае). Но для примера автор решил показать, как можно это значение передать через кастомное событие, которое не только сообщает смене значения определенного поля, но и содержит это значение.

* Под заинтересованными понимаются все, кто подписался на это событие от этого экземпляра класса ToggleSwitch или кого-то из его родителей, потому что ToggleSwitch наследуется от Sprite, а событие посылается с разрешением на "всплытие" — второй аргумент в конструкторе new ToggleEvent(…) — true.
__________________
Поймай яблоко 2!

Старый 14.01.2016, 09:23
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
а ещё натыкался где-то, что расширяют класс EventDispatcher, тогда как логика меняется?
У тебя класс расширяет спрайт. Спрайт тоже расширяет EventDispatcher в цепочке наследования, пллюс добавляяет возможности дисплей объекта. Так вот если тебе не нужно никуда на экран добавлять экземпляры класса, но нужно чтобы он умел отправлять и принимать события (например начала или окончания игры или события свзянные со звуком или сетью), то можешь вместо extends Sprite писать extends EventDispatcher

Старый 14.01.2016, 11:05
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Мне кажется, это вопрос скорее о телепатии. Вопрос о том, откуда берутся события. Поскольку до того, как впервые сделать своё собственное событие, мы только ловили уже готовые, непонятно откуда взявшиеся, у многих новичков есть такое интуитивное "понимание", что события сами собой возникают и рассылаются "на каждый чих", типа — поменяли координату у клипа на 1 пиксель — можно поймать какое-то событие об этом в другом месте (подразумевается "в любом другом месте" ), надо только понять, какое)) Необходимость посылать свое событие "вручную" кажется какой-то нелепостью, ведь до этого события нужны были, чтобы о чем-то "узнать", а тут получается какая-то "бессмысленная" система — узнал о чем-то –> послал событие. Потому что мозг еще не думает о том, что находится вне класса, о том что кто-то ТАМ хотел бы тоже "узнать" и именно для них мы создаем и посылаем Событие.

и да, функция таки должна называться switch (переключить, поменять состояние), а не toggle (традиционно используется для указания, что нужно сохранить, зафиксировать состояние)
__________________
Reality.getBounds(this);

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

Регистрация: Jun 2014
Сообщений: 558
Wolsh значит вариант телепатии прокатит, если в класс добавить слушатель, к примеру, энтер_фрейм, с помощью которого мы будем проверять, поменялся ли isOn, и в случаи изменения - диспатчить событие, так? Я хочу уменьшить зависимости кода, как вариант правильно?

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

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

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


 


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


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