Форум 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=214629)

_Георгий_ 17.10.2017 08:05

Какая кнопка нажата?
 
На экране 50 кнопок. Включен слушатель мыши. Необходимо определить, какая кнопка нажата.

Код AS3:

function myClick(event: MouseEvent): void {
 
        if (Even.Target == "[object b_01]") mc_1 = new MC01();
        if (Even.Target == "[object b_02]") mc_1 = new MC02();
        ……………………………………………………………….
        if (Even.Target == "[object b_50]") mc_1 = new MC50();
 
}

Можно ли как-то унифицировать «определитель», чтобы «тупо» не писать 50 строк. Ведь, в trace(event.target) мы видим объект, по которому был произведён клик, например, "[object b_35]". Можно ли из "[object b_35]" как-то выделить «35». Потом сложить в строковой переменной «MC» + «35» = «MC35», а затем как-то «подставить» в «new MC35()»?

Wolsh 17.10.2017 08:16

Для оформления своего кода используйте теги AS3 (а не Bold).

Партизан 17.10.2017 22:25

Цитата:

Сообщение от _Георгий_ (Сообщение 1202437)
Можно ли из "[object b_35]" как-то выделить «35». Потом сложить в строковой переменной «MC» + «35» = «MC35», а затем как-то «подставить» в «new MC35()»?

Сами же описали решение... Ответ: можно.

ZackMercury 17.10.2017 22:28

event.target - это не строка, а объект.
У вас должно быть
Код AS3:

function myClick(event: MouseEvent): void {
 
        if (event.target.toString() == "[object b_01]") mc_1 = new MC01();
        if (event.target.toString() == "[object b_02]") mc_1 = new MC02();
        ……………………………………………………………….
        if (event.target.toString() == "[object b_50]") mc_1 = new MC50();
 
}

Как быдлокодерский вариант
Код AS3:

function myClick(event: MouseEvent): void {
        var name:String = flash.utils.getQualifiedClassName(event.target);
        if(name.charAt(0).toLowerCase() != "b") return;
        var num:String = name.substr(name.lastIndexOf("_") + 1);
        var SomeMC:Class = flash.utils.getDefinitionByName("MC" + num);
        mc_1 = new SomeMC();
}

Я бы сделал словарь кнопка-мувик вместо этого.

Wolsh 17.10.2017 23:22

я бы "сложил" все кнопки в массив и все классы мувиков в другой массив — даже безотносительно задачи, просто чтобы иметь на них упорядоченные ссылки. Ну и потом — кликнули, узнали индекс event.target в массиве и взяли класс мувика из второго массива. Через строки реально не комильфо.

Партизан 17.10.2017 23:29

Цитата:

Сообщение от Wolsh (Сообщение 1202457)
я бы "сложил" все кнопки в массив и все классы мувиков в другой массив — даже безотносительно задачи, просто чтобы иметь на них упорядоченные ссылки. Ну и потом — кликнули, узнали индекс event.target в массиве и взяли класс мувика из второго массива. Через строки реально не комильфо.

Вива! Очень кратко описали:)

ZackMercury 17.10.2017 23:31

А можно сделать это с помощью одного массива, называется Dictionary - словарик)
Правда инициализация у него не совсем красивая, надо как ни крути писать
Код AS3:

mcs[btn1] = MC1;
mcs[btn2] = MC2;
...

Хотя это решаемо с помощью цикла и getDefinitionByName()

Код AS3:

var mcs:Dictionary = new Dictionary();
for(var i:int = 1; i < 50; i++)
        mcs[this["btn" + i]] = getDefinitionByName("MC" + (i < 10)?"0":"" + i);


caseyryan 18.10.2017 06:42

Код конечно кривой, как у же написали. Но решить эту задачу можно простой регуляркой
Код AS3:

var objectName:String = event.target.toString();
var digitPart:String = objectName.match( /\d+/)[0]; // выдаст что-то типа 01, 02... в зависимости от имени класса
var ClipClass:Class = getDefinitionByName("MC" + digitPart) as Class;
mc_1 = new ClipClass();

Как-то так.
Но работать это будет, только если в названии класса действительно есть числа в конце

_Георгий_ 18.10.2017 10:32

Всем большое спасибо!

P.S.
Использую вариант от ZackMercury. Только вместо:
Код AS3:

var SomeMC:Class = flash.utils.getDefinitionByName("MC" + num);

сделаю:
Код AS3:

var SomeMC:Class = flash.utils.getDefinitionByName("MC" + num) as Class;


Appleman 18.10.2017 10:33

Цитата:

Сообщение от ZackMercury (Сообщение 1202450)
Как быдлокодерский вариант
Код AS3:

function myClick(event: MouseEvent): void {
        var name:String = flash.utils.getQualifiedClassName(event.target);
        if(name.charAt(0).toLowerCase() != "b") return;
        var num:String = name.substr(name.lastIndexOf("_") + 1);
        var SomeMC:Class = flash.utils.getDefinitionByName("MC" + num);
        mc_1 = new SomeMC();
}


Быдлокодерский - хорошее определение :). По каким критериям ты относишь код к такому?


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

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