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

Crash512 04.09.2008 14:39

Вложений: 1
Вот написал эффектик с использованием частиц.. В роли частиц у меня отрисованные программно векторные кружки. Подскажите, может возможно оптимизировать скорость этого эффекта при помощи BitMap класса?.. Я не работал с ним особо...

Приложил исходник в зипе. Просто кликаешь мышкой на экран, и из мышки взрываются 500 частиц, оседая на рамке экрана.

Вот не знаю... Зипы боятся качать?.. Я бы мог выложить по файлам "*.fla" и "*.as", но такой формат прикреплять нельзя...=(

ign 04.09.2008 16:17

Не знаю, что ты собрался делать с помощью класса Bitmap.
Единственное, что могу предположить, это сфотографировать все кадры твоего взрыва. А потом сменять битмапы. Но такое кол-во битмап загрузит всю оперативку и производительности из этого ты не получишь.


А теперь методы, с помощью которых можно увеличить производительность:

Стандартный класс Tween сам по себе не очень производительный, советую использовать какой-нибудь иной, например Caurina Tweener.

Пусть 1 Экземпляр класса "Твинер" управляет всеми твоими частицами.
(т.е. просто гоняет число от 0 до 1) А ты на прогресс меняешь координаты всем частицам в цикле.

Так же, когда ты убираешь частицы со сцены, на событие mouseDown, частицы продолжают вычислять свое движение. Поэтому нужно сделать для них метод destroy() внутри которого перестать вычислять новые кординаты и отписаться от enterFrame..

Вообщем флеш способен на многое, если правильно писать код :)

MrPoma 04.09.2008 16:38

Сделайте одну обработку Event.ENTER_FRAME в Document class'е, в ней перебирайте частицы.

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

divinus 04.09.2008 17:08

что-то типа такого?
Код:

package {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.filters.BlurFilter;
        import flash.geom.Point;

        public class particleTest extends Sprite {
               
                private const blurFilter:BlurFilter = new BlurFilter( 2, 2, 2 );
                private const NUM_PARTICLES:Number = 1000;
               
                public function particleTest() {
                        super.stage.addEventListener(MouseEvent.CLICK, this.handler_mouseClick);
                }
               
                private var _particles:Array;
               
                private var _renderScreen:BitmapData;
               
                private function init(x:Number, y:Number):void {
                        this._particles = new Array();
                        for(var i:int = 0; i < this.NUM_PARTICLES; i++) {
                                this._particles.push(new Particle(x, y, Math.random()*10-5, Math.random()*10-9, i));
                        }
                        if(this._renderScreen) this._renderScreen.dispose();
                       
                        this._renderScreen = new BitmapData( super.stage.stageWidth, super.stage.stageHeight, true, 0 );
                        super.addChild(new Bitmap(this._renderScreen));
                       
                        super.addEventListener(Event.ENTER_FRAME, this.handler_enterFrame);
                }
               
                private function handler_mouseClick(event:MouseEvent):void {
                        this.init(super.stage.mouseX, super.stage.mouseY);
                }
               
                private function handler_enterFrame(event:Event):void {
                        this._renderScreen.lock();
                       
                        for each (var p:Particle in this._particles) {
                                this._renderScreen.setPixel32(p.sx, p.sy, 0xFFFF00FF);
                                p.sx += p.tx;
                                p.sy += p.ty;
                                p.tx *= .99;
                                p.ty += .3;
                                if(p.sy > super.stage.stageHeight) this._particles.splice(p.id, 1);
                        }
                       
                        this._renderScreen.applyFilter( this._renderScreen, this._renderScreen.rect, new Point(), this.blurFilter );                       
                        this._renderScreen.unlock();
                }
        }
}

internal class Particle        {
        public var sx: Number;
        public var sy: Number;
        public var tx: Number;
        public var ty: Number;
        public var id:int;
       
        public function Particle( sx: Number, sy: Number, tx:Number, ty:Number, id:int) {
                this.sx = sx;
                this.sy = sy;
                this.tx = tx;
                this.ty = ty;
                this.id = id;
        }
}


Crash512 04.09.2008 18:30

Вот только divinus меня понял... Спасибо за пример=)

ign 05.09.2008 04:13

2divinus

super.stage.addEventListener(MouseEvent.CLICK, this.handler_mouseClick);

почему не просто stage ?

divinus 05.09.2008 12:45

2ign, привычка.
И кстати
Цитата:

Пусть 1 Экземпляр класса "Твинер" управляет всеми твоими частицами.
(т.е. просто гоняет число от 0 до 1) А ты на прогресс меняешь координаты всем частицам в цикле.
а смысл вообще использовать tweener?

etc 05.09.2008 14:20

Цитата:

Сообщение от ign (Сообщение 762424)
почему не просто stage ?

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

ign 05.09.2008 17:16

Цитата:

Сообщение от divinus (Сообщение 762462)
И кстати

а смысл вообще использовать tweener?

Мне казалось, ему нужно нелинейное движение.

2__etc
переопределение геттера stage, это конечно круто :)
Причем переопределение должно быть в этом же классе.

etc 05.09.2008 17:19

Цитата:

Сообщение от ign (Сообщение 762541)
Причем переопределение должно быть в этом же классе.

Это почему? Он может быть переопределен и в наследниках. Мы же себя заранее ограждаем от возможной некорретной работы в будущем, используя super.


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

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