Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к экземпляру класса и eventDispatcher (нубские вопросы) (http://www.flasher.ru/forum/showthread.php?t=174578)

reQuiem 28.01.2012 20:54

Обращение к экземпляру класса и eventDispatcher (нубские вопросы)
 
Привет.

Пара вопросов :)


Main.as

Код AS3:

package 
{
 
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.DisplayObject;
        import elements.Tower;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author reQuiem
        */

        public class Main extends Sprite
        {
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        addTower();
                }
 
                private function addTower():void
                {
                        var tower_1: Tower = new Tower();
                        this.addChild(tower_1);
                        tower_1.x = 300;
                        tower_1.y = 300;
                        tower_1.addEventListener("towerClick", towerClicked);
                        trace("tower ready");
                }
 
                public function towerClicked (e:Event): void
        {
                                trace("tower clicked");
                                stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveFunc);
                                stage.addEventListener(MouseEvent.MOUSE_UP, mouseUPFunc);
        }
                private function mouseMoveFunc (e:MouseEvent ):void
                {
                        trace("mouse MOVE");       
                }
 
                private function mouseUPFunc (e:MouseEvent ):void
                {
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveFunc);
                }
 
        }
 
}



Tower.as
Код AS3:

package elements 
{
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.DisplayObject;
        import flash.events.EventDispatcher;
        /**
        * ...
        * @author reQuiem
        */

        public class Tower extends MovieClip
        {
 
                public function Tower()
                {
                        this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownFunc);
                }
 
 
                public function mouseMoveFunc():void
                {
                        trace("OK");
                }
 
                public function mouseDownFunc(e:MouseEvent): void
        {
                        dispatchEvent(new Event("towerClick"));
        }
        }
 
}


Вопросы:

1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?

просто addEventListener("towerClick", towerClicked); не ловит, а tower_1.addEventListener("towerClick", towerClicked); ловит.

2) не получается вызвать методы( и менять значение переменных) через экземпляр класса в функции отлично от той где я его создаю.



то есть сейчас в мейне у меня есть

Код AS3:

var tower_1: Tower = new Tower();
this.addChild(tower_1);
tower_1.x = 300;


но если я попытаюсь изменить tower_1.x в любом другом месте - выдает ошибку. ( в это время tower_1 гарантированно существует и например ловит\кастует события).


Вот пока все. Знаю что вопросы очень нубские но пытаясь пересесть кадров они мне пока не даются.
Спасибо.

Inet_PC 28.01.2012 21:55

Цитата:

1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?
Ну еще к экземплярам, любого другого класса, который шлет этоже сообщение. В общем случае да подписываться нужно к тому, кто шлет событие. (Ну еще можно подписаться к контейнеру в котором содержится экземляр DisplayObject, рассылающий событие, это относится только к displayList и если событие всплывающее-bubbles).
Цитата:

2) не получается вызвать методы( и менять значение переменных) через экземпляр класса в функции отлично от той где я его создаю.
Это происходит потому, что вы теряете ссылку на объект, так как объявляете ее локально и по завершению функции она теряется нужно как то так:
Код AS3:

public class Main extends Sprite 
        {
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        addTower();
                }
 
                private var tower_1:Tower;
 
                private function addTower():void
                {
                        tower_1 = new Tower();
                        this.addChild(tower_1);
                        tower_1.x = 300;
                        tower_1.y = 300;
                        tower_1.addEventListener("towerClick", towerClicked);
                        trace("tower ready");
                }}


reQuiem 29.01.2012 01:19

1) ок. понял.

2) ага, если у меня известное количество объектов ясно, а что если я добавляю эти объекты по ходу дела и не знаю сколько у меня будет экземпляров и каких объектов? Создавать для каждого возможно появящегося типа(класса) свою переменную в мейне заранее?

Wolsh 29.01.2012 01:50

Цитата:

1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?
Путаница в формулировках. Подписать НА ПОЛУЧЕНИЕ СОБЫТИЯ вы можете кого угодно. Но рассылать событие будет экземпляр или его контейнер в случае всплытия, и к ним вы ДОБАВЛЯЕТЕ СЛУШАТЕЛЬ (addEventListener). Слушатель это метод (обработчик события, handler), который указывается вторым параметром в addEventListener. Вы добавляете его объекту как слушателя событий, которые будет рассылать этот объект.

2) Конечно нет. Ссылки на экземпляры не обязательно должны храниться в приватных полях класса напрямую, они могут храниться в массиве или векторе, или добавленные как дети дисплейлиста в контейнере. Но в любом случае на объект должна быть хотя бы одна ссылка, иначе он будет удален из памяти Сборщиком Мусора.
Что касается событий, которые эти объекты ыбудут рассылать – вы подпишитесь на них сразу после создания объекта, а в обработчике событий узнать, какой именно экземпляр послал событие, можно из свойств объекта События, который непременно получает слушатель-обработчик. У этого объекта есть поля target и currentTarget.

reQuiem 29.01.2012 16:47

спасибо, разобрался.


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

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