Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как сделать, чтобы вместо instance6 писало само имя переменной экземпляра класса? (http://www.flasher.ru/forum/showthread.php?t=211501)

nelco 13.09.2015 03:44

как сделать, чтобы вместо instance6 писало само имя переменной экземпляра класса?
 
существует слушатель:
Код AS3:

_button1.addEventListener(MouseEvent.CLICK, mouseClickListener);

где _button1 имеет тип Button;

какое свойство и у какого объекта в функции mouseClickListenera вернёт именно название _button1?
e.currentTarget возвращает [Object Button], а e.currentTarget.name возвращает instance6 вместо самого имени кнопки (_button1)... как сделать, чтобы возвращалось именно само имя экземпляра? а то мне приходится цепляться в условии за сам текст текстового поля, вместо названия кнопки, а это не правильно... :\

Код AS3:

 
                private function mouseClickListener(e:MouseEvent):void
                {       
 
 
                        if (e.target.text == "arrays"){
 
                                _floatingCont = new FloatingCont("C://Arrays.as");
                                addChild(_floatingCont);
 
                        }
                        if (e.target.text == "textFields") {
 
                                _floatingCont = new FloatingCont("C://textForLoad.txt");
                                addChild(_floatingCont);
 
                        }
 
                }


udaaff 13.09.2015 04:45

_button1 - это не имя экземпляра кнопки, это имя переменной, которая хранит ссылку на объект кнопка и бессмысленно пытаться получить название этой переменной, т.к. это просто "хранитель ссылки", коих может быть сколько угодно с какими угодно именами. Что можно сделать, так это записать желаемое имя в свойство name.

nelco 13.09.2015 05:38

Цитата:

Сообщение от udaaff (Сообщение 1186649)
_button1 - это не имя экземпляра кнопки

я думал ИМЯ ЭКЗЕМПЛЯРА это и есть ИМЯ ПЕРЕМЕННОЙ :\ если у меня написано в поле класса private var _button1:Button = new Button(); , то _button1 - это имя ПЕРЕМЕННОЙ экземпляра? а имя экземпляра - это _button1.name = "name"? как коду отличать _button1.addEvetnListener от _button2.addEvenlistener без присваивания имени _button1 и button2? за сами названия _button1 и _button2 нельзя никак зацепиться без присваивания имени?

Wolsh 13.09.2015 11:16

Код AS3:

                private function mouseClickListener(e:MouseEvent):void 
                {       
 
 
                        if (e.currentTarget == _button1){
 
                                _floatingCont = new FloatingCont("C://Arrays.as");
                                addChild(_floatingCont);
 
                        }
                        if (e.currentTarget == _button2) {
 
                                _floatingCont = new FloatingCont("C://textForLoad.txt");
                                addChild(_floatingCont);
 
                        }
 
                }


ZackMercury 13.09.2015 11:25

Имя экземпляра(Instance name) было придумано исключительно для Flash IDE, для кода в кадрах. Больше не знаю мест, где оно используется.
Получать имя переменной нет смысла, имея на неё ссылку.
Вообще, судя по всему вы хотели сделать как-то так

Код AS3:

var button:Button = new Button();
button.label = "В игру!";
var button2:Button = new Button();
button2.label = "Выйти...";
button2.x += button1.width;
addChild(button);
addChild(button2);
button.addEventListener(MouseEvent.CLICK, onButtonHit);
button2.addEventListener(MouseEvent.CLICK, onButtonHit);
 
function onButtonHit(e:MouseEvent):void
{
  var label:String = (e.currentTarget as Button).label;
  switch(label)
  {
      case "В игру!":
        //Заходим в игру
        break;
      case "Выйти...":
        //Выходим
        break;
  }
}

или как Wolsh написал выше.

nelco 13.09.2015 19:46

спасибо! я хотел сделать так, как написал Wolsh (т.е. меньше кода, без присваивания параметра .name или .label), но e.currentTarget возвращало мне [object Button], поэтому я думал, что от обеих кнопок e.currentTarget будет возвращать одинаково [object Button] и не получится их так отличать, как написал Wolsh, но оказывается - получается. Теперь вот пробую сделать удаление контейнера с текстом (который открывается при нажатии на эти кнопки) и выходит ошибка, буду опять спрашивать в новой теме если сейчас не разберусь сам. Спасибо за ответы, за помощь! :)

ZackMercury 13.09.2015 23:06

Цитата:

где _button1 имеет тип Button;
Цитата:

(т.е. меньше кода, без присваивания параметра .name или .label)
Тоесть ваши кнопки без заголовка?

