Просмотр полной версии : Создать событие в классе
GFreemen
21.09.2007, 17:39
Добрый день, необходимо в AS2 классе создать событие и подписаться на него...
class work_area_class extends MovieClip {
private var flag:Boolean=false;//флаг для проверки зажатия средней клавишы
function work_area_class() {
AsBroadcaster.initialize(this);
this.onEnterFrame=function(){
if (Key.isDown(4)==true&&flag==false) {//если нажали В ПЕРВЫЙ РАЗ
flag=true;//флаг для того чтобы событие не гененрировалось
//постоянно, а только при первом нажатии
this.broadcastMessage("onMiddle");
}
if (Key.isDown(4)==false&&flag==true) {//если ОТЖАЛИ
flag=false;
this.broadcastMessage("offMiddle");
}
}
this.addListener(this);
this.onMiddle=function(){
trace("нажата");
}
this.offMiddle=function(){
trace("ОТЖАТА");
}
}
}
На что флеш отвечает:
There is no method with the name 'addListener'.
this.addListener(this);
There is no property with the name 'onMiddle'.
this.onMiddle=function(){
There is no property with the name 'offMiddle'.
this.offMiddle=function(){
Помогите разобраться в чем ошибка?
(кроме как в ДНК)
Кто вас так классы научил называть?
Смотрите темы про EventDispatcher на форуме.
GFreemen
21.09.2007, 21:37
Да, собственно, говоря никто не учил...
Так, с миру по нитке, и на основании своего собственного опыта.
В теле программы (или как это назвать, короче на 1 кадре) этот вариант работает...
А за такое я даже не слышал. Сейчас буду искать.
Кстати в хелпе на сам Флеш 8 ссылка на EventDispatcher отсутствует полностью... :(
Вы хоть один стандартный класс видели, чтобы так назывался?
class WorkArea extends MovieClip {
public var broadcastMessage:Function;
//.....
}
Ну и еще кое-что надо дописать - то, что будет добавлено бродкастером / диспатчером. У вас и ругается - нет свойств и методов.
А сажать проверку на энтерфрейм.. мм..
GFreemen
21.09.2007, 22:30
Всем спасибо.
1)Название класа не соответствует букве и духу ООП - но главное что бы работало. Для себя делаю - мне так понятнее.
2)Добавил
public var addListener:Function;
public var onMiddle:Function;
public var offMiddle:Function;
И, о, чудо - все работает.
3)А чем не нравится проверка нажатия в onEnterFrame?
Mr. Fixit
22.09.2007, 01:47
нагружает комп. Пользуйся событием object.onKeyDown.
Чтобы отловить событие нажатия колесика мыши, без onEnterFrame или setInterval не обойтись, так же как и при отлове нажатия правой кнопки мыши, левую можно словить onMouseDown + Key.isDown.
А так не лучше?
class WorkArea extends MovieClip {
//радиовещание
public var addListener:Function;
public var removeListener:Function;
public var broadcastMessage:Function;
//флаг для проверки зажатия средней клавишы
private var flag:Boolean=false;
function WorkArea() {
AsBroadcaster.initialize(this);
this.addListener(this);
}
private function onEnterFrame():Void{
//..
}
private function onMiddle():Void{
//..
}
private function offMiddle():Void{
//..
}
GFreemen
22.09.2007, 14:58
2 Kikasso
Простите, вы предлагаете onEnterFrame(),onMiddle(),offMiddle() вынести за перделы тела функции WorkArea()?
Попребовал:Attribute used outside class.
private function onEnterFrame():Void{ и т.д.
Может быть я что-то неправильно записал...
Но по-любому, что изменится если onEnterFrame() будет проверять нажатие кнопки вне WorkArea() или в ней?
Функция WorkArea -- это конструктор класса WorkArea. В конструкторе обычно происходит инициализация свойств и методов, определяются они вне конструктора.
2 Kikasso
Простите, вы предлагаете onEnterFrame(),onMiddle(),offMiddle() вынести за перделы тела функции WorkArea()?
Попребовал:Attribute used outside class.
private function onEnterFrame():Void{ и т.д.
Может быть я что-то неправильно записал...
Но по-любому, что изменится если onEnterFrame() будет проверять нажатие кнопки вне WorkArea() или в ней?
За что вынести простите? :eek:
Изменится - не будет функций внутри функций. Потом поймете.
Вынести за пределы конструктора, не класса.
GFreemen
23.09.2007, 00:13
Извиняюсь за свою жутко неправильную формулировку.
Я так понимаю строками
public var addListener:Function;
public var removeListener:Function;
public var broadcastMessage:Function;
мы как раз говорим конструктору, что у него будут такие функции, методы.
При записи function WorkArea() {
AsBroadcaster.initialize(this);
this.addListener(this);
}
private function onEnterFrame():Void{
//..
}
private function onMiddle():Void{
//..
}
private function offMiddle():Void{
//..
}
Флеш ругается Attribute used outside class.
private function onEnterFrame():Void{ и т.д.
а при записи
function WorkArea() {
AsBroadcaster.initialize(this);
this.addListener(this);
private function onEnterFrame():Void{
//..
}
private function onMiddle():Void{
//..
}
private function offMiddle():Void{
//..
}
}ВСЕ РАБОТАЕТ
объясните как так?
Таки уже ж объяснили. Читайте пост выше: "Вынести за пределы конструктора, не класса".
GFreemen
23.09.2007, 01:44
Океей.
Спасибо всем большое.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.