Flash 拖动AS3中的对象以影响currentFrame(相对于x/y坐标)

Flash 拖动AS3中的对象以影响currentFrame(相对于x/y坐标),flash,actionscript-3,Flash,Actionscript 3,我有一个在Flash视频文件中旋转的三维对象(嵌入在MovieClip中)。它有100帧长 用startDrag()在Flash中拖动对象以影响其x/y坐标是很简单的 但我希望能够拖动对象并根据鼠标从左到右的位置更改MovieClip的currentFrame 我最好的想法是: 在对象周围有一个不可见的框 在不可见框上启动startDrag() 在拖动操作过程中,根据原点的位置设置currentFrame 完成拖动操作后,将不可见框捕捉回原始位置,并记录帧偏移量,以便下次有人拖动它时使用 只

我有一个在Flash视频文件中旋转的三维对象(嵌入在MovieClip中)。它有100帧长

startDrag()
在Flash中拖动对象以影响其x/y坐标是很简单的

但我希望能够拖动对象并根据鼠标从左到右的位置更改MovieClip的
currentFrame

我最好的想法是:

  • 在对象周围有一个不可见的框
  • 在不可见框上启动startDrag()
  • 在拖动操作过程中,根据原点的位置设置
    currentFrame
  • 完成拖动操作后,将不可见框捕捉回原始位置,并记录帧偏移量,以便下次有人拖动它时使用
只是想确保没有更简单的技巧,或者我可以使用的“开箱即用”(AS3代码或IDE脚本)



编辑我正在采用这种方法,而且效果很好。不过Flash似乎不喜欢在电影剪辑中随机向后搜索。如果我向右拖动,它将平稳播放,但是如果我向左拖动,它将非常跳跃,试图寻找前一帧。是否有一些AS3可以优化“反向播放”?

如果您需要AS3代码:

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  stage.addEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  stage.removeEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

只需注意flash中有一些代码。

如果您想要AS3代码:

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  stage.addEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  stage.removeEventListener(Event.MOUSE_LEAVE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

请注意,flash中有很多内容。

这实际上看起来很有趣!我建议看一下鼠标在屏幕上的移动。您可能不需要实际拖动对象

在这种情况下,我将尝试计算我的开始X(应该是发生mousedown事件的位置)和我的当前X(我相信是event.StageX用于鼠标移动)之间的差值——基本上,就是用户在X方向上移动鼠标的距离。然后我将这个值除以“阶跃值”。例如,如果我想在x轴上每20个单位移动一帧,我的步长值应该是20。然后可以使用Math.floor()或int()截断要转换为帧动画的值。(此方法的优点-如果在变量中定义步长值,则可以在运行时对其进行更改,这意味着您可以使用快速和慢速拖动速度,或者执行任何其他操作。)

这基本上可以让您跳过“拖动不可见对象”步骤


祝你好运。

这看起来真的很有趣!我建议看一下鼠标在屏幕上的移动。您可能不需要实际拖动对象

在这种情况下,我将尝试计算我的开始X(应该是发生mousedown事件的位置)和我的当前X(我相信是event.StageX用于鼠标移动)之间的差值——基本上,就是用户在X方向上移动鼠标的距离。然后我将这个值除以“阶跃值”。例如,如果我想在x轴上每20个单位移动一帧,我的步长值应该是20。然后可以使用Math.floor()或int()截断要转换为帧动画的值。(此方法的优点-如果在变量中定义步长值,则可以在运行时对其进行更改,这意味着您可以使用快速和慢速拖动速度,或者执行任何其他操作。)

这基本上可以让您跳过“拖动不可见对象”步骤


祝你好运。

关于向后播放剪辑,最好在初始“向前”移动后再播放100帧,向后播放旋转动画。然后,您可以使用简单的逻辑在1-100(正向)帧和101-200(反向)帧之间切换


这样,您就不会要求flash向后播放一个剪辑,这不是它设计的目的。

关于向后播放剪辑,最好在初始“向前”移动后再播放100帧,向后播放旋转动画。然后,您可以使用简单的逻辑在1-100(正向)帧和101-200(反向)帧之间切换


这样,您就不会要求flash向后播放剪辑,而这不是它的设计目的。

关于避免可拖动对象的有趣建议。我肯定需要一个对象来表示视频的边界(因为它比视频剪辑小),我想我想利用围绕可拖动对象的“传统智慧”,但这绝对是一个选项。另外,在一行代码中拖动一个对象总是有某种原始的乐趣:-)@Simon啊-这个对象并没有填满整个舞台。从UI的角度来看,需要注意的一件事是,如果您通过拖动操作对象,则拖动不应停止,直到用户释放鼠标按钮。这意味着,如果在对象边界内开始拖动并拖动到对象边界外,当用户位于对象边界外时,对象仍应旋转。在大多数操作系统中,您会注意到这种行为;人们已经习惯了它,所以如果可以的话,我建议实施它。但是,请检查@Simon Note,我的解决方案只能在Flash SWF中使用此方法-我的解决方案是全局的,但该线程中的解决方案允许您拖动到SWF区域之外,这可能会根据您的应用程序而有所帮助。(许多用户“轻弹”鼠标以快速移动——如果你预料到这一点,我建议使用对象拖动方法。)是的——我们的设计师希望人们能够“扔”对象,让它旋转并优雅地减速。这已经超出范围了。但愿我有时间玩这样的东西,但我认为这不会增加更多的销量@Simon Hmm。使用鼠标移动方法,这实际上是可行的-逻辑上,你可以检查x/y的增量,并根据它的初始大小设置速度。(基本上,你的鼠标速度会转化为你的动画速度。)从编程的角度来看,这是有意义的,但我没有暗示