nelco 14.09.2015 01:50

Цитата:

Сообщение от ZackMercury (Сообщение 1186681)
Тоесть ваши кнопки без заголовка?

заголовок - это label? да, без него... для чего он нужен? чтобы обращаться к кнопке? по имени переменной нельзя обратиться будет? я просто только начинаю изучать AS3 поэтому вообще ничего ещё не знаю.

Isfet 14.09.2015 08:52

Цитата:

Сообщение от nelco (Сообщение 1186695)
заголовок - это label? да, без него... для чего он нужен? чтобы обращаться к кнопке?

чтобы имея ссылку на кнопку, понять что это за кнопка, как вы поймете что это за кнопка, если у вас все кнопки хранятся не в переменных, а, допустим, в массиве?

Wolsh 14.09.2015 13:15

nelco, для начала Вам хорошо бы понять, что такое ссылка, объект, экземпляр, переменная, свойство. Изучать программирование методом тыка чертовски занимательно, но крайне непродуктивно. Советую почитать книги, или хотя бы статьи в интернет.
Все объекты в AS3 являются экземплярами классов (и сами классы тоже могут рассматриваться как объекты). Для обращения к этим экземплярам используются ссылки. Ссылки хранятся в переменных, которые могут быть как зафиксированными свойствами экземпляров или классов, так и временными "локальными" переменными функций — к таким переменным нет доступа извне функции, и живут они только то время, пока выполняется функция. Ссылка на один и тот же объект может храниться в любом количестве переменных в самых разных "местах" программы. Например, все визуальные объекты имеют свойство .stage, хранящее ссылку на сцену (область отображения плеера). Сцена всегда одна, а ссылки на нее могут иметь тысячи объектов в своих собственных переменных. Из этого надо понять, почему объекты ничего не знают о ссылках на них, и нельзя спросить у объекта это вот "_button1". Потому что может быть он одновременно и "_button_А" и еще чёрти что. Мало того, переменная потому и "переменная", что в нее в любой момент может быть записана ссылка на другой объект, и тогда Ваша _button1 перестанет быть как-то вообще связанной с данной конкретной кнопкой.
Физически, ссылка — это адрес объекта в памяти, номер байта в памяти, с которого начинается описание объекта. У объектов больше нет никаких собственных уникальных имён, по которым можно было бы обратиться к ним из любого места программы.
Есть фиксированное свойство .name, которое является переменной строкового типа и может хранить какую-то строку. Но эта строка не уникальна, то есть Вы можете ВСЕ свои кнопки "назвать" одинаково, плееру до лампочки, что Вы туда записываете.
Да, еще запомните, что переменные могут хранить не только ссылки на объекты, но и значения так называемых "простых типов" — строки и числа, которые "как бы" сами по себе не являются объектами. То есть переменные типа :String и :Number (:int, :uint) не хранят ссылку, а просто число или строку.
С другой стороны, ссылки могут храниться не только в формально объявленных переменных (var), но и в ячейках массивов. Когда все ссылки на объект исчезают (хранящие их переменные обнуляются или начинают ссылаться на другой объект, или объект-"хозяин" переменных удаляется), то такой объект будет автоматически удален из памяти, чтобы не загромождать ее. Поскольку к нему больше нет доступа и он "никому не нужен".

nelco 14.09.2015 22:51

Wolsh, спасибо за такой большой ответ, я читаю книгу, сейчас читаю Колина Мука на 540 странице, потом буду читать Adobовское руководство, а потом ActionScript Cookbook... к сожалению, не всё, что в книге полностью понятно с первого раза, приходится постоянно перечитывать, и даже после этого остаются многие непонятные моменты, которые и планирую спрашивать тут, хорошо, что есть такой форум, где отвечают!
код писать начал, т.к. решил, что без практики многое из теории сразу забывается и намного эффективнее пытаться сразу применить знания на практике, чтобы запомнилось лучше.

что такое экземпляр, переменная, свойство я понимаю, а вот про ссылку и заголовок - вроде не было объяснения у Колина Мука...
ссылка - это, получается, как бы сама связь, которая указывает на объект в памяти? _button1 - это переменная-ссылка?
заголовок - это cвойство .label? (просто в адобовском руководстве оно переводится как МЕТКА)
про stage тоже не совсем понятно, если stage - только один и нет другого stage (у объектов своего), то пока не вижу смысла обращаться к stage через объект (_object.stage) все объекты же, получается, принадлежат одному stage? только находятся в разных DisplayObjectContaineraх... но с этим, думаю, разберусь по мере практики...

