![]() |
|
||||||||||
|
|
|
|||||
|
Вот написал эффектик с использованием частиц.. В роли частиц у меня отрисованные программно векторные кружки. Подскажите, может возможно оптимизировать скорость этого эффекта при помощи BitMap класса?.. Я не работал с ним особо...
Приложил исходник в зипе. Просто кликаешь мышкой на экран, и из мышки взрываются 500 частиц, оседая на рамке экрана. Вот не знаю... Зипы боятся качать?.. Я бы мог выложить по файлам "*.fla" и "*.as", но такой формат прикреплять нельзя...=( Последний раз редактировалось etc; 04.09.2008 в 16:23. |
|
|||||
|
Регистрация: Jan 2008
Сообщений: 36
|
Не знаю, что ты собрался делать с помощью класса Bitmap.
Единственное, что могу предположить, это сфотографировать все кадры твоего взрыва. А потом сменять битмапы. Но такое кол-во битмап загрузит всю оперативку и производительности из этого ты не получишь. А теперь методы, с помощью которых можно увеличить производительность: Стандартный класс Tween сам по себе не очень производительный, советую использовать какой-нибудь иной, например Caurina Tweener. Пусть 1 Экземпляр класса "Твинер" управляет всеми твоими частицами. (т.е. просто гоняет число от 0 до 1) А ты на прогресс меняешь координаты всем частицам в цикле. Так же, когда ты убираешь частицы со сцены, на событие mouseDown, частицы продолжают вычислять свое движение. Поэтому нужно сделать для них метод destroy() внутри которого перестать вычислять новые кординаты и отписаться от enterFrame.. Вообщем флеш способен на многое, если правильно писать код ![]() |
|
|||||
|
Сделайте одну обработку Event.ENTER_FRAME в Document class'е, в ней перебирайте частицы.
Если делать с помощью BitmapData, достаточно иметь один экземпляр частицы, который постоянно отрисовывать, меняя только координаты в цикле. |
|
|||||
|
что-то типа такого?
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;
}
}
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... Последний раз редактировалось divinus; 04.09.2008 в 17:10. |
|
|||||
|
Вот только divinus меня понял... Спасибо за пример=)
|
|
|||||
|
Регистрация: Jan 2008
Сообщений: 36
|
2divinus
super.stage.addEventListener(MouseEvent.CLICK, this.handler_mouseClick); почему не просто stage ? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Потому что это будет однозначно ссылка на stage, а не на возможно переопределенный геттер stage, который может возвратить что угодно.
|
|
|||||
|
2ign, привычка.
И кстати Цитата:
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... Последний раз редактировалось divinus; 05.09.2008 в 12:48. |
|
|||||
|
Регистрация: Jan 2008
Сообщений: 36
|
Мне казалось, ему нужно нелинейное движение.
2__etc переопределение геттера stage, это конечно круто ![]() Причем переопределение должно быть в этом же классе. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Это почему? Он может быть переопределен и в наследниках. Мы же себя заранее ограждаем от возможной некорретной работы в будущем, используя super.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:26. |
|
|
« Предыдущая тема | Следующая тема » |
|
|