PDA

Просмотр полной версии : Создать событие в классе


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(){

Помогите разобраться в чем ошибка?
(кроме как в ДНК)

etc
21.09.2007, 19:02
Кто вас так классы научил называть?
Смотрите темы про EventDispatcher на форуме.

GFreemen
21.09.2007, 21:37
Да, собственно, говоря никто не учил...
Так, с миру по нитке, и на основании своего собственного опыта.
В теле программы (или как это назвать, короче на 1 кадре) этот вариант работает...
А за такое я даже не слышал. Сейчас буду искать.
Кстати в хелпе на сам Флеш 8 ссылка на EventDispatcher отсутствует полностью... :(

etc
21.09.2007, 21:39
Вы хоть один стандартный класс видели, чтобы так назывался?

Kikasso
21.09.2007, 21:45
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.

udaaff
22.09.2007, 02:14
Чтобы отловить событие нажатия колесика мыши, без onEnterFrame или setInterval не обойтись, так же как и при отлове нажатия правой кнопки мыши, левую можно словить onMouseDown + Key.isDown.

Kikasso
22.09.2007, 13:02
А так не лучше?
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() или в ней?

udaaff
22.09.2007, 15:06
Функция WorkArea -- это конструктор класса WorkArea. В конструкторе обычно происходит инициализация свойств и методов, определяются они вне конструктора.

Kikasso
22.09.2007, 15:46
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{
//..
}
}ВСЕ РАБОТАЕТ
объясните как так?

udaaff
23.09.2007, 00:31
Таки уже ж объяснили. Читайте пост выше: "Вынести за пределы конструктора, не класса".

GFreemen
23.09.2007, 01:44
Океей.
Спасибо всем большое.