Добавлено через 2 минуты
Цитата:

Сообщение от Isfet (Сообщение 1186703)
как вы поймете что это за кнопка, если у вас все кнопки хранятся не в переменных, а, допустим, в массиве?

понял, да, для этого нужно

ZackMercury 15.09.2015 00:14

Isfet, разве?
Я думал, label нужен, чтобы на кнопке появлялся текст)))
И без него кнопка не кнопка.
Так что удобнее читать будет свитч именно по заголовку, ибо он отображает текст кнопки.
К тому же, да, когда кнопки в массиве это играет добрую роль.

P.S. Да, всё верно, в справке написано метка, и label переводится как метка, но правильней это называть "Заголовок кнопки", так принято.
И это грех эдобовцев, так как следовало дать имя свойству caption.

nelco 15.09.2015 05:33

Цитата:

Сообщение от ZackMercury (Сообщение 1186754)
P.S. Да, всё верно, в справке написано метка, и label переводится как метка, но правильней это называть "Заголовок кнопки", так принято.
И это грех эдобовцев, так как следовало дать имя свойству caption.

понял, спасибо, буду разбираться с функционалом...

caseyryan 15.09.2015 06:58

Цитата:

.S. Да, всё верно, в справке написано метка, и label переводится как метка, но правильней это называть "Заголовок кнопки", так принято.
И это грех эдобовцев, так как следовало дать имя свойству caption.
Это некоторая путаница, которая есть и в других языках. У Label должно быть свойство caption или text, а у кнопки Label.
Написать button.label = "blabla"; интуитивно понятнее, чем button.label.caption = "blabla";

Wolsh 15.09.2015 11:39

Цитата:

про stage тоже не совсем понятно, если stage - только один и нет другого stage (у объектов своего), то пока не вижу смысла обращаться к stage через объект (_object.stage) все объекты же, получается, принадлежат одному stage? только находятся в разных DisplayObjectContaineraх... но с этим, думаю, разберусь по мере практики...
Все верно. Стейдж — это окно флэш-плеера, если грубо. Оно одно. И все объекты отображаются в нем. Важно понять, что стейдж не является частью Вашей программы. Он, конечно, позволяет Вам сделать несколько настроек и согласен кое-что рассказать о себе через свойства, но не Вы его создаете и не Вы им управляете. Это пользователь с помощью оконного интерфейса может в любой момент изменить размер окна или просто закрыть плеер. Стейдж — это вся область отображения плеера, в котором показывается Ваше приложение. Приложение написано на ActionScript, стейдж — нет. И еще очень много классов — нет. Они только предоставляют интерфейс "в стиле" AS3, через который Вы можете их использовать в своем коде. Это относится ко всем дисплейным классам — TextField, Sprite, MovieClip и др. Все они "находятся" в плеере, и Вы никак не можете их "переписать", только дополнить ("расширить" – extends) при наследовании, создавая свои подклассы-наследники. Только они "умеют" отображаться. Создать свой собственный дисплейный класс "с нуля" невозможно в принципе — плеер просто не будет знать, как его отображать на экране. Stage — такой же дисплейный класс, но еще более закрытый, Вы не можете ни наследоваться от него, ни даже создать его экземпляр. Плеер сам создает единственный экземпляр при запуске, и сразу же создает и добавляет в него экземпляр документ-класса (мейн), то есть Ваше приложение. И стейдж, и мейн, являются контейнерами (DisplayObjectContainer – DOC), то есть такими дисплейными объектами, в которые можно добавлять другие дисплейные объекты (DisplayObject – DO). Не каждый DO является DOC. Например, в Shape и TextField нельзя добавить другие объекты.
У всех контейнеров есть так называемый СписокОтображения (Display List). Это не класс, это абстрактное понятие (физически реализованное чем-то вроде скрытого массива). Само понятие "добавить объект в контейнер" означает добавить объект в список отображения контейнера. Пока объект не добавлен ни в один список, он не будет отображаться на экране и [автоматически] взаимодействовать с другими объектами, которые отображаются. При добавлении одного контейнера в другой, его список включается в список старшего ("родителя" — parent). Если родитель сам никуда не добавлен, то и "ребенок" (child) тоже не будет отображаться. Чтобы объект появился на экране, он должен быть в списке отображения стейджа, то есть ВСЕ его старшие контейнеры должны в конечном итоге быть добавлены в мейн, который автоматически добавлен на стейдж. Представьте стейдж как пустое пространство, в котором находится огромный аквариум — мейн. В аквариуме могут лежать камни, и другие стеклянные банки, в которых камни или еще стеклянные баночки, в которых камни, и так [почти] до бесконечности. Если какую-то стеклянную банку вытащить, то будет изъято из аквариума и все ее содержимое. Оно больше не в аквариуме, не в списке отображения стейдж, хотя и остается в своей банке — в списке отображения своего контейнера. Просто контейнер больше не в списке отображения стейдж.

