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

Akopalipsis 06.11.2013 16:35

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

Wolsh 06.11.2013 19:54

Babylon, честно, не понял о чем ты. А ты предлагаешь, размещая в приложении контрол сложнее кнопки, например контрол для выбора цвета, подписываться на все его текстовые поля, кнопки, движки и экранчики с цветами прямо из основного Вида? В чем тогда, простите, смысл компонентов? А вообще в чем смысл абстрагирования в объекты/классы?
Не простому тупому контейнеру "ради контейнера", а родителю, имеющему Замысел относительно своего ребенка. Я приводил в пример составной контрол, а не пустой спрайт.

Котяра 06.11.2013 22:28

Цитата:

Так вроде овер\аут не как не должны трогать модель, а значит и обрабатывать эти события нужно в виде.
И наверное, если от клика происходят изменения только в виде, то и клик нужно в нем же обрабатывать.
Да, кнопка сама подписывается на овер.аут.даун.клик и т.п. внутри себя. И меняет своё отображение и только. А вот хэндлер клика, который, собственно, отвечает за действие (а не отображение) кнопки лучше описывать в родителе. Благо as3 позволяет множественные хэндлеры на одно событие.

Babylon 06.11.2013 23:16

Уолш, я в принципе не против твоего подхода. Единственная коллизия в том, что придется переписать слушателей при смене контейнера. Хотя может так и надо:).

in4core 07.11.2013 00:53

Цитата:

Да, кнопка сама подписывается на овер.аут.даун.клик и т.п. внутри себя. И меняет своё отображение и только. А вот хэндлер клика, который, собственно, отвечает за действие (а не отображение) кнопки лучше описывать в родителе. Благо as3 позволяет множественные хэндлеры на одно событие.
До этой святой истины дойдут все рано или поздно. Причем это настолько гибкий метод, что можно делать много разных плюшек внутри такой кнопки и делать ее независимой , уникальной.

Код AS3:

package XXX 
{
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        /**
        * ...
        * @author in4core progression lab
        */

        public class EvaluteButton extends MovieClip
        {
                public var tf:TextField;
 
                private var _overColor:int = 0xFFFFFF;
                private var _outColor:int;
                private var _disableColor:int = 0x000000;
 
                private var _frames4:Boolean = false;
 
                public function EvaluteButton()
                {
                        if (tf)
                        {
                                this._outColor = tf.textColor;
                                this._disableColor = this._outColor;
                        }
                        this.mouseChildren = false;
                        this.tabEnabled = false;
                        this.buttonMode = true;
                        this.mouseEnabled = true;
                        this.gotoAndStop(1);
                        this.addEventListener(MouseEvent.MOUSE_OVER , onMouseOver);
                        this.addEventListener(MouseEvent.MOUSE_OUT , onMouseOut);
                }
 
                public function set frame4(b:Boolean):void
                {
                        this._frames4 = b;
                        this.addEventListener(MouseEvent.CLICK , onClick);
                }
 
                private function onClick(e:MouseEvent):void
                {
 
                        if (this.currentFrame > 2) this.gotoAndStop(2);
                        else this.gotoAndStop(4);
                }
 
                public function onMouseOver(e:MouseEvent):void
                {
                        if (_frames4 && this.currentFrame > 2) this.gotoAndStop(4);
                        else this.gotoAndStop(2);
                        if (tf) tf.textColor = this._overColor;
 
                }
 
                public function onMouseOut(e:MouseEvent):void
                {
                        if (_frames4 && this.currentFrame > 2) this.gotoAndStop(3);
                        else this.gotoAndStop(1);
                        if (tf) tf.textColor = this._outColor;
 
                }
 
                public function disable():void
                {
                        this.buttonMode = false;
                        this.mouseEnabled = false;
                        this.tabEnabled = false;
                        //this.gotoAndStop(2);
                        this.alpha = 0.5
                        if (tf) tf.textColor = this._disableColor;
                        this.removeEventListener(MouseEvent.MOUSE_OVER , onMouseOver);
                        this.removeEventListener(MouseEvent.MOUSE_OUT , onMouseOut);
                }
                public function enable():void
                {
                        this.buttonMode = true;
                        this.mouseEnabled = true;
                        this.alpha = 1
                        this.gotoAndStop(1);
                        if (tf) tf.textColor = this._outColor;
                        this.addEventListener(MouseEvent.MOUSE_OVER , onMouseOver);
                        this.addEventListener(MouseEvent.MOUSE_OUT , onMouseOut);
                }
 
                public function setTextOverColor(color:int):void
                {
                        this._overColor = color;
                }
                public function setTextOutColor(color:int):void
                {
                        this._outColor = color;
                }
                public function setTextDisableColor(color:int):void
                {
                        this._disableColor = color;
                }
 
                public function setColors(colors:Array):void
                {
                        setTextOverColor(colors[0]);
                        setTextOutColor(colors[1]);
                        setTextDisableColor(colors[2]);
                }
        }
 
}

