для того, чтобы вы, чтобы быть в состоянии сгладить своп вам нужно иметь оба кадра на экране, что не так с подлинным Флэш-рамки. Плавные переходы анимируются с помощью обработчиков ENTER_FRAME
с потенциальным скрытием реального процесса изменения кадра. Итак, для того, чтобы сделать плавный переход, вам нужно переместить изображение одного кадра влево, а для другого кадра двигаться справа, а не просто nextFrame()
. Допустим, у вас есть этап 60fpa, и попробуйте сгладить переход влево. Вам понадобятся два объекта размером с экран, один из которых изображает текущий кадр и один отображаемый кадр, готовый к отображению в виде одного перехода. Пример:
var transition:Sprite;
var bitmaps:Array;
var leftSide:Bitmap
var rightSide:Bitmap;
// initialization code, best placed in constructor
leftSide=new Bitmap();
rightSide=new Bitmap();
bitmaps=[];
transition=new Sprite();
transition.addChild(leftSide);
transition.addChild(rightSide);
rightSide.x=stage.stageWidth; //left side and right side should be aside each other
Это объявление необходимых структур. План состоит в том, чтобы показать transition
, давая ему два Bitmap
s, которые будут связаны с двумя различными объектами BitmapData
, которые будут содержать фотографии нового кадра и старого кадра. Мы нарисуем наш текущий фрейм на битмапдате текущего кадра, затем возьмем сохраненные данные растрового изображения следующего кадра и сделаем переход.
function swipeHandler((event:TransformGestureEvent):void {
var doSwitch:Boolean=false;
var targetFrame:int=currentFrame;
switch(event.offsetX) {
// swiped right
case 1: {
if (currentFrame>2) {
// let's say we're not allowed to swipe right from frame 2
targetframe=currentFrame-1;
doSwitch=true;
}
break;
}
// swiped left
case -1: {
if(currentFrame < 10) {
targetFrame=currentFrame+1;
doSwitch=true;
}
break;
}
}
if (!doSwitch) return;
// prepare transition
if (!bitmaps[targetFrame]) bitmaps[targetFrame]=new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff);
//^make a new bitmap if there's none for target frame
if (!bitmaps[currentFrame]) bitmaps[currentFrame]=new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff);
// the same for source frame
bitmaps[currentFrame].fillRect(bitmaps[currentFrame].rect,0xffffff);
bitmaps[currentFrame].draw(stage); // draw current frame on the bitmap
// with this and stored bitmaps, old frame would remain drawn on the cached bitmap
// and able to be used as a transition image
if (targetFrame>currentFrame) {
leftSide.bitmapData=bitmaps[currentFrame];
rightSide.bitmapData=bitmaps[targetFrame];
transition.x=0;
// here is the place to initialize TweenMax tween to move "transition"
// and don't forget to removeChild(transition) at the end of the tween
} else {
rightSide.bitmapData=bitmaps[currentFrame];
leftSide.bitmapData=bitmaps[targetFrame];
transition.x=-1*stage.stageWidth;
// same here for tweening
}
stage.addChild(transition);
gotoAndStop(targetFrame);
}
Это помещает подготовленный transition
объект на экране поверх всех элементов, лежащих в основе, эффективно маскирует точный переключатель кадра, сделанный gotoAndStop()
вызова. Координата объекта x
может быть затем прокручена вперед, и объект должен быть удален со сцены после того, как будет показана анимация.
Надеюсь, это поможет.