nelco 19.09.2015 07:53

спасибо за ответы! главное - понял, что stage - ОДИН! :) с displayList и DO in DOC разобрался, вот сижу с событиями теперь разбираюсь, опять непонятно за что цепляться слушателем в parent объектах при диспетчеризации события из ребёнка... буду спрашивать в новой теме

Добавлено через 17 минут
Цитата:

Сообщение от caseyryan (Сообщение 1186761)
Это некоторая путаница, которая есть и в других языках. У Label должно быть свойство caption или text, а у кнопки Label.
Написать button.label = "blabla"; интуитивно понятнее, чем button.label.caption = "blabla";

как задать это свойство label? у объектов TextField и Sprite не подсвечивается во FlashDevelope оно

ZackMercury 19.09.2015 10:02

о боже, я ш сказал, label - это надпись на кнопке...

nelco 19.09.2015 10:08

Цитата:

Сообщение от ZackMercury (Сообщение 1186969)
о боже, я ш сказал, label - это надпись на кнопке...

какая строка кода её создаёт, я про это? :\ или Вы имеете в виду что-то из самого Flash редактора? я просто из FlashDevelopa делаю без графического редактора... если ввожу в google "label actionscript" то выходит какой-то отдельный класс Label, а не свойство DisplayObjecta

ZackMercury 19.09.2015 10:10

Код AS3:

var button:fl.controls.Button = new fl.controls.Button();
addChild(button);
button.label = "Нажми меня";


nelco 19.09.2015 10:13

а, всё, понял, значит label есть только у объектов типа Button, значит для Spritов и TextFieldoв он не подходит, для них видимо используется свойство .name? буду пробовать, спасибо ещё раз за ответ!

ZackMercury 19.09.2015 10:17

нейм здесь вообще не при чём, ещё раз
http://cs624828.vk.me/v624828630/45376/icKUNeH3zsc.jpg
label - это текст, который пишется в кнопке, т.е. появляется посередине кнопки.
мы свитчим по нему только потому, что это удобно читать. это не "обозначение кнопки", а "то, что написано в кнопке".
Спрайты как правило свитчатся по ссылкам.

nelco 19.09.2015 10:34

Цитата:

Сообщение от ZackMercury (Сообщение 1186973)
Спрайты как правило свитчатся по ссылкам.

например у меня 2 слушателя:
Код AS3:

textField1.addEventListener(MouseEvent.CLICK, clickListener);
textField2.addEventListener(MouseEvent.CLICK, clickListener);


гдe textField1 и textField2 - объекты типа Textfield

Код AS3:

private function clickListener(e:MouseEvent){
 
if (e.target == textField1){
trace ("нажали на textField1");
}
if(e.target == textField2) {
trace ("нажали на textField2");
}
 
}

мой вопрос про instanceName в этой теме начинался с такой структуры...


ведь trace (e.target) выдавало мне instance6 (не равно textField1), хотя условие e.target==textField1 выполняется, поэтому я спрашивал какое свойство объекта вернёт textField1, но все сказали, что НЕТ СМЫСЛА ПОЛУЧАТЬ ЭТО ЗНАЧЕНИЕ т.к. это имя переменной и видимо нет такого свойства вообще... теперь Вы говорите СПРАЙТЫ КАК ПРАВИЛО СВИТЧАТСЯ ПО ССЫЛКАМ... что такое ссылка тогда не понимаю, это не имя переменной? :\\

ZackMercury 19.09.2015 10:38

Именно имя переменной.

Код AS3:

private function clickListener(e:MouseEvent){
 
switch(e.currentTarget)
{
  case textField1:
      trace("Tf1");
      break;
  case textField2:
      trace("Tf2");
      break;
  ...
}
 
}

Что такое переменная - это ссылка на некую область в памяти, которая имеет имя и тип(размер)
То, что вы трейсите экземпляры классов - это не выведет имя объекта, это выведет имя класса.
Что делает функция trace()?
У всего, шо она выводит она вызывает метод toString().

nelco 19.09.2015 10:57

а если у меня в массиве - спрайты, то их отличать по свойству .name?

