Форум 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)

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, время: 15:41.

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