Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не срабатывает addEventListener (http://www.flasher.ru/forum/showthread.php?t=135138)

dixlofos 16.01.2010 17:02

Не срабатывает addEventListener
 
всем хеллоу!:bye:

Есть у меня класс Craft :
Код AS3:

package classes
{
 
        import flash.display.MovieClip;
        import flash.events.*;
        import classes.assisted.keyPressed;
 
        public class Craft extends MovieClip
        {
                var kp = new keyPressed();
 
                public function Craft():void
                {
                        trace("class craft called");       
                        addEventListener(Event.ENTER_FRAME, ef);                                               
                }
 
                public function ef(e:Event)
                {                       
                    kp.keyP(this);               
                }
        }
}

и есть у меня другой класс keyPressed

Код AS3:

package classes.assisted
{
        import flash.events.*;
 
        public class keyPressed
        {               
                public function keyPressed():void
                {
                        trace("class keyPressed called");                               
                }
 
                public function keyP(obj):void
                {
                        obj.addEventListener(KeyboardEvent.KEY_DOWN, kd);       
                        obj.y-=1;
                }
 
                public function kd(event:KeyboardEvent)
                {
                        trace("^_^");
                        //trace(event.keyCode);
                }
        }
}

и после компиляции компилятор пишет "class keyPressed called", а как бы я по клавишам не стучал, то "^_^" некак не хочет написаться, хотя объект я явно передал классу, тк он медленно но верно ползет вверх:)
Почему такая несправедливость в мире?
Неужто мне прийдеться передовать не только сам объект, но и коды нажатых клавишь?

wvxvw 16.01.2010 17:14

1. Названия классов с прописной.
2. super() первой строчкой в конструкторе.
3. Вы каждый кадр вызываете addEventListener() - зачем?
4. переменные, аргументы и возвращаемый тип функций должны быть типизированы.
5. визуальные объекты диспатчат события клавиатуры только когда они в фокусе (например, если вы нажали клавишу Tab чтобы на них перевести фокус), иначе события клавиатуре диспатчатся из stage.
6. Не пишите звездочки в импортах - используйте нормальный редактор кода, где импорты подставляются сами.

dixlofos 16.01.2010 18:26

Цитата:

Сообщение от wvxvw (Сообщение 879597)
2. super() первой строчкой в конструкторе.

если чесно не очень понял зачем это, мой класс вдеь нечего не расширяет

Цитата:

Сообщение от wvxvw (Сообщение 879597)
3. Вы каждый кадр вызываете addEventListener() - зачем?

исправил, действительно глупо

Цитата:

Сообщение от wvxvw (Сообщение 879597)
4. переменные, аргументы и возвращаемый тип функций должны быть типизированы.

ну это я потом все сделаю, когда основную кость доделаю =)

Цитата:

Сообщение от wvxvw (Сообщение 879597)
5. визуальные объекты диспатчат события клавиатуры только когда они в фокусе (например, если вы нажали клавишу Tab чтобы на них перевести фокус), иначе события клавиатуре диспатчатся из stage.

когда я в классе keyPressed пишу в конструкторе "stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);", то компилятор мне выдает:
"1120: Обращение несуществующего свойства stage."

что же делать-то?!:wacko:

dex157 16.01.2010 18:41

А у вот тоже вопрос, уже очень давнишний, но он в тему, поэтому решил не делать новый тред..)
При запуске выскакивает варнинг : Warning: 1090: Ошибка миграции: Flash Player не запускает обработчик событий onMouseDown автоматически во время выполнения в ActionScript 3.0. Сначала нужно зарегистрировать этот обработчик для события, используя addEventListener ("mouseDown", callback_handler).

Привязка(addEventListener) происходит после объявления Sprite, и добавления его на stage

при этом не срабатывает первый щелчок на моем спрайте, все последующие работают..о0

в чем может быть проблема..? 0о

dixlofos 16.01.2010 19:52

dex157
не очень ты тут в тему, но вот - держи:
http://help.adobe.com/ru_RU/AS3LCR/F...imeErrors.html
иши там свое 1090

wvxvw 16.01.2010 20:12

>> если чесно не очень понял зачем это, мой класс вдеь нечего не расширяет
Классов, которые ничего не расширяют в AS3 не бывает.

что же делать-то?!
>> Дождаться когда стейдж станет доступным, например после события Event.ADDED_TO_STAGE

dex157:
Это дурацкое предупреждение, просто вам говорят о том, что onMouseDown - это неудачное название для функции потому что такое использовалось в AS2.

dex157 16.01.2010 20:26

wvxvw
Спасибо большое..)

Psycho Tiger 16.01.2010 20:33

Цитата:

Классов, которые ничего не расширяют в AS3 не бывает.
Постой постой, класс
Код AS3:

class Hello{
 
}