Это конечно грязная реализация, точнее так надо, для набросков, но не суть. Зато понятно о чем говорил Котяра.

Psycho Tiger 07.11.2013 12:27

Цитата:

До этой святой истины дойдут все рано или поздно. Причем это настолько гибкий метод, что можно делать много разных плюшек внутри такой кнопки и делать ее независимой , уникальной.
Святой истины? Настолько гибко? :) Ты это точно о кнопочке, которая при наведении цвет меняет? :)
Цитата:

Это конечно грязная реализация, точнее так надо, для набросков, но не суть. Зато понятно о чем говорил Котяра.
О чем говорил Котяра понятно из сообщения котяры. И то что это "грязный набросок за 2 минуты" можно не упомянуть: ты за 4 года ни разу не показал то, что называешь "чистым".

Wolsh 07.11.2013 12:41

Не понимаю, как можно писать this. перед приватами (а чьи еще-то?) и свойствами суперкласса (где должно быть super.), но не писать перед пабликами экземпляра (tf). Фантасмогория какая-то, чесслово.
Больше запутывает, хотя выглядит конечно ритмичненько)
Я уж не опускаюсь до точки с запятой (видимо, для сеттера альфы есть свои правила) или странной инциализации только двух пресетных цветов из трех. Чисто по стилю, это импрессионизм какой-то.

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

private var _frames4:Boolean = false;
public function set frame4(b:Boolean):void

тоже что-то не от мира сего. Удивляет, как сказал бы Боб Мартин.

Добавлено через 10 минут
А из каких соображений эти функции, типа public function setTextOverColor(color:int):void не были оформлены как сеттеры?

Добавлено через 35 минут
Сама идея про кнопку, которая рисуется ручками в ИДЕ как мувиклип, а потом надо кодом подобрать и назначить цвета текстфилду лейбла, который туда ручками же и засунут, а потом выставлен на общий доступ, типа "а теперь форматируйте меня как хотите, двигайте меня, делайте меня доступной для ввода текста" — феерично. Гибкость однозначно на высоте, в пику всему остальному. Что за гибкость, когда обработка дизабленного состояния захардкодена как изменение альфы всей кнопки? Обслуживание такой кнопки требует больше усилий и тестов "а то ли я сделал с ней?", чем написание этого кода gotoAndStop().

in4core 07.11.2013 13:18

Wolsh совершенно не хочется комментировать код, кроме this - это мой стиль и он останется навсегда, ритмично и это мне нравится. А не хочется потому, что я не собирался показать именно код, а показывал структуру.
Вот вам чистая структура-код, но это ничего не меняет, смысл то остается.

Код AS3:

