Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   полиморфизм? (http://www.flasher.ru/forum/showthread.php?t=176483)

Wolsh 13.03.2012 01:44

Цитата:

пишут что надо использовать централизованный подход...
Ну хоть не пишут, что надо все объекты кидать прямо на stage..

Котяра 13.03.2012 01:54

Код AS3:

(e.target as Button).action();

что мешает в САМОЙ кнопке сделать
Код AS3:

addEventListener(MouseEvent.CLICK, action)

Если у вас сама кнопка решает что ей делать.

Wolsh 13.03.2012 01:57

Самый красивый довод – про моментальное отключение всех кнопок удалением одного слушателя – зиждется на Вашем слабом знании Событийной модели. Я не знаю, кто Вас научил таким ужасным костылям – накрывать спрайтом, пробегаться по массивам. Есть простой кошерный метод stopPropagation(). В любой момент Вы можете полностью отрубить любому контейнеру захват мыши, и все его обитатели станут глухими.
Надеюсь, концепция что все обитатели должны сидеть в контейнере, а не разгуливать по стейджу, у Вас не вызывает возражений? Тогда пример:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                private var _sprite:Sprite;
                private var _modalSprite:Sprite;
                private var _container: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
                        _container = new Sprite();
                        addChild(_container);
                        //// В контейнер поместим "кнопку", одну из 128 тысяч.
                        _sprite = new Sprite();
                        _sprite.graphics.beginFill(0x000000);
                        _sprite.graphics.drawRect(0, 0, 150, 100);
                        _sprite.x = _sprite.y = 150;
                        _sprite.name = "DISABLED";
 
                        _container.addChild(_sprite);
 
                        //// А это якобы модальное окно, которое будет оставаться активным,
                        //// когда контейнер заглохнет.
                        _modalSprite = new Sprite();
                        _modalSprite.graphics.beginFill(0x008844);
                        _modalSprite.graphics.drawRect(0, 0, 100, 50);
                        addChild(_modalSprite);
                        _modalSprite.x = _modalSprite.y = 120;
                        _modalSprite.name = "MODAL";
 
                        //// Вешаем слушателей. Для наглядности я сделал один хендлер
                        //// и для спрайта в контейнере и для модального окна. Это не важно))
                        _modalSprite.addEventListener(MouseEvent.CLICK, clickHandler);
                        _sprite.addEventListener(MouseEvent.CLICK, clickHandler);
 
                        //// Внезапно: Отключаем захват клика для контейнера и всех его 128 тысяч кнопок.
                        //// _sprite с этого момента не получает события клика.
                        _container.addEventListener(MouseEvent.CLICK, clickStopper, true);
                }
 
                private function clickStopper(event:MouseEvent):void
                {
                        event.stopPropagation();
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        var s:Sprite = event.target as Sprite;
                        if (s != null) trace("Clicked", s.name);
                }
        }
}

Добавлено через 6 минут
Ну и не забываем про старый добрый
Код AS3:

_container.mouseChildren = false;

Добавлено через 14 минут
Котяра, хитрость в том что кнопка не решает, а только хранит колбэк. Если бы решала, был бы полный атас. А так сохраняется видимость контроля за происходящим – после клика только Сам Главный решает, вызывать колбэк или нет. Ну и опять же, озвученный выше довод про моментальное отключение/включение всех кнопок. Если они будут "нажиматься" сами, то автор видит лишь два костыля как остановить это.

anmelegov 13.03.2012 03:44

я уже давно сделал правильно и у меня всё работает без единого костыля... ваши доводы в пользу использования тысячи слушателей событий противоречат рекомендациям коллина мука. Я привел страницы где черным по белому написано что я прав, а вы нет.

Добавлено через 5 минут
Цитата:

Сообщение от Wolsh (Сообщение 1068652)
Самый красивый довод – про моментальное отключение всех кнопок удалением одного слушателя – зиждется на Вашем слабом знании Событийной модели. Я не знаю, кто Вас научил таким ужасным костылям – накрывать спрайтом, пробегаться по массивам. Есть простой кошерный метод stopPropagation(). В любой момент Вы можете полностью отрубить любому контейнеру захват мыши, и все его обитатели станут глухими.
Надеюсь, концепция что все обитатели должны сидеть в контейнере, а не разгуливать по стейджу, у Вас не вызывает возражений? Тогда пример:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                private var _sprite:Sprite;
                private var _modalSprite:Sprite;
                private var _container: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
                        _container = new Sprite();
                        addChild(_container);
                        //// В контейнер поместим "кнопку", одну из 128 тысяч.
                        _sprite = new Sprite();
                        _sprite.graphics.beginFill(0x000000);
                        _sprite.graphics.drawRect(0, 0, 150, 100);
                        _sprite.x = _sprite.y = 150;
                        _sprite.name = "DISABLED";
 
                        _container.addChild(_sprite);
 
                        //// А это якобы модальное окно, которое будет оставаться активным,
                        //// когда контейнер заглохнет.
                        _modalSprite = new Sprite();
                        _modalSprite.graphics.beginFill(0x008844);
                        _modalSprite.graphics.drawRect(0, 0, 100, 50);
                        addChild(_modalSprite);
                        _modalSprite.x = _modalSprite.y = 120;
                        _modalSprite.name = "MODAL";
 
                        //// Вешаем слушателей. Для наглядности я сделал один хендлер
                        //// и для спрайта в контейнере и для модального окна. Это не важно))
                        _modalSprite.addEventListener(MouseEvent.CLICK, clickHandler);
                        _sprite.addEventListener(MouseEvent.CLICK, clickHandler);
 
                        //// Внезапно: Отключаем захват клика для контейнера и всех его 128 тысяч кнопок.
                        //// _sprite с этого момента не получает события клика.
                        _container.addEventListener(MouseEvent.CLICK, clickStopper, true);
                }
 
                private function clickStopper(event:MouseEvent):void
                {
                        event.stopPropagation();
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        var s:Sprite = event.target as Sprite;
                        if (s != null) trace("Clicked", s.name);
                }
        }
}