получается расширяет Object? Хотя, не совсем понимаю зачем вызывать суперкласс Object`а )

wvxvw 16.01.2010 22:01

Для порядка. Хуже вы точно этим не сделаете.

dixlofos 17.01.2010 21:27

Цитата:

Сообщение от wvxvw (Сообщение 879653)
что же делать-то?!
>> Дождаться когда стейдж станет доступным, например после события Event.ADDED_TO_STAGE

вся беда в том, что объект уже на сцене, и почему я не могу задействовать stage. я не понимаю.
Объясните пажалуйста..

Psycho Tiger 17.01.2010 22:22

Цитата:

Сообщение от dixlofos (Сообщение 879797)
вся беда в том, что объект уже на сцене, и почему я не могу задействовать stage. я не понимаю.
Объясните пажалуйста..

Значит не на сцене. Может, просто куда то вложен, но на сцене он не отображается.

dimarik 18.01.2010 00:55

Цитата:

Сообщение от dixlofos (Сообщение 879595)
всем хеллоу!:bye:
Есть у меня класс Craft :
<skipped>
а как бы я по клавишам не стучал, то "^_^" некак не хочет написаться

А если дать фокус Craft'у?

Код AS3:

public function Craft():void {
    super();
    ...
    super.stage.focus = this;
}


etc 18.01.2010 08:16

Цитата:

Сообщение от dimarik (Сообщение 879845)
хочет написаться

А если дать фокус Craft'у?

Код AS3:

public function Craft():void {
    super();
    ...
    super.stage.focus = this;
}

[/quote]

Ого, Димка, а ты уверен, что у него Craft рутом повешен?

dixlofos 18.01.2010 20:31

Psycho Tiger
даю руку на отсечение, что на сцене! =]
Сам мышкой перетащил из библиотеки, и вкладывать его некуда он единственный мувик в флэшке.

dimarik
Не помогло

etc
а что значит "рутом повешен"?


...
В ходе дальнейших экспериментов, решил попробовать решить проблему через наследование, и нашел вот такую странную закономерность:

Создал fla файл, создал мувиклип Задал ему базовый класс (ну тот что в свойствах мувиклипа так назван, прошу меня не ругать опять за эту, совсем не мою выдумку:)):
Код AS3:

package classes
{
        import flash.display.MovieClip;
 
        public class R2Class extends MovieClip
        {
                public function R2Class():void
                {
                        trace("r2 class called");
                }
        }
}

потом создал опять в другом пакете другой класс, расширяющий класс "R2Class" :
Код AS3:

package classes.assisted
{
        import classes.R2Class;
 
        public class AssistedClass extends R2Class
        {
                public function AssistedClass():void
                {
                        trace("assistedClass called");                       
                }
        }
}

ну и есть у меня еще и третий класс, который тоже привязан к мувиклипу (ну или мувиклип привязан к нему), который вызывает класс "AssistedClass" :
Код AS3:

package classes
{
        import flash.display.MovieClip;
        import classes.assisted.AssistedClass;
 
        public class R1Class extends MovieClip
        {
                var AC:AssistedClass = new AssistedClass();
 
                public function R1Class():void
                {
                        trace("r1class called");                               
                }
        }
}

и после компиляции, многоуважаемый компилятор пишет мне, что все пучком:quiet:
Код:

r2 class called
assistedClass called
r1class called
r2 class called

Но если я в функции конструкторе класса "R2Class" пишу
Код AS3:

trace(stage.stageHeight);

То компилятор выдает мне:
Код:

r2 class called
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at classes::R2Class()
        at classes.assisted::AssistedClass()
        at classes::R1Class()
        at r1()
        at flash.display::Sprite/constructChildren()
        at flash.display::Sprite()
        at flash.display::MovieClip()
r2 class called
400

тобишь классы "R1Class" и соответственно "AssistedClass" не вызываються, и это меня порядком бесит >_<.
Почему такая несправедливость в мире ActionScript3.0 ?

Добавлено через 4 минуты
Вобще мне больше всего интересно как делаються профессиональные крупные проекты. Управляют ли там отдельные классы отображаемыми объектами полностью, или вспомогательные классы используються лишь для приема-возврата значений?

Я клоню к тому, что может я вобще порю ужасную ерись и все делаеться совсем не так? :)

fljot 18.01.2010 20:58

Цитата:

Сообщение от dixlofos (Сообщение 880038)
var AC:AssistedClass = new AssistedClass();
...
Но если я в функции конструкторе класса "R2Class" пишу
Код AS3:

trace(stage.stageHeight);

То компилятор выдает мне:

Экземпляр AssistedClass (переменная AC, которая кстати не должна начинаться с заглавной буквы) в момент создание (т.е. вызова конструктора) НЕ НАХОДИТСЯ в дисплей листе, поэтому его свойство stage нулевое. Слушайте Event.ADDED_TO_STAGE

Psycho Tiger 19.01.2010 15:57

Угу, fljot прав. Давай сюда руку)

dixlofos 20.01.2010 19:54

Вот спасибо, друзья =)
Для потомков :D оставлю запись решения:

Базовый класс мувиклипа:
Код AS3:

package classes
{
        import flash.display.MovieClip;
        import flash.events.*;
 
        import classes.assisted.AssistedClass;                       
 
        public class R1Class extends MovieClip
        {
                var AC:AssistedClass = new AssistedClass();
 
                public function R1Class():void
                {
                        addChild(AC);
                        trace("r1class called");       
                }
        }
}

Вспомогательный класс:

Код AS3:

package classes.assisted
{
        import flash.events.*;
        import flash.display.MovieClip;
 
        public class AssistedClass extends MovieClip
        {
                public function AssistedClass():void
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, ats);
                        trace("assistedClass called");                       
                }
                function ats(e:Event):void
                {
                        trace("SS");
                        trace(stage.stageHeight);       
                }
        }
}

всё трасируеться, все работает =]

Psycho Tiger 20.01.2010 21:43

Как то не круто. Мы прокачаем ваш класс )
Код:

package classes.assisted
{
        import flash.events.*;
        import flash.display.MovieClip;
 
        public class AssistedClass extends MovieClip
        {
                public function AssistedClass() //тип у конструктора - это круто)
                {
if (stage) ats();
else super.addEventListener(Event.ADDED_TO_STAGE, ats);
                        trace("assistedClass called");                       
                }
                private function ats(e:Event = null):void
                {
super.removeEventListener(Event.ADDED_TO_STAGE, ats);
                        trace("SS");
                        trace(stage.stageHeight);       
                }
        }
}



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

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