package pro.clonez.slots 
{
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        /**
        * ...
        * @author in4core lab
        */

        public class EvaluteButton extends MovieClip
        {
                public var tf:TextField;
 
                private var _isEnabled:Boolean = true;
 
                public function EvaluteButton()
                {
                        this.mouseChildren = false;
                        this.buttonMode = true;
                        this.tabChildren = false;
                        this.tabEnabled = false;
 
                        this.addEventListener(MouseEvent.MOUSE_OVER , over );
                        this.addEventListener(MouseEvent.MOUSE_OUT , out, );
                        this.addEventListener(MouseEvent.CLICK , release, );
                        this.addEventListener(MouseEvent.MOUSE_DOWN , down );
                }
 
                public function down(e:MouseEvent):void
                {
                        this.gotoAndStop('down');
                }
 
                public function release(e:MouseEvent):void
                {
                        if (this.hitTestPoint(stage.mouseX , stage.mouseY))
                        {
                                this.over(e);
                        }
                        else
                        {
                                this.out(e);
                        }
                }
 
                public function out(e:MouseEvent):void
                {
                        this.gotoAndStop('simple');
                }
 
                public function over(e:MouseEvent):void
                {
                        this.gotoAndStop('over');
                }
 
                public function disable():void
                {
                        this.removeEventListener(MouseEvent.CLICK , release);
                        this.removeEventListener(MouseEvent.MOUSE_OVER , over);
                        this.removeEventListener(MouseEvent.MOUSE_OUT , out);
                        this.removeEventListener(MouseEvent.MOUSE_DOWN , down);
                        this.mouseEnabled = false;
                        this.buttonMode = false;
                        this.gotoAndStop("inactive");
                        this._isEnabled = false;
                        this.tf.textColor = 0x777777;
                }
 
                public function enable():void
                {
                        this.addEventListener(MouseEvent.MOUSE_OVER , over );
                        this.addEventListener(MouseEvent.MOUSE_OUT , out);
                        this.addEventListener(MouseEvent.CLICK , release);
                        this.addEventListener(MouseEvent.MOUSE_DOWN , down);
                        this.mouseEnabled = true;
                        this.out(null);
                        this.buttonMode = true;
                        this._isEnabled = true;
                        this.tf.textColor = 0x0;
                }
 
                public function get isEnabled():Boolean
                {
                        return this._isEnabled;
                }
 
        }
 
}


Wolsh 07.11.2013 13:27

Код AS3:

if (this.hitTestPoint(stage.mouseX , stage.mouseY)

Кнопка на стейдж выложена?
Я за Вас переживаю, на самом деле. Извините за строгость, если не по душе.

Psycho Tiger 07.11.2013 13:27

Не поленился же причесать :)

Кстати, а hitTestPoint всегда работал с глобальными координатами? И сценарий, что при клике на кнопку её удаляют с дисплай листа тебе тоже в голову не приходил.

Но уже лучше! Поломай голову, продолжай! Эту задачу можно решить ещё меньшим количеством кода, допуская меньше ошибок.

in4core 07.11.2013 14:37

Цитата:

Кнопка на стейдж выложена?
Это для ассетов. Создаем в фла кнопку линкуем ее к обертке. Добавляем в дисплей лист уже в программе, стнадратная процедура. Причем тут выложена на стейдж не понял вопроса.

Psycho Tiger - не удаляет ) это рабочий код сотни игр :) удачи.

Добавлено через 30 секунд
И вообще зачем мы это обсужадем , когда тема о другом?!

Psycho Tiger 07.11.2013 14:41

Твоя сотня игр состоят из кнопки? Всё встало на свои места :)

Ну так ты кинул свой код, похвастаться: вот и обсуждаем.

in4core 07.11.2013 14:47

Цитата:

Ну так ты кинул свой код, похвастаться
Да нет же, не похвастаться, а подтвердить слова Котяры, что так делают, сам смысл, а не код.

Цитата:

Твоя сотня игр состоят из кнопки?
А ты думал! Одна кнопка и все, щас все так делают! Ты нет? Давай досвидания!

Wolsh 07.11.2013 14:57

Извини, но какое отношение положение мыши в момент срабатывания обработчика имеет к положению мыши в момент регистрации события? Детское объяснение "быстро" меня не устраивает. Тем более в "сотне игр". Ладно бы приходилось костыли какие городить. Но ведь stageX и stageY просто есть в объекте MouseEvent, который и обрабатывает этот обработчик. Это — координаты в момент события, а не до или после. Про возможное удаление со стейджа и соответственно, недоступность stage.mouseX тебе уже сказали.

in4core 07.11.2013 15:10

Wolsh - смысл прост, если находимся не над кнопкой в момент релиза, а такое случается часто, зажали, а отпустили в другой области. О том, что можно было бы написать e.stageX к примеру я в курсе, только разницы здесь нет. Доступность есть ВСЕГДА до стейджа вопервых, удаления не происходит так же.
Щас объясняю. Во первых в каких ситуациях до стейджа не может быть доступа? Если кнопка туда не добавлена, но она полюбому добавлена, если же она не добавлена в список, в этом случае мы никаким образом, кроме как вынужденно вызвать Release из любого места, что делать не нужно и не требуется, кнопка работает сама по себе, и из вне , чтобы сделать анимацию ее дергать не надо. Удаление не происходит чисто физически, это ассеты, которые всегда на виду, они никуда не удаляются и не пропадают, я же пояснил это фляшная обертка.
Безусловно , если копать в чистоту, то можно проверть на добавление на стейдж и т.п. - но в данном случае это не требуется, дабы она добавлена изначально и никуда не девается.
Повторюсь как всегда - не стоит обсуждать код вырванный из контекста , он может быть предназначен не для тех вещей, о которых думается собеседнику.
И здесь не идет даже разговор про чистый или грязный код. Здесь разговор назначения. Зачем мне себя утруждать лишний раз создавая *идеальный велосипед для всех случаев жизни* ( а мы знаем, что это провал, всех случаев жизни не возможно собрать) - когда нужно решить определенную задачу, которая не будет меняться в будущем?!

