Форум 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 13:08

Правильная реализация эффектов для мыши
 
Давненько я не делал всякие эффекты. Тогда я еще маловато знал об as3 и усердно зачитывал Мука. Итак, с утра что-то стукнуло в голову, дай-ка, думаю, пока выходной, понаделаю шаблончиков - авось когда пригодятся. Сделалось вот такое:
Код AS3:

package  {
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.Event;
        import kordum.utils.MathExtend;
 
        /** @author KorDum **/
 
        public class CursorStarEffect extends Sprite {
                private var arrStar:Vector.<Shape> = new Vector.<Shape>();
                private var speedRotation:uint = 10;
                private var alphaDown:Number = .1;
 
                public function CursorStarEffect() {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var i:uint;
                        for (i = 0; i < 15; i++) createStar();
                        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        for each (var star:Shape in arrStar) {
                                star.rotation += speedRotation + MathExtend.randomRange( -5, 5);
                                star.alpha -= alphaDown;
                                if (star.alpha <= 0) {
                                        arrStar.splice(arrStar.indexOf(star), 1);
                                        removeChild(star);
                                        createStar();
                                }
                        }
                }
 
                private function createStar():void {
                        var star:Shape = new Shape();
                        star.graphics.beginFill(0x000000);
                        star.graphics.drawRect(MathExtend.randomRange(-10, 10), MathExtend.randomRange(-10, 10), 10, 10);
                        star.x = stage.mouseX + MathExtend.randomRange(-10, 10);
                        star.y = stage.mouseY + MathExtend.randomRange(-10, 10);
                        arrStar.push(star);
                        addChild(star);
                }
        }
}

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

TanaTiX 07.11.2010 13:51

Да в основном по мелочи вроде...
speedRotation и alphaDown лучше сделать константами - их значения все равно не меняются.
Код AS3:

var i:uint;
                        for (i = 0; i < 15; i++) createStar();

есть мнение что с int-ом флеш работает быстрее, да и 15 тоже в константу, в настройки вынести, возможно еще какие-то значения.

КорДум 07.11.2010 13:57

Где-то тут на форуме видел, что константы после компиляции становятся переменными. Вообще, хотелось бы потом сделать полные настройки. То есть, в конструктор передаем Object:
Код AS3:

{
 obj:DisplayObject, // объект, из которого будет состоять хвост
 alphaStep:Number,
 count:uint, // сколько будет таких фигнюшек в хвосте
 ...
}

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

Psycho Tiger 07.11.2010 15:54

Код AS3:

function func(a:int=5,s:String="hello"):void

Цитата:

хочешь задавать параметр - задавай, не хочешь - не задавай, будут использоваться дефолтные значения.

КорДум 07.11.2010 16:09

Порядок важен, Тигер. А все случаи не предусмотришь. Нужно мне в твоем коде вместо hello написать hell. И придется перед этим писать все другие параметры тоже, переписывая их дефолтные значения.
А с обджектом хоть местами меняй, хоть какое значение задавай. Я свой фреймворк сейчас на обджекты перевожу - удобно, на мой взгляд.

Psycho Tiger 07.11.2010 16:17

Обджекты - ущерб автокомплиту. Я считаю что обджекты следует использовать только для передачи ключ=>значение, когда число и имена ключей заранее неизвестны. Как яркий пример - твинеры.

КорДум 07.11.2010 16:26

Цитата:

Обджекты - ущерб автокомплиту
Единственный их минус. Хотя, еще к минусам можно отнести отсутствие типизации элементов.
Цитата:

Как яркий пример - твинеры.
Именно по такому подобию я и делаю, вот, смотри пример:
Код AS3:

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);
}

Я еще немного не определился со стилями у переменных, но знаком $ стараюсь отмечать приватные переменные.
Так вот, здесь нужно только заглянуть в класс, где заботливой рукой я указал все возможные параметры, в коструктор передавать объект с этими параметрами. Ты же это и имел в виду? Больше ни для чего обджекты я не использую из-за той же типизации и того же автокомплита.

TanaTiX 07.11.2010 16:29

КорДум, а зачем такая колбаса, если можно передать готовый, уже настроенный DisplayObject?

КорДум 07.11.2010 16:34

TanaTiX, в смысле? Класс в примере с обджектом - это создание прямоугольного фона нужной ширины/высоты/прозрачности/итд. Если не указываешь обджект в конструкторе - берутся дефолтные значения, уже заданные в классе.

TanaTiX 07.11.2010 16:45

Зачем его создавать в том классе? Проще передать готовый. И вся надобность в Object-ах отпадет. Передали DisplayObject, пересохранили ссылку на объект и делаем что хотим. Если нет DisplayObject-а в параметре - тогда создаем некую форму, определенную по умолчанию, но ей не нужно передавать хренову тучу значений, т.к. все параметры определены внутри класса. Или имеется в виду определить все параметры внутри функции на тот случай, если DisplayObject отсутствует, чтоб не плодить лишние свойства, и их передать параметром для функции, которая запустится опять же только в том случае, если не определен DisplayObject? Но даже в таком случае, т.к. это закрытая функция, нет ИМХО особой надобности создавать Object.

Или я что-то не так понял?


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

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