Actionscript 3 记录用户操作并使用flash cs6+将其保存为swf文件;as3

Actionscript 3 记录用户操作并使用flash cs6+将其保存为swf文件;as3,actionscript-3,flash,flash-cs6,Actionscript 3,Flash,Flash Cs6,我正在尝试跟踪我的flash项目上的用户操作,并将其存储为swf文件或视频。请提供帮助 我编写了这段代码来捕获位图并在单击时显示它们 电影唇 stage.addEventListener(Event.ENTER_FRAME,capture) var ar=new Array() function capture(e:Event) { trace("done") var bd:BitmapData = new BitmapData(stage.sta

我正在尝试跟踪我的flash项目上的用户操作,并将其存储为swf文件或视频。请提供帮助 我编写了这段代码来捕获位图并在单击时显示它们 电影唇

stage.addEventListener(Event.ENTER_FRAME,capture)
    var ar=new Array()
    function capture(e:Event)
    {
        trace("done")
    var bd:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight);
    bd.draw(stage);
    var screenshot:Bitmap = new Bitmap(bd);
    ar.push(screenshot)
    }
    vv.addEventListener(MouseEvent.CLICK,gg)
    var xx=0
    var intr
    var interval
    function gg(e:MouseEvent)
    {    
    interval = setInterval(reg_st, 24);


    }
    function reg_st()
    {
        stage.removeEventListener(Event.ENTER_FRAME,capture)

        stage.addChild(ar[xx])
        if(xx<ar.length-1)
        {
        xx++
        }
        else
        {
            xx=0
        }
    }
stage.addEventListener(事件。输入帧,捕获)
var ar=新数组()
功能捕获(e:事件)
{
跟踪(“完成”)
var bd:BitmapData=新的BitmapData(stage.stageWidth,stage.stageHeight);
bd.draw(阶段);
var屏幕截图:位图=新位图(bd);
ar.push(屏幕截图)
}
vv.addEventListener(MouseEvent.CLICK,gg)
变量xx=0
var intr
var区间
功能gg(e:MouseEvent)
{    
间隔=设置间隔(寄存器,24);
}
函数reg_st()
{
stage.removeEventListener(事件。输入帧,捕获)
stage.addChild(ar[xx])

如果(xx跟踪很简单,请将侦听器添加到stange以跟踪键盘输入和鼠标输入,您将对以下内容感兴趣:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onUserKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onUserKeyUP);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onUserMouseMove);
stage.addEventListener(KeyboardEvent.MOUSE_DOWN, onUserMouseUp);
stage.addEventListener(KeyboardEvent.MOUSE_UP, onUserMouseDown);
当输入发生时,处理程序将简单地将事件放入带有时间戳的数组中

更难的部分是播放。或者实际上是交互。你基本上需要模拟整个程序。这可能非常困难,也可能非常简单,这取决于你的应用程序的结构和逻辑。我无法为你提供解决此类问题的代码,但我可以分享一个逐步的逻辑,可能有助于你制定自己的解决方案:

  • 将侦听器添加到所有预期的用户交互,而不是程序的根级别
  • 制作几个收集器,用于存储所有带有时间戳的事件,可能还有对象的指针
  • 获取数据(在用户退出程序或从上一个会话进入程序时发送此数据)
  • 使用时间戳信息提供的时间偏移从用户交互数组调用方法(处理程序)。注意:您需要停止封装并将所有这些方法公开
  • 享受你的“视频”

  • 为什么要直接保留对象上的指针?一旦应用程序结束,这些指针将失效。您必须获取接收用户输入的对象上的元数据,比如说,如果它是源(!)中的“selectDialog.btnToggleParameter”,则必须从stage开始派生实际链接。它类似于表单
    stage.getChildAt(0)[“selectDialog”][“btnToggleParameter”]
    ,只有当这些值是公共的时,您才能获取它们。但是,也可以使用另一种方法-
    stage.getChildAt(0)。getChildAt(7)。getChildAt(11)
    ,其中数字可以通过查询从
    event.target开始的DisplayList来派生。接下来,您可以尝试捕获冒泡的事件(有些事件不会冒泡,因此您必须将侦听器附加到它们的目标上,其他事件最终到达阶段),然后使用
    stage.dispatchEvent(…)调度正确的事件,为正确的事件提供一整套参数
    ,从字面上模拟用户输入。使用这种方法,不需要封装中断。我认为只要开发人员使用事件模型,您的方法就可以完美地工作。但是如果用户使用信号、回调等。我相信我们只剩下向输入源添加侦听器和跟踪输入。正如我前面所说的呃,复制用户的行为并不难,就像与只有这些数据的GUI交互一样。嗯,我的答案更具理论性,可能不适合计划中的应用程序设计的实际实现。因此,我并不声称我的答案是唯一最好的,有效的或可能的。嗯,我们真的需要键盘吗来自用户的d和鼠标事件,以及来自应用程序的enterframe事件?所有这些都可以在阶段级捕获,我们需要跟踪键盘事件的聚焦组件,因此我们可以通过捕获的显示列表位置调用
    setFocus
    (顺便说一句,如果应用程序是非确定性的,则使用
    Math.random()
    要移动可交互对象,即使这样也会失败,因为我们无法截获
    Math.random()
    调用)并谨慎地分派事件。我只是试图纠正你的一般方法,而不是批评它。你做得很漂亮。读它真的很有趣:)我一定会自己做这件事。很难想象所有的细节和所有的里程碑。你实际上预见到了比我想象的更多的这样一个应用程序的工作流程。