Dukobpa3 07.11.2013 15:13

Цитата:

Сообщение от Akopalipsis
Код AS3:

public class AppConfig;


гггг:) моя школа:)

Цитата:

Сообщение от Akopalipsis
Код AS3:

new AppConfig(this);


Зачем? У меня бутстрап статик потому что он должен быть статиком. Он нигде не сохраняется. Отработал и забыли. Статик классы это по сути инкапсуляция поведения. Есть инкапсуляция свойств и объектов, а это вот инкапсуляция поведения. Когда какой-то набор сродных задач, не привязанных к конкретносму инстансу можно делегировать в отдельный класс. Были бы это плюсы, либо питон - это скорее всего была бы функциональщина без обертки в виде класса. А так вот с оберткой, но статик. Плюс у меня там есть косяк, я лишнюю ссылку сохраняю. Т.е. твой вариант должен выглядеть как-то так(я и свои косяки тоже сейчас по-быстрому поправлю пока никто не заметил :) ):

Код AS3:

package 
{
        import flash.display.DisplayObjectContainer;
 
        public class AppConfig
        {
                // Убираем вот это вот во избежание лишних утечек.
                // В данном конкретном случае это не кртично, но лучше сразу привыкать.
                //private var _doc:DisplayObjectContainer;
                //private var _view:MainView;
 
                // убрать конструктор, он не нужен в статик классе
                //public function AppConfig(doc:DisplayObjectContainer)
                public static function init(doc:DisplayObjectContainer):void
                {
                        // НЕ сохраняем ссылку на DisplayObjectContainer
                        //_doc = doc;
                        //создаём главный класс отображения
                        //_view = new MainView();
                        //добавляем его в DisplayObjectContainer
                        doc.addChild(new MainView());
                }
 
        }
 
}

Но вцелом я думаю что для двух строк кода отдельно бутсрап воротить смысла нет:)

Цитата:

Сообщение от Babylon
Wolsh, ты предлагаешь каждому контейнеру или виду иметь список слушателей?[/as3]

и я предлагаю. Визуал в кнопке, функционал наруже. И котяра предлагает. Да даже in4core предлагает.

Цитата:

Сообщение от Babylon
придется переписать слушателей при смене контейнера[/as3]

Это как? Слушатели на контейнер чтоли? Кнопка внутри себя на себя же подписывается. Ниче менять не надо. А вот если контейнер одну кнопку уберет, а другую добавит, то очевидно и слушатели перебиндить надо будет.

Wolsh 07.11.2013 15:37

Цитата:

если находимся не над кнопкой в момент релиза, а такое случается часто, зажали, а отпустили в другой области.
Зажали, отпустили, это События. Они происходят в какое-то определенное время (читать про синхронность и асинхронность).
"В момент релиза" координаты event.stageX и stage.mouseX равны. Но в момент обработки — нет. То есть могут быть равны, но это ПРЕДПОЛОЖЕНИЕ.
Цитата:

Если кнопка туда не добавлена, но она полюбому добавлена
Это ПРЕДПОЛОЖЕНИЕ. В момент вызова обработчика кнопки может уже не быть на экране (не забываем, что не только кнопка может слушать и обрабатывать свои события. Хозяин кнопки легко может удалить ее по событию даун, или перехватить ап в первой фазе — это все такие же ПРЕДПОЛОЖЕНИЯ)
Цитата:

