Actionscript3: добавить и удалить EventListeners (с динамическим именем и динамическими переменными) - PullRequest
0 голосов
/ 15 января 2010

Я делаю настольную игру во Flash Action Script 3. Каждая позиция на доске - это кнопки вроде: 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 слушателей (позиции вокруг нажатой единицы)

  • функция deselectUnit (position_x: int, position_y: int):
    он использует функцию listentoButton (0) для удаления 8 слушателей (позиции вокруг нажатой единицы)

Мой вопрос: Добавление обработчиков событий не проблема, но их удаление не работает? Что я сделал не так?

1 Ответ

0 голосов
/ 15 января 2010

Когда вы собираетесь удалить событие, вы используете новый экземпляр 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, и позже, когда вы отправитесь удалять событие, вы найдите экземпляр MySpaceParameters в коллекции на основе координат x и y, затем используйте его для удаления функции.

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