Форум 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.

Crash512 05.09.2008 17:23

Где вы видели, чтобы я использовал Твинер?.. У меня рассчитывается равноускоренное движение по формулам в onEnterFrame...

divinus 06.09.2008 01:21

Цитата:

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

Iv 08.09.2008 15:22

super.stage - это конечно знатно, как и мотивация его использования.
Даже если впоследствии и возникнет переопределение stage, то всё равно будет возвращаться экземпляр Stage и ничего страшного не произойдет. Ну и опять-же: если кто-то и решится на такое переопределение, то именно он и будет нести ответственность за работоспособность кода.
Проблемы нужно решать по мере их возникновения, а не пытаться предусмотреть всё и вся. В противном случае это борьба с ветряными мельницами.

etc 08.09.2008 15:27

Цитата:

Сообщение от Iv (Сообщение 762995)
Даже если впоследствии и возникнет переопределение stage, то всё равно будет возвращаться экземпляр Stage

Может возвращаться null с целью защиты от кривых ручек. Причем переопределено это будет где-нибудь в наследнике, у которого закрыты стандартные методы и свойства.

Iv 08.09.2008 15:36

Цитата:

Сообщение от __etc (Сообщение 762997)
Может возвращаться null [...]

- вот я и говорю, ужос просто чего можно себе навыдумывать.
Давай еще 100-200 таких проблем успешно предусмотрим.

etc 08.09.2008 15:38

Цитата:

Сообщение от Iv (Сообщение 762999)
- вот я и говорю, ужос просто чего можно себе навыдумывать.
Давай еще 100-200 таких проблем успешно предусмотрим.

Это простая защита от дурака, не более того. Времени на реализацию совсем никакого не занимает.
Инкапсуляция, все дела. Дальнейшие изменения не должны приводить к поломке существующего кода.

Crash512 08.09.2008 15:56

Господа... Вы не по сабжу=))

Iv 08.09.2008 16:09

Желание защитить свой код от дурака понятно, но неэффективно: дурак и это сломает, уж поверь.
Но ни что не дается даром: боязнь, кривых ручек приводит к тому, что вы закрываете возможности тем, у которых ручки прямые.

etc 08.09.2008 16:26

Цитата:

Сообщение от Iv (Сообщение 763007)
Желание защитить свой код от дурака понятно, но неэффективно: дурак и это сломает, уж поверь.
Но ни что не дается даром: боязнь, кривых ручек приводит к тому, что вы закрываете возможности тем, у которых ручки прямые.

Самое главное не столько защита, сколько сохранение работоспособности кода.

Iv 08.09.2008 16:45

Да это понятно.
В битве за мифическую работоспособность кода вы закрываете возможности, а это не правильно, двигаться нужно ровно в обратном направлении.
Если кто-то переопределит stage и обнаружит, что ваш код не работает, то понятное дело, что это именно его проблемы, а не ваши, ему их и решать.

Неуемное использование super мне напоминает прививку от несуществующей болезни, которая может быть возникнет в будущем.

Ты в жизни делал себе хоть раз такие прививки?

etc 08.09.2008 16:55

Я закрываю возможности, потому что их просто и не должно быть. Некоторые вещи (например, тот же stage), наружу торчать не должны. Я не собираюсь развязывать руки кому-то, мне это как раз таки противопоказано. А в общем и целом, использование super никому не вредит.

BlooDHounD 08.09.2008 19:29

Iv, ату! бУ! дениско, так держать :)

Яски 08.09.2008 21:08

etc, ваш способ не спасет, если stage переопределят в базовом классе данного класса. Ну хотя, если super.super.stage :mosking:

etc 08.09.2008 23:29

Цитата:

Сообщение от Яски (Сообщение 763092)
etc, ваш способ не спасет, если stage переопределят в базовом классе данного класса. Ну хотя, если super.super.stage :mosking:

А это смотря с какой стороны (класса) смотреть. Это и не является панацеей от всех бед.

BlooDHounD 08.09.2008 23:46

Яски, если переопределить в базовом классе, это никак не сохранит работу приложения на наследников. тут не спасёт ни this, super. это означает, что инкапсуляция сработала раньше :)


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

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