можно проверть на добавление на стейдж и т.п. - но в данном случае это не требуется, дабы она добавлена
Не требуется, потому что есть свойства События, не требующие нового обращения к Stage. А не из-за твоих предположений, что все само собой происходит. Процитирую себя: "ладно бы приходилось костыли какие городить...". В том то и дело, что никаких дополнительных действий тут не надо, надо всего лишь понимать, что пишешь, и почему именно так. В данном случае ты НЕ ЗАДУМЫВАЯСЬ написал первое что вспомнилось, и нет смысла отстаивать это как гениальную архитектурную идею.

p.S. "дабы" по-русски аналог "чтобы". Пиши по-русски, это русскоязычный форум.

Babylon 07.11.2013 16:06

Дуко, это неправильно, когда виджет изменяет функционал контейнера.

Dukobpa3 07.11.2013 16:15

Цитата:

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

В кнопке внутри подписки на саму себя или на своего визуального чилда. Только визуальные. овер/аут/ап/даун.
В обработчиках просто меняем визуал. Фильтры, цвет, перещелкиваем кадры. Тут уже зависит от вашей реализации. На этом задачи кнопки заканчиваются. Но жмакаться и правильно отображать жмаканье она будет.

И мы вот это вот целостное нечто, которое городо именуем кнопкой устанавливаем куда-то.
Там где установили подписываемся на клик. Всё. Клик - это уже функциональная подписка.

Что не так то отпять? С чем тут можно не согласиться то?

in4core 07.11.2013 16:19

Wolsh - разозлился я на слово ПРЕДПОЛОЖЕНИЕ. Никаких тут предположений нет. Я четко знаю, что и когда видно и может ли удалится , будет ли такой функционал возможен или нет. Если бы я допускал такие ошибки - то в наши бы игры не играли люди, ибо они ломались бы на раз два по швам, вот от таких вот мелких деталей. ПРЕДПОЛОЖЕНИЕ это есть бог или нет, а AS это четко поставленный язык, как математика черт побери. Если ты точно знаешь, что не будет удаления и оно просто невозможно в рамках функционала, то я об этом даже думать не буду. А вот если бы такая возможность была - код бы естественно выглядел подругому.

Dukobpa3 07.11.2013 16:37

Цитата:

Я четко знаю
Код AS3:

trace(stage.mouseX == event.mouseX);
// true if statge != null
// false if stage == null

В данном контексте обращение к стейджу нарывается на кидок стула в голову.

Wolsh 07.11.2013 16:44

Ну ОК, не злись)) Видимо, мы по-разному понимаем значение слова "гибкость")) И на event.stageX все-таки поменяй)) Игры, они, знаешь ли, фризятся, а геймеры народ горячий и мышку дергают со сверхзвуковой скоростью. Может на вашем тестовом девятиядернике и не было проблем, но я тут — да, именно за твою профессиональную крутизну радею. Дьявол кроется в деталях. Не хочешь слушать меня — просто задумайся, нафига в MouseEvent эти свойства запихали, целых два лишних никому не нужных. Ведь "полюбому" объект, пославший MouseEvent, на сцене, и всегда можно было бы спросить stage.mouseX. Но увы, это лишь предположение. Не надо так. Это концептуальный хардкод. Такой же, как предположение что дизабленная кнопка должна быть полупрозрачной.

in4core 07.11.2013 16:48

Wolsh - безусловно учту слова на будущее. И мне приятно слушать *правду*, но не люблю когда слова не так трактуют очень. А вот про тестовый девтиядерник хотелось бы поподробнее причем тут это. Проверка молниеносной скорости мыши, работа на планшетах и иже с ними, слабых компах и т.п. не вызывает никаких проблем. Я пока не пойму где твой дьявол здесь.

Dukobpa3
Цитата:

// false if stage == null
Stage is never null here. Поэтому как обращаться не важно

alexcon314 07.11.2013 16:49

Видимо, in4core имел в виду, что хардкод - это стезя не знающих поражений. Действительно, если взять и нарисовать кнопку в (0,0) и потом помнить всю дорогу до конца проекта (и потом пару лет на саппорте), что двигать и удалять боже упаси ее нельзя, то координаты мыши вообще можно не вычислять через каке-то там ивенты и стейджи:кнопка же в нулях, стал быть и мышка где-то тут... все очень просто и надежно. Это тру, по-любому. И не нужно возражать со всякими там если: все соображения, начинающиеся со слов "а если кнопку того.." разбиваются наглухо об "ничего нельзя того! Работает - не трогай!".

Dukobpa3 07.11.2013 16:55

