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

DZHETIGAPA 14.01.2011 00:59

Организовать грамотный код
 
Возникла проблемка, как грамотно организовать работу кода. Вот простейший код, который помещен в прослушиватель события ENTER_FRAME:

Код AS3:

private function onFrame(e:Event):void
{
    if (rectSpr.height > stage.stageHeight / 2) addChild(_scrollBar);
 
    if (rectSpr.height < stage.stageHeight / 2) removeChild(_scrollBar);
}

Но тут при каждом кадре на сцену добавляется _scrollBar и соответственно тормоза. Мне же надо, что бы addChild(_scrollBar) срабатывало один раз при выполнении условия оператора. Аналогично и с removeChild(_scrollBar). То есть, если выполнилось условие, то addChild(_scrollBar), но только один раз. Когда выполняется следующее условие, то removeChild(_scrollBar) и тоже один раз.

А то у меня как-то все громоздко получается и некрасиво. Или же тут нужно собственные события создавать?

scarbo 14.01.2011 01:06

Ну вообще-то бы надо на кастомное событие производить действие, то есть надо слушать тот объект, который может изменить rectSpr.Но если очень хочется на EnterFrame:
Код AS3:

private var isAddedSB:Boolean;
                private function onFrame(e:Event):void{
                        if (rectSpr.height > stage.stageHeight / 2 && !isAddedSB) {
                                isAddedSB = true;
                                addChild(_scrollBar);
                        }
                        if (rectSpr.height < stage.stageHeight / 2 && isAddedSB) {
                                isAddedSB = false;
                                removeChild(_scrollBar);
                        }
                }

ну или так:
Код AS3:

private function onFrame(e:Event):void{
                        if (rectSpr.height > stage.stageHeight / 2 && !_scrollBar.parent) {
                                addChild(_scrollBar);
                        }
                        if (rectSpr.height < stage.stageHeight / 2 && _scrollBar.parent) {
                                removeChild(_scrollBar);
                        }
                }

Короче говоря дофига вариантов, но EnterFrame явно не лучший.

DZHETIGAPA 14.01.2011 01:18

Цитата:

Сообщение от scarbo (Сообщение 964479)
Ну вообще-то бы надо на кастомное событие производить действие, то есть надо
Короче говоря дофига вариантов, но EnterFrame явно не лучший.

Можешь мне пжлст написать хоть парочку вариантов или дать ссылки для наводки. Просто я еще не спец во флэше, а вот развиваться надо. ENTER_FRAME первое, что мне зеленому пришло в голову:)

scarbo 14.01.2011 01:20

Колин Мук "Action Script 3.0 для Flash. Подробное руководство."

DZHETIGAPA 14.01.2011 01:23

Уже несколько раз перечитываю. Он даже щас открыт у меня на главе Пользовательские события:)

scarbo 14.01.2011 01:25

Кхм, давай рассуждать.Пока без всяких паттернов и проч.
Что у тебя может менять высоту rectSpr?
Как вариант (не самый лучший, но все же):
1)создаешь свой класс наследник от Sprite и экземпляр этого класса и будет rectSpr
2)переопределяешь там heigth -
Код AS3:

override public function set height(value:Number){super.height=value;dispatchEvent(new Event('RESIZE'))}

3)подписываешься на Event('RESIZE')
4)добавляешь или удаляешь _scrollBar

DZHETIGAPA 14.01.2011 01:29

rectSpr - тут у меня находится различный контент(height у всех разный), который изменяет свои размеры при наведении на него. Если height вылазит за пределы сцены, то появляется скроллер.

Правильно ли я понимаю, что в этом классе sprRect я должен диспетчеризировать свое событие?

scarbo 14.01.2011 01:34

Ну к примеру:
Класс Main.as
Код AS3:

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

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        var resizeSpr:ResizeSprite = new ResizeSprite();
                        resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
                        resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler);
                        addChild(resizeSpr);
                        //
                        var g:Graphics = resizeSpr.graphics;
                        g.clear();
                        g.beginFill(0x234acc);
                        g.drawRect(0, 0, 100, 100);
                        g.endFill();
                }
 
                private function _clickHandler(e:MouseEvent):void {
                        var resizeSpr:ResizeSprite = e.target as ResizeSprite;
                        resizeSpr.height += 10;
                        resizeSpr.width += 20;
                }
 
                private function _resizeHandler(e:Event):void {
                        trace(e.type);
                }
        }
 
}

Класс ResizeSprite.as
Код AS3:

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

        public class ResizeSprite extends Sprite
        {
                public static const RESIZE:String = 'resize';
 
                public function ResizeSprite()
                {
                        super();
                        mouseChildren = false;
                }
 
                override public function set width(value:Number):void {
                        super.width = value;
                        dispatchEvent(new Event(RESIZE));
                }
                override public function set height(value:Number):void {
                        super.height = value;
                        dispatchEvent(new Event(RESIZE));
                }
        }
 
}

Что мы получили - теперь мы можем подписываться на событие RESIZE у любого экземпляра класса ResizeSprite и узнавать, когда меняются его размеры.
Но когда пишут скроллы, то обычно учитывается, что они будут работать с любым видим контентом, то есть сам скролл должен приспосабливаться под контент, а не наоборот.

DZHETIGAPA 14.01.2011 01:53

Понял зачем событие resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) только когда скомпилировал. То есть тут экземпляру класса присваивается новое значение высоты и ширины. И не надо ЭнтерФрэйм использовать.

Ладно... буду разбираться в своей огороде...

scarbo 14.01.2011 01:56

Цитата:

То есть тут экземпляру класса присваивается новое значение высоты и ширины
Ничего там не присваивается, resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler) - это мы просто подписываемся, чтобы слушать когда изменится высота или ширина resizeSpr.Я же описал выше логику происходящего.
Еще раз, зачем я сделал класс ResizeSprite?
Чтобы можно было диспатчить(выкидывать) событие, когда у экземпляра этого класса(resizeSpr) изменится высота или ширина.
var resizeSpr:ResizeSprite = new ResizeSprite();
Создали экземпляр класса.
resizeSpr.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
Подписались на "слушание" "выкидывания" события 'resize', соответственно в функции _resizeHandler можно что-то делать, зная что эта функция вызывается только когда у resizeSpr изменяться размеры.
resizeSpr.addEventListener(MouseEvent.CLICK, _clickHandler);
тут и ниже - это просто пример кода, при клике мышью на resizeSpr, у него меняются размеры, как только они поменялись вызывается функция _resizeHandler.

Еще фишка, если в коде ResizeSprite.as написать не так:
dispatchEvent(new Event(RESIZE));
а вот так:
dispatchEvent(new Event(RESIZE, true));
то можно наделать кучу resizeSpr, дальше подписаться на stage
stage.addEventListener(ResizeSprite.RESIZE, _resizeHandler);
и мы будем знать когда меняются размеры у любого из экземпляров ResizeSprite.


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

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