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

КорДум 07.11.2010 16:52

TanaTiX, либо вы не поняли меня, либо я вас. По какому принципу работают твинеры?
Код AS3:

TweenLite.to(mc, 5, {alpha:.4, width:60} );

Вот как пример. Мы передаем Что_будем_изменять, Время и обджект с параметрами. Можно указать ширину, а можно высоту. А можно и высоту, и ширину, и альфу и чего там только нельзя. Вот по такому же принципу и я свое сделал. По умолчанию в классе определены приватные переменные с какими-то значениями. Можно не передавать обджект, тогда создастся экземпляр класса с этими дефолтными параметрами. Но можно передать, скажем, {x: 100} - и все, дефолтное значение меняется на это и координата по иксу уже другая.
Вот полный код, надеюсь, меня не покарают за такие большие листинги:
Код AS3:

package kordum.components {
        import flash.display.Sprite;
        import flash.events.Event;
 
        /** @author KorDum
          * @param x, y : int
          * @param width, height : uint
          * @param color : uint
          * @param alpha : Number [0, 1]
          * @param border : uint (0 - border 1px)
          * @param borderColor : uint
          * @param borderAlpha : Number [0, 1]
          * @version 1.1 **/

 
        public class BgSimple extends Sprite {
                private var $x:int = 0;
                private var $y:int = 0;
                private var $width:uint = 550;
                private var $height:uint = 400;
                private var $color:uint = 0xFFFFFF;
                private var $alpha:Number = 1.0;
                private var $border:uint;
                private var $borderColor:uint = 0x000000;
                private var $borderAlpha:Number = 1.0;
 
                public function BgSimple(properties:Object = null) {
                        if (properties) {
                                if (properties.x !== undefined) $x = properties.x;
                                if (properties.y !== undefined) $y = properties.y;
                                if (properties.width !== undefined) $width = properties.width;
                                if (properties.height !== undefined) $height = properties.height;
                                if (properties.color !== undefined) $color = properties.color;
                                if (properties.alpha !== undefined) $alpha = properties.alpha;
                                if (properties.border !== undefined) $border = properties.border;
                                if (properties.borderColor !== undefined) $borderColor = properties.borderColor;
                                if (properties.borderAlpha !== undefined) $borderAlpha = properties.borderAlpha;
                        }
                        this.addEventListener(Event.ADDED_TO_STAGE, ifAdd);
                }
 
                private function ifAdd(e:Event):void {
                        this.removeEventListener(Event.ADDED_TO_STAGE, ifAdd);
                        this.graphics.lineStyle($border, $borderColor, $borderAlpha);
                        this.graphics.beginFill($color, $alpha);
                        this.graphics.drawRect(0, 0, $width, $height);
                        this.x = $x;
                        this.y = $y;
                }
        }
 
}


Psycho Tiger 07.11.2010 16:57

Символом $ отмечаются финализированные методы по конвенции. Для приватов существует "_".

В твинерах мы не знаем что будем менять. x,y, vasya или petya.

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

TanaTiX 07.11.2010 17:00

Я имею в виду следующее:
Вот сейчас мы хотим создавать прямоугольник, завтра круг, а послезавтра улыбающуюся девочку. И если с кругом и прямоугольником все относительно просто, то вариантов настройки девочки гораздо больше - запаримся все описывать.
Вот я и предлагаю в BgSimple передавать не Object, а DisplayObject, уже настроеный как хотим. В результате избавляемся от передачи тучи параметров и их переопределения+гибкость во внешнем отображении. Сравнение с твином ИМХО не очень удачное - там другие задачи, там все параметры у объектов уже есть, а в этом случае все создается нами.

КорДум 07.11.2010 17:02

Цитата:

В твоём случае было бы логичней вообще конструктор оставить пустым, а width/height и ко сделать сеттерами.
Ага, а потом писать кучу строчек-настроек:
Цитата:

var bg:BgSimple = new BgSimple();
bg.width = 100;
bg.height = 200;
...
Цитата:

В твинерах мы не знаем что будем менять. x,y, vasya или petya.
У меня тоже не знаем. Но удобнее же в конструктор сразу же запихать все нужное, верно? Конечно, если это статичный класс, то есть, как фон, который нам менять по рантайму не нужно.

Psycho Tiger 07.11.2010 17:04

Цитата:

Но удобнее же в конструктор сразу же запихать все нужное, верно?
Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...

КорДум 07.11.2010 17:06

TanaTiX, класс BgSimple создает только прямоугольники. Он не подразумевает создание 3Д-фона, меняющегося по времени. Все параметры по умолчанию есть. Хочешь - меняй. Не хочешь - не меняй. Или меняй только ширину-высоту. Конечно, если мы делаем, скажем, скроллбар, в него пихаем уже ДисплейОбджекты, уже настроенные визуально. В таком классе реализуется только сборка воедино, позиционирование и функционал.

Если мы будем передавать уже настроенный обджект в класс создания фона, необходимость в классе пропадет, ибо дисплей обджект уже настроен, как надо, разве нет?

Добавлено через 1 минуту
Psycho Tiger, класс фона статичный, он не требует, чтобы его в рантайме переделывали. Так зачем делать сеттеры, если можно сразу указать в конструкторе все, что нужно?

Цитата:

Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...
Напиши такой класс :D

TanaTiX 07.11.2010 17:19

Тогда я перестаю понимать связь кода в 1м сообщении и в 11м.

КорДум 07.11.2010 17:19

Чтобы не отходить от темы, переложим нашу дискуссию на эффект со звездами. Тут я уже сомневаюсь. Наверно придется сеттерами делать. Ибо вдруг я захочу через пару секунд звездочки заменить летающими девочками? А тут раз, переопределил - и все, звездочки отживают свое, на их место встают бомбардировщики ИЛ-Девочка-2. А потом бац! - я захотел ускорить их сорость или проредить их толпу. И тут сеттером я изменяю все это. Это да, тут сеттеры хороши.
Но в случае с фоном, имхо, удобнее написать
Код AS3:

addChild(new BgSimple({x:100});

и забыть про фон, не так ли?

Добавлено через 2 минуты
TanaTiX, это мы так тихонечко подошли к гибкости настройки.

iNils 07.11.2010 17:25

Цитата:

Сообщение от Psycho Tiger (Сообщение 948179)
Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...

А тоже нативный TextFormat позволяет все задать в конструкторе.

КорДум 07.11.2010 17:33

Так, еще, логика эффекта не была совсем правильной. Сейчас подобраны такие параметры, что все смотрится очень даже плавно. Но стоит только сменить шаг прозрачности на меньший - хвост создается вспышками, как бы облаками. Сделал по таймеру создание кусочка хвоста.
Хочется при создании каждой звездочки определять начальные значения скорости и шага поворота. Как это лучше сделать? Конечно, можно создать класс одной звезды, определить у нее публичные свойства. Но как-то не хочется создавать еще один класс.


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

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