跳帧的滑动手势不顺畅

时间:2015-05-21 10:11:18

标签: actionscript-3 flash

我已经制作了一个as3 android应用程序,其中我使用了滑动手势来进行下一帧和前一帧。但我希望当我跳到下一帧或上一帧时,它会顺利滑动。我尝试使用tween max但它不起作用。我发现补间插件总是适用于电影剪辑。所以我怎样才能使滑动顺畅。可以我没有补间插件让它变得流畅?这是我的代码......

Multitouch.inputMode = MultitouchInputMode.GESTURE;
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, SwipeHandler);
function SwipeHandler(event:TransformGestureEvent):void
{
   switch(event.offsetX)
   {
      // swiped right
      case 1:
      {
        prevFrame();
        break;
      }

     // swiped left
     case -1:
     {
        if(currentFrame == 10) 
        {
          stop();
        }
        else
        {
          nextFrame();
          break;
        }
      }
   }
 }

1 个答案:

答案 0 :(得分:1)

为了使您能够平滑交换,您需要在屏幕上同时拥有两个帧,而真正的Flash帧则不然。平滑过渡通过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,它们将链接到两个不同的BitmapData对象,这些对象将保存新框架和旧框架的图片。我们将在当前帧的bitmapdata上绘制当前帧,然后获取存储的下一帧位图数据和do转换。

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坐标可以在之后进行补间,并且一旦补间结束就应该从舞台中删除该对象。

希望这有帮助。