хорошо, идея классная, но я предполагаю, вы не можете просто пойти и прыгнуть на несуществующий кадр, а затем добавьте контент (по крайней мере, я так и не удалось) ...
У меня есть два идеи для вас:
- составить достаточно длинный пустой клип (с достаточным количеством кадров, чтобы делать то, что вам нравится, или несколько из них, с длиной быть степенью 2 (так что вы не будете иметь не более 50% накладных расходов)) , распространите растровые изображения по кадрам, а затем используйте
MovieClip::addFrameScript
, чтобы добавить gotoAndPlay(0)
в последний кадр.
- Создайте swf во время выполнения, используя подходящую библиотеку, как hxformat (хорошо, для этого вам понадобится haXe, но это то, что я бы предложил, если вы действительно входите в производительность) и загрузите его с помощью
Loader::loadBytes
, я уверен, что есть похожие библиотеки для as3 (вы, вероятно, захотите использовать кодер Corelib png, чтобы вы могли вставлять срезы в swf). Лучше всего было бы создать мувиклип, содержащий требуемую анимацию в качестве актива, поэтому вы загружаете клип один раз, захватываете класс и затем создаете экземпляр (делает операцию синхронной).
конечно, вы могли бы объединить и просто создать пустой клип во время выполнения, а затем заполнить его с данными растровых ...
кроме того, я бы другие предложения:
- положить все кусочки в один спрайт и использовать
DisplayObject::visible
, чтобы сделать трюк.
- сделать преобразование на сервере, с которого вы распространяете швейцарские франки (возможно вводить его с помощью SWFMILL или так)
- выписки banana slice
я бы также отметить, что методы вы описали с помощью BitmapData::copyPixels
или BitmapData::draw
, если они хорошо реализованы, как правило, лучше работают за счет памяти ... это связано с тем, что флеш-плейер, сглаживание, кеширование, обрезка и многое другое не являются оптимальными ... была дискуссия об этом здесь в последнее время ... вы, возможно, захотите его найти ...
ну тогда удачи ...;)
редактировать: хорошо, я согласен, что это не очень приятно, хотя настройки видимости идет почти без затрат (до тех пор, пока вы не заставляйте только после этого) ...
anyways ...хитрость заключается в том, чтобы следить за последний видимый объект, например, так:
package {
import flash.display.*;
import flash.events.Event;
public class SliceBitmap extends Sprite {
private var _currentFrame:uint = 0;
private var _totalFrames:uint;
private var _playing:Boolean;
public function SliceBitmap(slices:Array) {
for each (var slice:BitmapData in slices)
this.addChild(new Bitmap(slice)).visible = false;
this.getChildAt(0).visible = true;
this._totalFrames = slices.length;
this.play();
}
private function onEnterFrame(e:Event):void {
this.goto((this._currentFrame + 1) % this._totalFrames);
}
private function goto(frame:uint):void {
if ((frame < 0) && (frame >= this._totalFrames)) throw "this should be handled";
this.getChildAt(this._currentFrame).visible = false;
this.getChildAt(this._currentFrame = frame).visible = true;
}
public function play():void { this.playing = true; }
public function stop():void { this.playing = false; }
public function get playing():Boolean { return _playing; }
public function set playing(value:Boolean):void {
if (this._playing != value) {
if (this._playing = value)
this.addEventListener(Event.ENTER_FRAME, onEnterFrame, false, int.MAX_VALUE);
else
this.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
}
public function gotoAndPlay(frame:uint):void {
this.goto(frame);
this.play();
}
public function gotoAndStop(frame:uint):void {
this.goto(frame);
this.stop();
}
}
}
и вот некоторый код для проверки:
var slices:Array = [];
for (var i:int = 0; i < 20; i++) {
var b:BitmapData = new BitmapData(200, 200, true);
b.perlinNoise(4, 4, 4, i, true, false, 7, true);
slices.push(b);
}
this.addChild(new SliceBitmap(slices);
Это, безусловно, возможно. Почему бы просто не дать ему пойти и посмотреть, если он является fatser? –