Вложений: 1
Цитата:

Stage is never null here.
Вложение 30147

Tails 07.11.2013 18:06

Цитата:

Сообщение от in4core (Сообщение 1151516)
А вот про тестовый девтиядерник хотелось бы поподробнее причем тут это. Проверка молниеносной скорости мыши, работа на планшетах и иже с ними, слабых компах и т.п. не вызывает никаких проблем. Я пока не пойму где твой дьявол здесь.

Дьявол зарыт в асинхронности. События и асинхронные вызовы на более слабых машинах, будут вызываться гораздо позднее/вести себя иначе. И если код спроектирован без учёта этого, могут всплывать самые разнообразные "прикольчики", а отладка превратиться в ад.

in4core,
А можно узнать, в каких конторах вы работали? Так сказать, что-бы не попасть на саппорт проекта, в котором:
Цитата:

Stage is never null here.
:)

Dukobpa3 07.11.2013 18:18

Цитата:

События и асинхронные вызовы на более слабых машинах
Я вот раньше принципиально держал комп селерон 1.3 с 512 оперативки для тестов.
Так вот частенько такое бывало, что при запуске документ-класс был без стейджа. Такие дела.
С тех пор всегда использую ФД шаблон дефолтный, с подпиской.
Вот уже не помню когда последний раз на эту особенность плеера напарывался. Но опыт не пропьешь B-)

in4core 07.11.2013 18:18

Tails - ни в каких, мне просто стыдно , что все такие крутые и умные, а я нет , вы меня раскрыли :)

load.(assets.swf)
///
addChild(assets);
Это инициализация программы, так сказать первое действие после запуска мейника. Если в этих assets не происходит никаких удалений и иных действий - то стейдж у элементов, которое подсосаны просто как граф элементы никогда не будет null. К примеру грузите вы топ-меню, которое всегда на виду. В котором не удаляются и не добавляются элементы

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

Так вот частенько такое бывало, что при запуске документ-класс был без стейджа.
Ну это конечно очень смешно. У меня есть и целерон с 256 оперативки в офисе, достался как говорится от дедушки, и даже там такого не было)

Dukobpa3 07.11.2013 19:26

Код AS3:

addChild(assets);

О_о wtf?

Добавлено через 31 секунду
А че тогда уж не
Код AS3:

stage.addChild(assets);


in4core 07.11.2013 20:01

Dukobpa3 совсем не понял юмора. я структуру просто написал.
А про нет стейджа при компиляции мейна - брехня.

elder_Nosferatu 08.11.2013 19:47

Цитата:

Сообщение от in4core (Сообщение 1151503)
Wolsh - разозлился я на слово ПРЕДПОЛОЖЕНИЕ. Никаких тут предположений нет. Я четко знаю, что и когда видно и может ли удалится , будет ли такой функционал возможен или нет.

То, что с твоей точки зрения УВЕРЕНОСТЬ, для приложения - ПРЕДПОЛОЖЕНИЕ. А те, кто будут работать с твоим кодом, не обязаны знать что в данной точке выполнения приложения твоя светлая головушка решила держать кнопку на сцене. И не дай бог ее кто дернет!
К примеру я возьму твою игру да и загружу своим прелоадером, который кроме загрузки еще и рекламой занимается. И вот моя гениальная мысль состоит в том, что реклама должна выскакивать каждые 10 минут, а твоя игра не достойна стоять рядом с проплаченым банером. И простого опрозрачнивания игры мне не достаточно! Нет! Я ее вообще со сцены выдворю на время рекламного блока! Короче, сам спроси свою кнопку где ее сцена. А она, со слезами на глазах, только и скажет:
Цитата:

"Ты же обещал... Какая же я дура! Как я могла поверить в твои слова о пожизненной прописке на сцене???"

in4core 09.11.2013 01:13

elder_Nosferatu - абсолютно прав. Но тут палка о двух концах, основной в том, что с моим кодом работать никто не будет, приложение будет полностью мое и мой же будет поддерживаться. В другом же случае, приходится думать и о других , без хардкода.
А по поводу примера - провал. Удаляй хоть всю игру, ошибка не всплывет. Подписка же не на стейдж на на маус эвент. По сему, после удаления ничего не произойдет, тем более после нового добавления. То есть в данном случае как ни крути, код не падает.

Wolsh 09.11.2013 01:51

