2011-07-11 101 views
1

我想在事件触发时传递参数。我的功能:AS3事件和传递参数

private function keyChange(e:KeyboardEvent, setValue:Boolean):void 

这样我可以使用相同的功能来设置键是否打开或关闭。我将如何编写事件监听器?我试过:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange(,true)); 

但是没有奏效。这可能吗?由于

回答

1

像这样:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChangeHandler); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyChangeHandler); 

... 

private function keyChangeHandler(e:KeyBoardEvent):void 
{ 
    var keyDown:Boolean = e.type == KeyBoardEvent.KEY_DOWN; 

    ... 
    // Do stuff 
} 

但是,如果你想传递参数,你需要使用一个自定义事件:

public class KeyBoardActionEvent extends KeyBoardEvent 
{ 
    public var shouldSetValue:Boolean; 
    public function KeyBoardActionEvent(setValue:Boolean, type:String, bubbles:Boolean = false, cancelable:Boolean = false):void 
    { 
     shouldSetValue = setValue; 
     super(type, bubbles, cancleable); 
    } 
} 
1

直接的方法是检查你的事件处理程序中的事件。

stage.addEventListener(KeyboardEvent.KEY_UP, keyChange); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange); 

private function keyChange(e:KeyboardEvent) { 
    if (e.type == KeyboardEvent.KEY_DOWN) { 
     // ... handle key down, etc... 
    } 
} 

你也可以通过传递addEventListener是通过你想要的,也许做一些封棘手的参数内联函数做到这一点,但它不会获得你在上面的方法什么。

+0

+1好方法来处理这个 – Joe

+0

虽然这并没有解决OP的问题。 – Cameron

0

这是找您的解决方案最简单的方法,

stage.addEventListener(KeyboardEvent.KEY_DOWN,function(e:MouseEvent):void{keyChange(e,true)}); 
1

完全可能的。简单易行:

private function keyChange(setValue:Boolean):Function { 
    return function(e:KeyboardEvent):void { 
    // Now you have both "e" and "setValue" here 
    } 
} 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange(true)); 

如果您想稍后移除监听器,该怎么办?就拿keyChange()出来:

var functionKeyChange:Function = keyChange(true); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, functionKeyChange); 
stage.removeEventListener(KeyboardEvent.KEY_DOWN, functionKeyChange); 

如果您发现该解决方案有趣的,看看this answer