Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   передача параметров функции при клике (http://www.flasher.ru/forum/showthread.php?t=116558)

Орец 03.10.2008 18:00

передача параметров функции при клике
 
Преамбула:
На экране есть картинка, на картинке несколько десятков областей(кнопок) при наведении мыши или кликах по ним совершаются разные действия. Когда эта программа была сделана в AS2 все кнопки содержали около двух десятков строк кода и были одинаковые, единственная разница - номер в массиве соответствующий области.
Сейчас я хочу переделать на AS3 т.к. в ближайшем будущем программа должна быть значительно увеличена и надо минимизировать объём кода.

Планировал создать три функции которые будут выполняться при наведении на кнопку, клике и убирании курсора с кнопки. А так же по три отслеживателя события на каждую кнопку.
Проблема возникла при передаче функции параметра - номера области в массиве.
Объявление функции:
Код:

function limys (p:Number, event:MouseEvent):void
{
        // выполняемый код
}

Вызов функции наведением на кнопку:
Код:

k1.addEventListener(MouseEvent.MOUSE_OVER, limys(1));
Вопрос: В чём ошибка или как достичь желаемого результата :away:

Andrei666 03.10.2008 18:59

Ну если в лоб, то:
Код:

function limys1(event:MouseEvent):void
{
        // выполняемый код
}
function limys2(event:MouseEvent):void
{
        // выполняемый код
}
....

Код:

k1.addEventListener(MouseEvent.MOUSE_OVER, limys1);
k1.addEventListener(MouseEvent.MOUSE_OVER, limys2);
....

Но если у них есть хоть что общее то проще использовать event.target

kackbip 03.10.2008 19:31

Орец, передавать параметры в обработчики событий нельзя.
Номер области в массиве сохраняйте в самой кнопке.
А достать его можно так:
Код:

function limys (event:MouseEvent):void
{
        (event.currentTarget as Btn).id;
}

здесь Btn - класс вашей кнопки(области картинки).

Орец 06.10.2008 10:51

Цитата:

Сообщение от kackbip (Сообщение 768028)
Орец, передавать параметры в обработчики событий нельзя.

Спасибо. Жаль.
Цитата:

Сообщение от kackbip (Сообщение 768028)
Номер области в массиве сохраняйте в самой кнопке.

Это как? Мне казалось что в кнопках AS3 ничего кроме названия сохранить нельзя. А название не может быть числовым.
Вот имя я могу достать как:
Код:

(event.currentTarget).name;
Цитата:

Сообщение от kackbip (Сообщение 768028)
А достать его можно так:
Код:

function limys (event:MouseEvent):void
{
        (event.currentTarget as Btn).id;
}

здесь Btn - класс вашей кнопки(области картинки).

А можно немного более развёрнутый пример доставания? И того как в кнопке номер сохранить :rolleyes:

kackbip 06.10.2008 11:37

Вам нужно просто создать класс, где помимо прочего будет публичное свойство id. Вы при инициализации вашего творения раздаете всем нужные id, а при клике считываете.

wvxvw 06.10.2008 12:18

Если все все равно пишется на таймлайне, то проще будет:
Код:

var hash:Dictionary = new Dictionary();
hash[myClip] = i; // где i уникальный ключ по которому можно будет проверить
// какой из клипов вызвал обработчик события типа:
function clickHandler(evt:MouseEvent):void
{
    if (hash[evt.target] == i) // вы кликнули пo клипу #i
}


icansee 16.12.2008 15:31

Привет!

Слушайте, ну я совсем новенький. До этого занимался только простой флэш-анимацией, а сейчас решил разобраться с AS.

Вопрос у меня похожий.

На сцене добавлено несколько муви-клипов с разными именами, отличающимися только индексом (hs0, hs1, hs2 и т.д.). На сцене их будет много и они все выполняют одно и то же действие. По этому я создал цикл для одинаковых слушателей.

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

Ну не создавать же столько функций, сколько объектов в сцене, так ведь? И слушателей не за чем дублировать. Но как это сделать вот это соответствие:

наводя мышкой на определенный объект мы выводим определенную строку из массива?

Код AS3:

var colorXML:XML;
var xmlReq:URLRequest = new URLRequest("colorxml.xml");
var xmlLoader:URLLoader = new URLLoader();
var hash:Dictionary = new Dictionary();
var movieNumber;
 
function xmlLoaded(event:Event):void {
        colorXML = new XML(xmlLoader.data);
        colorXML.ignoreWhitespace = true;
        trace("XML loaded!");
}
 
xmlLoader.load(xmlReq);
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
 
 
for (var i=0; i<3; i++) {
        this["hs" + i].addEventListener(MouseEvent.ROLL_OVER, onBoxOver);
        hash[i] = movieNumber;
 
}
 
function onBoxOver(evt:MouseEvent):void {
        var _text:String;
        var _textArray:Array = new Array;
 
        for (var i=0; i<3; i++) {
                _textArray[i]=colorXML.store[i].name;
        }
 
        if (hash[evt.target] == movieNumber) {
                _text = _textArray[1];// как сделать соответствие выбранного объекта определенному значению массива?
        }
        trace(_text);
}

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

Орец 17.12.2008 13:35

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

А функция получала название вызывающего объекта:
Код AS3:

var par=(event.currentTarget).name;

Потом обрезались символы имени, так чтобы остался лишь номер:
Код AS3:

par=par.replace("hs","");

После чего использовалось значение из массива:
Код AS3:

massiv[par][0]



Часовой пояс GMT +4, время: 21:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.