Вот же шь.. на сто раз разжевали, все без толку.
Как ты не поймешь, что время, когда возникает Событие, и время, когда выполняется обработчик — разное?
Тебе говорят, что между этими двумя моментами кнопка может быть убрана со сцены. Между. Была на сцене - послала событие - удалилась со сцены - вызвался обработчик. В котором ты обращаешься к стейджу.
Еще проще ситуация: послала событие - мышка сдвинулась на 1 пиксель - в обработчике ты делаешь хитТест и мышка не над объектом. Была над — во время события. Координаты в объекте События говорят, где мышка была во время События, а не во время работы обработчика.
Разжевано уже так, что даже другими словами не скажешь.
Мне вот, честно, поровну, работает твоя кнопка в твоих играх и пускай. Здесь речь не о том, как работает кнопка, а о том, как работает твой мозг программиста.
Просто ты привел пример кода, назвав его примером гибкости.
А теперь:
Цитата:

с моим кодом работать никто не будет, приложение будет полностью мое и мой же будет поддерживаться... Я четко знаю, что и когда видно и может ли удалится , будет ли такой функционал возможен или нет.
Это концептуальный хардкод. Он не плох и не хорош, он просто прямо противоречит понятию "гибкость". Больше вопросов нет.

in4core 09.11.2013 02:16

Цитата:

Тебе говорят, что между этими двумя моментами кнопка может быть убрана со сцены. Между. Была на сцене - послала событие - удалилась со сцены - вызвался обработчик. В котором ты обращаешься к стейджу.
Это конечно круто все. Только вот я не могу представить такой вот ситуации , кроме как если первой строкой хендлера будет выполнение удаления. Чисто теоретически есть и другие ситуации, не важно. Но это все в теории - на практике это будет работать нормально.
Я вот не спорю, что это некачественный подход, соглашаюсь, вопрос в другом, что такую ситуацию на практике поймать будет сложновато. С таким успехом можно привести и другие доводы из других областей, где точно так же НЕ ГИБКО выглядит все, но этим пользуются.
Цитата:

Просто ты привел пример кода, назвав его примером гибкости.
Нет, я показал структуру, а не код, хотя во втором случае уже код, но специфический. Спорить тоже далее не хочу. Лишь потому, что тесты игроками прошли уже более года назад и соотвественно багов тут не было выявлено и не будет, пускай, конечно и в данном конкретном случае. Но как бы то ни было, что бы воспроизвести эту проблему нужно
а) Иметь функционал, который может удалить объект в любой момент, причем видимо рандомно
б) Принудительно вызвать ситуацию , описанную выше в нескольких примерах.

Dukobpa3 09.11.2013 02:25

Цитата:

Это конечно круто все. Только вот я не могу представить такой вот ситуации , кроме как если первой строкой хендлера будет выполнение удаления
какая первая строка. Первая строка выполится после того как нначнет выполнение хендлер.

Короче. Напиши свою игру и дай поиграть посонам, скажи "надо поломать". Поломают.
Если для поделки на коленке то вполне ок. А наши QA такой баг выловят минуты за три. Потому что когда новое окно добавляется у них спецом в тест-кейсах прописано - проверить весь интерактив.

Так вот такой интерактив ломается тупо быстро-быстро кликать по кнопке в определенные моменты жизни системы. А моменты думаю выловить тоже не сложно.

Wolsh 09.11.2013 02:51

Main.as
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        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
                        var button:In4CoreButton = new In4CoreButton();
                        super.addChild(button);
                        button.x = 100;
                        button.y = 100;
                        button.addEventListener(MouseEvent.CLICK, handlerButtonClick, false, 1);
                }
 
                private function handlerButtonClick(e:MouseEvent):void
                {
                        super.removeChild(e.currentTarget as Sprite);
                }
        }
}

In4CoreButton.as
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class In4CoreButton extends Sprite
        {
 
                public function In4CoreButton()
                {
                        super.graphics.beginFill(0x000000);
                        super.graphics.drawRect(0, 0, 200, 50);
                        super.addEventListener(MouseEvent.CLICK, handlerClick);
                }
 
                private function handlerClick(e:MouseEvent):void
                {
                        trace(this.stage);
                }
        }
}


in4core 09.11.2013 03:28

