Actionscript 3 AS3-如何从不同事件中调用先前的currentTarget?

Actionscript 3 AS3-如何从不同事件中调用先前的currentTarget?,actionscript-3,events,Actionscript 3,Events,我有一个下拉菜单,可以让你选择一个项目放置在舞台上。该项可以拖放,因此我使用event.currentTarget.startDrag()以开始拖动。好的,到目前为止一切正常 但是,我还需要能够在拖动项目时旋转项目(使用空格键) 如果我在一个对象的实例名中硬编码,那么一切都可以正常工作——因此旋转函数工作正常。问题是,在keyDown事件内部时,如何从startDrag函数引用event.currentTarget 我的第一个想法是将event.currentTarget设置为一个变量,然后在k

我有一个下拉菜单,可以让你选择一个项目放置在舞台上。该项可以拖放,因此我使用
event.currentTarget.startDrag()以开始拖动。好的,到目前为止一切正常

但是,我还需要能够在拖动项目时旋转项目(使用空格键)

如果我在一个对象的实例名中硬编码,那么一切都可以正常工作——因此旋转函数工作正常。问题是,在keyDown事件内部时,如何从startDrag函数引用event.currentTarget

我的第一个想法是将event.currentTarget设置为一个变量,然后在keyDown事件中调用该变量。但是,
targetHold=event.currentTarget似乎没有记录正在单击的对象的实例名称



单击对象时,它应该具有焦点。如果在对象上而不是舞台上注册
键盘事件的侦听器,则它将是
.currentTarget

这里有一个例子说明了我的想法。开始拖动后,立即将侦听器添加到同一对象,而不是舞台

event.currentTarget.startDrag();
event.currentTarget.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);


正确的方法是定义类中的所有功能。在一个自包含类中,您不需要任何
.currentTarget

以下是我将如何做到这一点:(实际上,我会按照@null的建议,将它封装在一个子类中,您的所有可拖动对象都将扩展,但这有点宽泛,所以这样就可以了)


我认为这是最干净的解决方案,您应该添加一个示例though@jdfinch3我添加了一个快速解决方案。如果你想要一个类的例子,你必须提供所有关于代码中发生了什么的信息-但它会旋转一圈,然后失去焦点,必须重新单击…显示代码,从何处开始和停止拖动。将
事件.currentTarget
存储在变量中应该可以正常工作。您确定您的
targetHold
var是全局定义的,而不是在函数中定义的吗?添加了代码。谢谢这只是一个猜测,但是如果你把gotoAndStop注释掉会发生什么呢?它在第一次旋转后仍然会失去焦点吗?很有趣。我添加了
跟踪(“旋转”+旋转)到myKeyDown函数的开头。代码中有gotoAndStop时,响应为2,然后没有其他响应(它跳过1,转到2,并停止循环)。我尽可能准确地注释了gotoAndStop和跟踪报告-“1,2,3,4,1,2,3,4…”。我完全按照描述进行了更改-在尝试旋转时,它似乎仍然失去焦点。我可以请你(或@null)提供一个简单的例子,说明如何使用类来设置它吗?我正在自学3/Flash,还没有完全“获得”OOP。我刚刚注意到你的代码中有一个
public
关键字。你能发布代码来自的整个类文件吗?或者至少是您调用clickToDrag和ReleaseTDrop的部分。我发布的代码应该可以工作,如果能弄清楚在你的情况下是什么使它失去焦点,那将是一件好事。另外,你的gotoAndStop(旋转)在那个框架上实际上做了什么?它连接到一个有4个框架的MovieClip上-它只是在剪辑的4个框架中旋转。最后用你的代码得到了它!我有一些不合适的地方,这是一个问题。另一个主要问题是,我在旋转的电影剪辑中有一个文本字段。我删除了文本字段,现在它可以工作了。现在,我只需要找出如何使它与文本字段一起工作D非常感谢你对蝙蝠侠和null的帮助!
public var targetHold:Object = new Object;

function ClickToDrag(event:MouseEvent):void {
    event.currentTarget.startDrag();
    targetHold = event.currentTarget;
        trace ("targetHold " + targetHold);

    stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
    function myKeyDown(e:KeyboardEvent):void{
    if (e.keyCode == Keyboard.SPACE){
        rotate++;
        if (rotate == 5){
            rotate = 1;
        }
        targetHold.gotoAndStop(rotate); //does not work
        } 
    }


function ReleaseToDrop(event:MouseEvent):void { 
    event.currentTarget.stopDrag();
}
event.currentTarget.startDrag();
event.currentTarget.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
public var targetHold:MovieClip; //don't make a new object, just create the empty var

public function YourConstructor(){
    //your other constructor code
    stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown); //don't add the listener in the click function
}

private function clickToDrag(event:MouseEvent):void {
    if(targetHold) ReleaseToDrop(null);  //safeguard in case flash lost the focus during the mouse up

    targetHold = event.currentTarget as MovieClip;  //assign the current target. Might as well cast it as MovieClip and get code completion benefits
    targetHold.startDrag();
    trace ("targetHold " + targetHold);
}

private function myKeyDown(e:KeyboardEvent):void{
    //check if target hold exists
    if (targetHold != null && e.keyCode == Keyboard.SPACE){
        rotate++;
        if (rotate == 5){
            rotate = 1;
        }
        targetHold.gotoAndStop(rotate);
    } 
}

private function ReleaseToDrop(event:MouseEvent):void { 
    if(targetHold) targetHold.stopDrag();
    targetHold = null;
}