Добавлено через 6 минут
Ну и не забываем про старый добрый
Код AS3:

_container.mouseChildren = false;

Добавлено через 14 минут
Котяра, хитрость в том что кнопка не решает, а только хранит колбэк. Если бы решала, был бы полный атас. А так сохраняется видимость контроля за происходящим – после клика только Сам Главный решает, вызывать колбэк или нет. Ну и опять же, озвученный выше довод про моментальное отключение/включение всех кнопок. Если они будут "нажиматься" сами, то автор видит лишь два костыля как остановить это.

Знаю плохо, зато делаю правильно, что имхо намного важнее.. не знаю как для кого конечно, может для вас важнее использовать какой-то редкий супер костыль в кривом коде, но я перед собой такой задачи не ставлю

Добавлено через 8 минут
Цитата:

Сообщение от Котяра (Сообщение 1068650)
Код AS3:

(e.target as Button).action();

что мешает в САМОЙ кнопке сделать
Код AS3:

addEventListener(MouseEvent.CLICK, action)

Если у вас сама кнопка решает что ей делать.

мешает то что профессионалы считают этот подход не правильным и нубским, я же объяснил уже выше

Добавлено через 10 минут
Цитата:

Сообщение от Zebestov (Сообщение 1068646)
Что еще должна делать кнопка, кроме как предоставить возможность нажать себя и крикнуть об этом наверх?

это шутка или не? я не уловил что-то

TanaTiX 13.03.2012 04:00

Цитата:

я только что ради интереса открыл книжку мука и в ней написано что вы не правы на странице 564
Сократ не любил книги, т.к. с ними не получалось диалога ;)
И да, Мук не забор, но все же...

Котяра 13.03.2012 04:00

Оффтоп: не надо цитировать кучу.
Если хотите ответить - просто отвечайте.
Либо конкретику цитируйте. Всем и так понятно что вы отвечаете на вышестоящие топики.

По теме: почитайте про паттерны, ну и про MVC.
Здесь на форуме много. Потом приходите.

anmelegov 13.03.2012 04:29

Цитата:

Сообщение от Котяра (Сообщение 1068671)
Оффтоп: не надо цитировать кучу.
Если хотите ответить - просто отвечайте.
Либо конкретику цитируйте. Всем и так понятно что вы отвечаете на вышестоящие топики.

По теме: почитайте про паттерны, ну и про MVC.
Здесь на форуме много. Потом приходите.

Пролистал про MVC, в очередной раз убедился что я прав...

Bgg 13.03.2012 04:32

Цитата:

Сообщение от anmelegov (Сообщение 1068673)
Пролистал про MVC, в очередной раз убедился что я прав...

Я думаю вам пора уже свою книгу писать. Ну там делиться опытом. Свои паттерны придумать. Сейчас такая разруха: все не так, везде все не правы и пишут слишком много кода.

Zebestov 13.03.2012 04:34

Цитата:

Сообщение от anmelegov (Сообщение 1068666)
это шутка или не? я не уловил что-то

Не шутка. Для кнопки слишком функционально. Было бы странно открыть капот автомобиля — а там пусто! Ну точно — вся механика спрятана в замке зажигания!!!

Цитата:

Сообщение от anmelegov (Сообщение 1068579)
создавать слушатель событий для каждой кнопки это по индийски

Цитата:

Сообщение от gloomyBrain (Сообщение 1068593)
Ну да, switch-case на 128 кнопок куда круче

Цитата:

Сообщение от anmelegov (Сообщение 1068666)
тысячи слушателей

Здесь не аукцион вроде :quiet:

Добавлено через 2 минуты
Цитата:

Сообщение от anmelegov (Сообщение 1068673)
Пролистал про MVC, в очередной раз убедился что я прав...

Но Bgg не про этот MVC говорил!

anmelegov 13.03.2012 04:55

Цитата:

Сообщение от Bgg (Сообщение 1068675)
Я думаю вам пора уже свою книгу писать. Ну там делиться опытом. Свои паттерны придумать. Сейчас такая разруха: все не так, везде все не правы и пишут слишком много кода.

пока еще рановато.. может через год-два

Добавлено через 2 минуты
Цитата:

Сообщение от Zebestov (Сообщение 1068676)
Не шутка. Для кнопки слишком функционально. Было бы странно открыть капот автомобиля — а там пусто! Ну точно — вся механика спрятана в замке зажигания!!!

Готов выслушать ваши предложения


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

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