Wolsh - что ты этим хотел показать? Я не понимаю тебя. Зачем мне удалять в хендлере при нажатии кнопку? Если ты не понял, я понимаю тебя, в какой ситуации это может произойти, я не ВИЖУ этой ситуации на практике. Хотя нет вру, на практике может быть и такая. Например кликанье по каким то шарам и удаление их после клика. В стандартной же ситуации , когда кнопка НИКОГДА не будет удалена, ибо это не требуется, такого просто не будет. Давай закроем это обсуждение, я не вижу смысла споров,
1) потому, что я согласен , что такая ситуация возможна
2) в моем приложении такой ситуации не сделать

Дикобраз - у всех есть свои QA, уж поверьте. Вот выложил старенький слот, тест сборку (эмулятор сервера ), поэтому на всякие Nan вместо текста, несовпадение символов и прочее, внимания обращать не стоит. Наша задача кнопка!!!
http://www.in4core.com/Slot.swf прошу, вот слот, в котором все кнопки такие. Плеер дебажный - поймаешь ошибку о которой мы говорим, буду очень признателен и обязательно извинюсь за свои споры перед каждым, кто оспаривал мои доводы.
За другие ошибки, тоже был бы признателен , вдруг найдете то, что не нашли игроки при тестах :).

Babylon 09.11.2013 09:36

Переместите кнопку из одного контейнера в другой. Получится, что виджет повлиял на контейнер. Это не правильно. Поведение контейнера должно задаваться в его классе, а не в том контенте который он содержит.

Wolsh 09.11.2013 13:28

Цитата:

Зачем мне удалять в хендлере при нажатии кнопку?
Затем, что больше она не нужна? О__о
В собственных слушателях внутри кнопки не может быть приоритетов — кнопка "конечный" элемент, не содержащий в себе интерактивных детей (99%... Возможны конечно хитрые варианты, следящие за перемещением мыши по кнопке, как например, Glow в таскбаре Win7.. но вряд ли они борются за приоритеты))). А вот у хозяина кнопки могут быть совершенно непредсказуемые планы по использованию ее событий, и он вполне может наставить приоритетов своим обработчикам, так что кнопка твоя будет ловить собственные события в последнюю очередь, что я и показал. Ее могут удалить, переместить, сделать неактивной, перекрыть и т.п. То, что тебе не хватает фантазии представить такие ситуации — не аргумент) Древний привел тебе пример — может понадобиться просто убрать все твое приложение (да хоть просто окно, в котором кнопка) со сцены из-за какого-то внешнего события по таймеру или от лоадера данных с сервера. Самый частый и простейший пример — кнопка закрывает собственное окно. Естественно, можно по-разному написать это действие. Но никто не обязан учитывать при этом внутреннюю реализацию твоей кнопки! Даже ты сам. Кнопка должна предъявлять минимум требований к хозяину. ЭТО называется гибкость, а не то что ты можешь кодом задать цвета для текстфилда, к которому вообще-то итак сделал публичный доступ, а состояния нарисовать в кадрах(!) и дать им правильные(!) метки (причем дизабленное состояние — нет, не можешь))), а наличие дизабленных овер/аут вообще не предусмотрено. Еще и текстфилд вставлен руками в ИДЕ, а значит ему в ИДЕ могут быть назначены такие специфические свойства, что ни в жизнь не догадаешься. Видишь? Я не о коде))

Babylon, я так ничего и не понял, о чем ты. Я не понимаю, что за безликий "контейнер", при этом таки имеющий свой класс (может, речь о чем-то типа лейаута? ну а как его поведение связано с наличием кнопки в контенте, нихт фернштейн? С каких пор лейаут как-то связан с поведением его контента? У тебя ячейки лейаута подписываются на события контента, что ли? Или все-таки логика?)
Если же речь о родителях-хозяевах кнопки, то мне непонятно, с какого перепугу я буду выдергивать кнопку из окна редактирования цвета и засовывать ее в контрол строки поиска, например, либо вообще давать кому-то доступ к ней. Она же инкапсулирована в хозяине. Я не собираюсь описывать через XML строение(!) контрола ColorPicker, давая каждому террористу возможность хватать любого ребенка и продавать за границу.

Babylon 09.11.2013 14:08

Кнопка должна наследоваться не от Sprite а от суперкласса CommonButtons
и оверрайдить нужные методы, а не писать super в конструкторе самой кнопки


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

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