2009-10-13 2 views
1

В основном я просто пытаюсь создать высокопроизводительный класс AnimatedBitmap. Я изучил некоторые классы AnimatedBitmap на основе Sprite, которые используют таймеры и некоторые варианты BitmapData.copyPixels() или BitmapData.draw(), но они, похоже, не так быстро, как просто ошеломляют активы на временной шкале MovieClip и позволяя играть в шкалу времени.Возможно ли установить динамическую временную шкалу мувиклипа с помощью ActionScript 3?

Так что им мышление есть класс, который расширяет MovieClip и показывает что-то вдоль линий следующего псевдокода:

public function contstructTimeline(frameContent:Vector<BitmapData>):void { 
     //Iterate through the frameContent vector and add a bitmap to each keyframe....I do NOT want bitmaps to persist beyond the frame they have been added to. 
     var thisBitmap:Bitmap; 
     for(var i:int = 0 ; i < frameContent.length; i++){ 
      gotoAndStop(i); 
      thisBitmap = new Bitmap(frameContent[i]); 
      addChild(thisBitmap);    
     } 
    } 

Является ли это дураки побегушках?

+0

Это, безусловно, возможно. Почему бы просто не дать ему пойти и посмотреть, если он является fatser? –

ответ

3

хорошо, идея классная, но я предполагаю, вы не можете просто пойти и прыгнуть на несуществующий кадр, а затем добавьте контент (по крайней мере, я так и не удалось) ...

У меня есть два идеи для вас:

  • составить достаточно длинный пустой клип (с достаточным количеством кадров, чтобы делать то, что вам нравится, или несколько из них, с длиной быть степенью 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); 

+0

Спасибо за ответ. Я попробовал, и мой подход был в значительной степени тем, что вы рекомендовали. Единственная проблема заключается в том, что addchild/removeChild не ограничивается ключевым кадром, выполняемым кодом. Поэтому мне пришлось использовать этот зверь (что было так же плохо, как Bitmapdata.copyPixels: (как onEnterFrame) public function onEnterFrame (e: Event): void { \t if (_bitmapDataVector == null || _bitmapDataVector.length <1) {\t возвращение; \t} \t для (вар я: INT = 1; я <= numChildren; я ++) { \t \t если (я = currentFrame) { \t \t \t getChildAt (я-1) .Visible = ложь; \t \t \t продолжают \t \t \t} \t \t getChildAt (i-1) .visible = true; \t \t \t \t \t }} – 2009-10-14 17:39:22

+0

Извините: \t \t общественная функция onEnterFrame (е: Event): пустота { \t \t \t если (_bitmapDataVector == NULL || _bitmapDataVector.length <1) {\t возвращение; \t} \t \t \t для (вар я: INT = 1; я <= numChildren; я ++) { \t \t \t \t если (! Я = currentFrame) { \t \t \t \t \t getChildAt (я-1) .Visible = false; \t \t \t \t \t продолжают \t \t \t \t \t} \t \t \t \t getChildAt (I-1) .Visible = TRUE; \t \t \t \t \t \t \t} \t \t} – 2009-10-14 17:40:41

Смежные вопросы