【问题标题】:Actionscript3: add and remove EventListeners (with dynamic name and dynamic variables)Actionscript 3:添加和删除事件侦听器(具有动态名称和动态变量)
【发布时间】:2011-01-05 07:01:21
【问题描述】:

我在Flash操作脚本中制作了一个Boardgame。电路板上的每个位置是如下按钮:Button_1_1,Button_1_2等。只要选择一个字符,您想移动它,所以脚本必须为位置添加活动侦听器围绕所选单位


// This function adds or deletes an event listener
function listentoButton (isTrue:int, position_x:int, position_y:int):void {
    var myFunction:Function = new Function;
    myFunction = function ():void {userClickedPosition(position_x, position_y)};
    if (isTrue == 1) {
        this["button_position_"+(position_x)+"_"+(position_y)].addEventListener(MouseEvent.CLICK, myFunction);
    } else {
        this["button_position_"+(position_x)+"_"+(position_y)].removeEventListener(MouseEvent.CLICK, myFunction);
    }
}

在我剩下的代码中:

  • 函数 userClickedPosition(position_x:int, position_y:int)
    它选择或取消选择一个单位

  • 函数 selectUnit(position_x:int, position_y:int):
    它使用listentoButton(1)函数添加8个监听器(点击单元周围的位置)

  • 函数取消选择单元(position_x:int, position_y:int):
    它使用listentoButton(0)函数删除8个监听器(点击单元周围的位置)

我的问题: 添加事件监听器没问题,但删除它们似乎不起作用?我做错了什么?

【问题讨论】:

    标签: actionscript-3 dynamic variables event-listener


    【解决方案1】:

    当您移除事件时,您使用的是 myFunction 的一个新实例,而不是您添加它时使用的那个实例。您需要像声明任何其他函数一样声明该函数,并使用事件参数来检查按钮的位置。我认为您想要 stageX 和 stageY 属性: http://www.adobe.com/livedocs/flex/3/langref/flash/events/MouseEvent.html

    // This function adds or deletes an event listener
    function listentoButton (isTrue:int, position_x:int, position_y:int):void {
        if (isTrue == 1) {
            this["button_position_"+(position_x)+"_"+(position_y)].addEventListener(MouseEvent.CLICK, myFunction);
        } else {
            this["button_position_"+(position_x)+"_"+(position_y)].removeEventListener(MouseEvent.CLICK, myFunction);
        }
    }
    
    function myFunction(eventArg:MouseEvent):void {
    //use MouseEvent
    };
    

    或者您可以创建一个小的 MyFunctionParameters 类来保存坐标信息并创建该类的新实例,将其添加到由 x 和 y 坐标索引的集合中,然后当您移除事件时,您会根据 x 和 y 坐标在集合中查找 MySpaceParameters 实例,然后使用它来删除函数。

    class MyFunctionParameters
    {
    public x:int;
    public y:int;
        function myFunction(eventArg:MouseEvent):void {
            userClickedPosition(x,y);
        };
    }
    

    【讨论】:

    • 谢谢!使用 stageX 和 stageY 属性似乎工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多