Форум Flasher.ru

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

random13 22.04.2010 17:02

как правильно переопределить SimpleButton
 
переопределил SimpleButton под свои нужны, но всплыла ошибка, кнопка не воспринимает нажатия, в чем может быть трабл, событие доходит до контейнера и затыкается, у контейнера mouseChildren указан

Код AS3:

 
package libraries.ui
{
        import flash.display.DisplayObject;
        import flash.display.SimpleButton;
        import flash.display.Sprite;
 
        public class CustomButton extends SimpleButton
        {
                public static const ROUND_LEFT:String = 'left';
                public static const ROUND_RIGHT:String = 'right';
                public static const ROUND_LEFT_RIGHT:String = 'left right';
                public static const ROUND_NONE:String = 'none';
 
 
                /**
                *
                * @param button объект типа SimpleButton, из которого кнопка возьмет все стейты
                * @param leftRight указатель, ROUND_LEFT - закругление слева, ROUND_RIGHT - закругление справа, ROUND_LEFT_RIGHT - закругление и слева и справа, если оставить пустым то без закруглений
                *
                */
               
                public function CustomButton(button:SimpleButton, leftRight:String = ROUND_NONE)
                {
                        var result:Object = this.init(button, leftRight);
                        super(result.upState, result.overState, result.downState, null);
                }
 
                private function init(button:SimpleButton, leftRight:String = ROUND_NONE):Object
                {
                        var obj:Object = {
                                upState: null,
                                downState: null,
                                overState: null
                        };
                        var l:DisplayObject, r:DisplayObject, b:DisplayObject;
                        if(leftRight == ROUND_NONE) {
                                obj.upState = button.upState;
                                obj.downState = button.downState;
                                obj.overState = button.overState;
                        } else if(leftRight) {
                                var prefs:Array = ['upState', 'downState', 'overState'];
                                l = (leftRight == ROUND_LEFT || leftRight == ROUND_LEFT_RIGHT) ? new LeftSideBut : null;
                                r = (leftRight == ROUND_RIGHT || leftRight == ROUND_LEFT_RIGHT) ? new RightSideBut : null;
                                b = button;
                                for each(var pref:String in prefs) {
                                        var sp:Sprite = new Sprite;
                                        var bp:DisplayObject = b[pref];
                                        sp.addChild(bp);
 
                                        if(l) {
                                                var lp:DisplayObject = l[pref];
                                                sp.addChild(lp);
                                                bp.x = lp.width;
                                        }
 
                                        if(r) {
                                                var rp:DisplayObject = r[pref];
                                                sp.addChild(rp);
                                                rp.x = bp.x + bp.width;
                                        }
                                        obj[pref] = sp;
                                }
 
                        }
                        return obj;
                }
        }
}


etc 22.04.2010 18:31

Странно, что этот код вообще компилируется.

random13 22.04.2010 18:45

ну не судите вы так строго, укажите на ошибки, все мы учимся(всю жизнь), кто-то больше кто-то меньше...
у меня задача следующая, есть кнопки, добавлены с помощью swc, в ним могут быть добавлены закругленные уголки слева или справа или вообще отсутствовать..

etc 22.04.2010 19:04

Дело не в суждении, дело в том, что обычно компилятор не допускает обращений к this до выполнения конструктора. Кроме того, SimpleButton вроде бы не является DisplayObjectContainer-ом (я им не пользуюсь, поэтому и не знаю), посему события пролетают мимо.

random13 22.04.2010 19:20

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

ну а по теме, я нарисовал во Flash IDE кнопки, и импортнул их в actionscript, при импорте Flash IDE мне было указано что они наследуются от SimpleButton.

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

BlooDHounD 22.04.2010 19:29

дело не в том, что Вы написали this а в том, что обращаетесь к свойству объекта, до того как отработали все его конструкторы.

random13 22.04.2010 19:32

хорошо, ну а как быть, или как обычно "правильно продумать архитектуру"

Волгоградец 22.04.2010 19:38

Ты не указал hitTestState, поэтому мышиные события не ловятся.

random13 22.04.2010 19:45

об этом уже думал, счас даже указал, но не сработало... хотя мне всегда казалось что если нет этого состояния то бирет по upState, хотя хз...

Psycho Tiger 22.04.2010 20:12

Я не вижу подписанного события)

Bgg 22.04.2010 20:14

По моему проще свой полностью simpleButton написать, чем наследовать класс который "хз" как работает.

CrazyFlasher 22.04.2010 20:17

SimpleButton зло...имхо

random13 22.04.2010 20:41

то есть вообще их лучше не использовать???

СлаваRa 22.04.2010 20:50

если вам за 15 минут надо сделать демку, например, то почему бы и нет, а вообще лучше пользоваться "своими кнопками".

random13 22.04.2010 20:57

вот счас как раз пытаюсь свою написать... подскажите а на основе чего делать?
от какого класса наследоваться?

Psycho Tiger 22.04.2010 21:38

От спрайта. Я никак свою не могу дописать и зализать, там код порядочный выходит - 1к строк +. Нехило так для кнопки) Я туда добавляю возможность вдавливаться, отключаться - если задан offState - на него, иначе цветовой матрицей делаю его серым, возможность вдавливать-отдавливать, добавление текста на кнопку всяко-разно по центру или с любым смещением... Короче, список можно продолжать долго. Зато один класс использую везде, где нужны эти кнопки. Да, большой, да, 80% функционала не используется, однако же не вижу смысла экономить на размере кода в 10 кб, когда размеры проекта >10 мб, а на быстродействии если и сказывается - то слишком мизерно. Клик по кнопке чаще 5 раз в секунду совершить не удастся, а это ничтожно. Я это к чему - творите свой мегакласс кнопки, не прогадаете.


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

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