Как узнать, на какой объект я нажал? - PullRequest
0 голосов
/ 14 апреля 2010

Вот сделка: я работаю над личным портфелем в AS3 и столкнулся с проблемой, на которую не могу найти логического ответа. Я хочу, чтобы все (ну, большая часть этого) было редактируемым с файлом XML, включая мое меню. Мое меню - это просто Спрайт с текстом на нем и Твин-твин, ничего страшного. Но я забыл придумать, как определить, какой пункт меню я щелкнул.

Это в моем Main.as

private function xmlLoaded(e:Event):void {
    xml = e.target.xml;
    menu = new Menu(xml);
    menu.x = 0;
    menu.y = stage.stageHeight / 2 - menu.height / 2;
    addChild(menu);
}

В Menu.as

public function Menu(xml:XML) {
    for each (var eachMenuItem:XML in xml.menu.item) {
        menuItem = new MenuItem(eachMenuItem);
        menuItem.y += yPos;
        addChild(menuItem);
        yPos += menuItem.height + 3;
    }
}

и в моем MenuItem.as все работает - у меня есть причудливая анимация, когда я наводю на него курсор, но когда я щелкаю пункт меню, я хочу, чтобы что-то появилось, конечно. Как я узнаю, на какую я нажал? Я пытался вытолкнуть все в массиве, но это не сработало (или, возможно, я делаю это неправильно). Также пробовал глобальный счетчик, но он тоже не работает, потому что значение всегда будет количеством элементов в моем XML-файле. Также пробовал e.currentTarget в моей функции щелчка, но когда я отслеживаю это, все они являются «объектными спрайтами» .. Мне нужно что-то, чтобы я мог дать каждому уникальное «имя»?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Вы можете просто установить переменную имени в классе MenuItem и использовать ее. Затем в обработчике событий вы можете использовать (e.currentTarget as MenuItem).name (или просто e.currentTarget.name)

Кстати, вы знаете, что для каждого .. в не гарантирует, чтобы пройти через XML в порядке, верно?

0 голосов
/ 14 апреля 2010

Вы могли бы также изучить использование словаря - я обнаружил, что использую его все больше и больше для подобных вещей. По сути, он действует как массив, но вместо того, чтобы связывать ваши значения с индексными ключами, он позволяет отображать ссылки на объекты на другие ссылки на объекты. Так, например, вы можете настроить что-то вроде этого:

// create your buttons
var button1:MyButton = new MyButton();
var button2:MyButton = new MyButton();
var button3:MyButton = new MyButton();

// declare and instantiate a dictionary object
var links:Dictionary = new Dictionary();

// populate your dictionary object, mapping values to your buttons.
links[button1] = "http://www.button1URL.com";
links[button2] = "http://www.button2URL.com";
links[button3] = "http://www.button3URL.com";

// group buttons into an array for convenience
var buttons:Array = [button1, button2, button3];

// add event listener to your button
for each (var b:MyButton in buttons) {
     b.addEventListener(MouseEvent.CLICK, clickHandler);
}

// handle the button click by getting the relevant information for the clicked button from
// your dictionary object
function clickHandler(e:MouseEvent):void {
     navigateToUrl(new URLRequest(links[e.currentTarget]));
}

Ваш пример, очевидно, немного сложнее - вам нужно включить ваше значение URL или что-то еще в ваш XML и затем обработать его таким образом. В зависимости от того, что вы делаете, словарь вам может вообще не понадобиться - e.currentTarget.MyValue может отлично работать, если данные включены в саму кнопку.

Надеюсь, это поможет!

0 голосов
/ 14 апреля 2010

У меня есть аналогичный ответ, но я бы использовал HardIt MenuItem (e.currentTarget) вместо мягкого приведения, используя ключевое слово как . Причина в том, что если вы случайно приведете к неправильному типу, мягкое приведение вернет только ноль, тогда как в результате жесткого преобразования вы получите правильную ошибку во время выполнения и номер строки в вашем коде, где проблема.

Я бы также предложил добавить открытую функцию в MenuItem, чтобы получить уникальную ссылку или индекс, чтобы вы могли сделать что-то подобное в обработчике события CLICK в MenuItem

private function onMenuItemClick( event : MouseEvent ) : void{

    // this could be a int, ie. the node index in the XML
    var uniqueSectionReference : String = MenuItem( event.currentTarget ).uniqueReference;

    dispatchEvent( new MenuEvent( MenuEvent.CHANGE, false, false, uniqueSectionReference ) );

    // or if you have a reference in Menu for whatever it is thats controlling your content you could do this

    contentHolder.showSection( uniqueSectionReference );

}
...