ZackMercury 19.09.2015 11:02

Если у вас спрайты одного типа/интерфейса/экземпляры одного класса, то смысла в свитче вообще нет.
Напрямую вызывайте у него его методы/меняйте свойства через (e.currentTarget as Sprite)
А если в массиве совершенно разные объекты - то это неправильно.

udaaff 19.09.2015 11:13

Цитата:

что такое ссылка тогда не понимаю
Типы данных делятся на примитивные и сложные.
Цитата:

К примитивным типам данных относятся Boolean, int, Null, Number, String, uint и void. Классы ядра ActionScript также определяют следующие сложные типы данных: Object, Array, Date, Error, Function, RegExp, XML и XMLList. [link]
Примитивные типы передаются по значению.
Сложные типы передаются по ссылке.

В чем разница:
Код AS3:

// примитивный тип
var a:int = 2;
var b:int = a; // записали значение
a = 4;
trace(b); // 2
// имеем два значения, которые никак не связаны между собой

Код AS3:

// сложный тип
var a:Object = { x: 2 };
var b:Object = a; // "скопировали" ссылку.
a.x = 4;
trace(b.x); // 4
// имеем один объект, и два указателя (две ссылки) на этот объект.
// т.е. грубо говоря, если мы будем менять переменную a, то будет меняться и b,
// т.к. они представляют один и тот же объект.


caseyryan 19.09.2015 11:16

Цитата:

Если у вас спрайты одного типа/интерфейса/экземпляры одного класса, то смысла в свитче вообще нет.
Да его там вообще в принципе нет, даже если в массиве лежат объекты разных типов
Можно просто сделать так:
Код AS3:

if (e.target is Sprite) {
  var sprite:Sprite = e.target as Sprite;
  trace("вот этот негодяй спровоцировал всю заварушку:", sprite); // ;)
}

Ну или уж если сделать свичем, то можно сделать свич на тип данных
что-то типа:
Код AS3:

switch ((e.target as Object).constructor) {
    case Sprite:
    // что-то там
    break;
}

Но с if смотрится лучше
Цитата:

То, что вы трейсите экземпляры классов - это не выведет имя объекта, это выведет имя класса.
Если быть точнее, то это выведет ровно то, что указано в методе toString(), а там может быть все, что угодно

Wolsh 19.09.2015 11:42

Вот так один плохой совет приводит к жуткой неразберихе.
.label и .name совершенно разные по смыслу свойства. Лейбл это метка, отображаемая на контролах (элементах интерфейса — кнопках, радио-буттонах, чекбоксах и т.п.), предназначенная для пользователя, чтобы он знал, что за кнопка перед ним нарисована, что она будет делать. Совет использовать лейбл для опознания кнопки в коде — плохой, потому что во-первых лейбл может быть не задан вообще, во-вторых лейбл может быть не текстом а иконкой, в-третьих, надпись на разных кнопках может быть одинаковой ("ок" например), и в-четвертых текст лейбла может меняться во время исполнения программы, в зависимости от контекста или в разных режимах.
Свойство .name наследуется всеми объектами от суперкласса Object. Оно есть у ВСЕХ экземпляров всех классов. Но это просто переменная типа String (строка), которое опять же может быть не определено, может быть одинаковым и может меняться в процессе исполнения программы.
Не рекомендуется пользоваться для идентификации ни тем, ни другим. Лейбл — просто вообще не для этого. Нейм можно юзать под свою ответственность. Но идеально будет организовать все так, чтобы не приходилось полагаться на переменчивые свойства объектов. Это все-равно как различать спрайты по ширине.
Если у Вас "спрайты в массиве", то Вы должны понимать, зачем их туда запихнули. Массив предполагает упорядоченность, структуру, и предоставляет методы для работы именно с порядком. У всех элементов есть индексы, описывающие место элемента в структуре. Это не мешок картошки, а точная картотека ссылок. Единственная ситуация, когда требуется дополнительный напряг, это ситуация с определением индекса в массиве элемента, пославшего событие. То есть, ссылка на сам элемент у Вас есть (e.target), но его индекс Вы не знаете, а это нужно для обработки события по логике (допустим, в игре Пятнашки). Тогда лучший способ — завести у всех элементов дополнительные свойства. В случае пятнашек это .id, хранящее номер фишки (можно использовать .name) и два индекса — строка и колонка (вертикаль и горизонталь), которые будут меняться в процессе игры и хранить положение в массиве (то есть, имея ссылку на фишку, Вы сможете спросить у нее номер и положение в массиве/на поле).


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

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