Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   странное поведение e.currentTarget (http://www.flasher.ru/forum/showthread.php?t=211154)

бакуард 04.07.2015 08:53

странное поведение e.currentTarget
 
Доброго времени суток!!!

Есть главный класс Main. В основном конструкторе класса вызывается функция размещающая кнопки на сцене.
Затем для каждой кнопки создается слушатель событий.В функции ссылающейся на слушатель кнопки buildVertical(далее речь пойдет о ней, т.к. для других кнопок я ещё ничего не сделал) создается экземпляр класса BuildVerticalClass. К этому экземпляру привязывается слушатель события.

Код AS3:

package cellAndRoadPG{
 
        import cellAndRoadPG.cellPG.*;
        import cellAndRoadPG.roadPG.*;
        import cellAndRoadPG.gameButtonsPG.*;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Main extends MovieClip{
                //в главном конструкторе класса вызовем функции генерации карты.
                internal var main = this;//переменная для обращения к классу Main
                public function Main (){
                    fGenerationlocationCell();
                        fPlaceButtons();
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, fAllowBuildRoad);
                }
 
//какой-то код
 
internal var build:Boolean = false;
 
          //разместим кнопки на игровой панели и создадим для каждой из них обработчик событий.
        internal function fPlaceButtons(){
                        var buildVertical:BuildVerticalClass = new BuildVerticalClass();
                        main.addChild(buildVertical);
                        buildVertical.addEventListener(MouseEvent.CLICK, fBuildVertical);
                    function fBuildVertical(e:MouseEvent){
                            var roadVertical:RoadVerticalClass = new RoadVerticalClass();
                                roadVertical.x = mouseX;
                                roadVertical.y = mouseY;
                                main.addChild(roadVertical);
                                roadVertical.startDrag();
                                roadVertical.addEventListener(Event.ENTER_FRAME, fCheckHitWithCell);/*функция ищущая пересечение дороги и клетки, и размещающая
                                дорогу в случае соблюдения условий описанных внутри функции*/

                    }
 
                        var buildHorizontal:BuildHorizontalClass = new BuildHorizontalClass();
                        main.addChild(buildHorizontal);
                        buildHorizontal.addEventListener(MouseEvent.CLICK, fBuildHorizontal);
                    function fBuildHorizontal(e:MouseEvent){
                            var roadHorizontal:RoadHorizontalClass = new RoadHorizontalClass();
                                roadHorizontal.x = mouseX;
                                roadHorizontal.y = mouseY;
                                main.addChild(roadHorizontal);
                                roadHorizontal.startDrag();
                    }
 
                        var buildRightUp:BuildRightUpClass = new BuildRightUpClass();
                        main.addChild(buildRightUp);
                        buildRightUp.addEventListener(MouseEvent.CLICK, fBuildRightUp);
                    function fBuildRightUp(e:MouseEvent){
                            var roadRightUp:RoadRightUpClass = new RoadRightUpClass();
                                roadRightUp.x = mouseX;
                                roadRightUp.y = mouseY;
                                main.addChild(roadRightUp);
                                roadRightUp.startDrag();
                    }
 
                        var buildRightDown:BuildRightDownClass = new BuildRightDownClass();
                        main.addChild(buildRightDown);
                        buildRightDown.addEventListener(MouseEvent.CLICK, fBuildRightDown);
                    function fBuildRightDown(e:MouseEvent){
                            var roadRightDown:RoadRightDownClass = new RoadRightDownClass();
                                roadRightDown.x = mouseX;
                                roadRightDown.y = mouseY;
                                main.addChild(roadRightDown);
                                roadRightDown.startDrag();
                    }
 
                        var buildLeftDown:BuildLeftDownClass = new BuildLeftDownClass();
                        main.addChild(buildLeftDown);
                        buildLeftDown.addEventListener(MouseEvent.CLICK, fBuildLeftDown);
                    function fBuildLeftDown(e:MouseEvent){
                            var roadLeftDown:RoadLeftDownClass = new RoadLeftDownClass();
                                roadLeftDown.x = mouseX;
                                roadLeftDown.y = mouseY;
                                main.addChild(roadLeftDown);
                                roadLeftDown.startDrag();
                    }
 
                        var buildLeftUp:BuildLeftUpClass = new BuildLeftUpClass();
                        main.addChild(buildLeftUp);
                        buildLeftUp.addEventListener(MouseEvent.CLICK, fBuildLeftUp);
                    function fBuildLeftUp(e:MouseEvent){
                            var roadLeftUp:RoadLeftUpClass = new RoadLeftUpClass();
                                roadLeftUp.x = mouseX;
                                roadLeftUp.y = mouseY;
                                main.addChild(roadLeftUp);
                                roadLeftUp.startDrag();
                    }
            }
 
                function fCheckHitWithCell(e:Event){
                    var road_vertical = e.currentTarget;
                    if(build == true){
                                road_vertical.stopDrag();
                                build = false;
                        }
                }
 
        //разрешить строить дорогу.
                private function fAllowBuildRoad(e:MouseEvent){
                        build = true;
                }

проблема в следующем:
При первом нажатии на кнопку buildVertical создается экземпляр класса BuildVerticalClass и сразу-же срабатывает функция привязанная к этому экземпляру. Далее, почему-то срабатывают все кнопки, т.е.
выполняется функция прописанная для экземпляра класса BuildVerticalClass и ссылающаяся на этот экземпляр с помощью метода e.currentTarget и эта функция срабатывает для других экземпляров других классов.

Кто-нибудь может объяснить почему так происходит.

Wolsh 04.07.2015 09:30

Для начала вытащите все функции из конструктора в тело класса (как fAllowBuildRoad).
Черт ногу сломит.

Добавлено через 9 минут
Что именно срабатывает "для других экземпляров"? Остановка драга? А до этого они все за мышкой ползают чтоли? Или как Вы это увидели? Опишите своими словами, как это выглядит, потому что интерпретировать Вашу интерпретацию слегка затруднительно. Это как ответить на вопрос "я подписал кнопку на событие клика, жму а ничего не происходит! что делать???7?" Нужно еще что-то кроме описания заведомо невозможной ситуации. Что это за "другие экземпляры", если Вы пишете "после первого нажатия", то есть вроде как не должно быть других кусков дороги. Короче, опишите подробнее происходящее, не обязательно псевдонаучным языком.

бакуард 04.07.2015 17:29

Извиняюсь, сразу ответить не мог.
Нажимаю на кнопку buildVertical и сразу появляется кусок дороги координаты которого равны координатам курсора мыши(здесь все нормально). Далее почему-то сразу же срабатывает функция fCheckHitWithCell(остановка драга),
хотя не должна (Она должна сработать после клика по сцене). Что касается остальных кнопок, то при нажатии на них появляется соответствующий кусок дороги и движется вместе с курсором(здесь все нормально), но если кликнуть по сцене то происходит остановка драга, хотя для тех кусков дороги,которые вызывают эти кнопки я ничего подобного не писал.

Wolsh 04.07.2015 21:09

Цитата:

хотя не должна
Да почему же? Там подписка на ентерфрейм, а он рассылается автоматически с частотой fps. Кроме того клик по кнопке, естественно, является и кликом по сцене. Сцена — не поднос, на котором что-то лежит, а коробка, В которой что-то лежит. Чтобы нажать на кнопку, Вы сначала нажимаете на коробку. Недаром используется слово контейнер, а не стол или площадь. Все объекты лежат В контейнерах, и Stage — конечный, самый большой контейнер.
По второй проблеме затрудняюсь что-то сказать. Возможно, Вы опять что-то намудрили с наследованием, или код потерялся где-то внутри рисованых клипов.


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

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