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

zerAlex2 10.08.2012 17:53

Подключить объекты на один класс или снова проблема обращения
 
Можно ли кучу объектов расположенных на сцене подцепить на один класс?
Смысл таков:
-в Flash-е есть сцена с картой (у которой свой класс, подключенные через св-ва объекта)
-карта разделена на полсотни участков, у каждого своё имя (имена есть в массиве), но без подключенных классов
-внутри каждого из участков есть объекты и я к ним не могу достучаться, у них тоже нет своих классов
Во всяком случае, не хочет теперь:
Код AS3:

public class myMap extends MovieClip {
...
function addLesteners(myArray:Array):void{
 var someStr:String;
 var someStrB:String;
 for (var i:Number=0; i<myArray.length; i++)
 {
  someStr=myArray[i][3];//строчка типа: Uch001
  someStrB="w"+someStr.slice(3,20);//Переводится в: w001 - и каждый подобъект содержит клип с таким роликом w001, w002, w003
  this.getChildByName(someStr).visible=false;//Если оставить так, то работает
  this.getChildByName(someStr).getChildByName(someStrB).visible=false;//А так, не работает
  this.getChildByName(someStr).addEventListener(MouseEvent.ROLL_OVER, tochOnROLL_OVER_MO);//Работает
 }
}
 
}

Обязательно ли этим подобъектам назначать классы? И можно ли им назначить один и тот же класс (не програмно, а через Flash)? Даже, наверно, не на один класс, а одно, как бы это сказать... поведение, что-ли.

Даже это не работает:
Код AS3:

trace(this.getChildByName(someStr).numChildren);//1119: Обращение возможного неопределенного свойства numChildren через ссылку со статическим типом flash.display:DisplayObject .
 
trace(this.getChildByName(someStr));// <- [object MovieClip]

Почему одни дочерние клипы без классов видны, а другие нет? И почему numChildren не выдаёт просто 0?

Добавлено через 2 часа 3 минуты
Вообще не догоняю ситуацию.
В основном коде пишу:
Код AS3:

var MyMap:myNewMap=new myNewMap();
MyMap.x=1300;
MyMap.y=550;
stage.addChild(MyMap);
MyMap.initMyMap(ListArray);

а myNewMap.sa:
Код AS3:

trace(stage.MyMap);// <- 1119: Обращение возможного неопределенного свойства MyMap через ссылку со статическим типом flash.display:Stage .


ТАК! Заменил все имена типа w001, w002, w003 на одно: hilight. Но это не принципиально. Написал:
Код AS3:

MovieClip(this.getChildByName(someStr)).hilight.visible=false;

и всё получиось, но при это я искренне не понимаю, что произошло. Если не сложно, объясните, чего не случилось-то?

Wolsh 10.08.2012 20:14

Так а что непонятно то? Все же рассказано в сообщениях об ошибках?
getChildByName(someStr) возвращает тип DisplayObject.
У него нет свойства numChildren. Это свойство есть только у типа DisplayObjectContainer. Несмотря на то, что в конкретной ситуации у Вас это МувиКлип (который так же является и Контейнером), метод возвращает супертип DisplayObject, у которого нельзя спросить свойство numChildren. Делайте кастинг:
Код AS3:

trace((this.getChildByName(someStr) as DisplayObjectContainer).numChildren);

Цитата:

trace(stage.MyMap);
Stage не динамический класс и у него нет свойства MyMap, откуда Вы это взяли? Если Вы расположили там экземпляр с именем MyMap, то воспользуйтесь getChildByName, наверное...

zerAlex2 10.08.2012 21:38

Так откуда там взялся DisplayObjectContainer? Я ж везде указывал MovieClip?
Код AS3:

public class MyMap extends MovieClip { ...


-De- 10.08.2012 21:46

Код AS3:

public function getChildByName(name:String):DisplayObject

Но getChildByName даже у вас таки DisplayObject возвращает.

Wolsh 10.08.2012 21:50

MovieClip является наследником DisplayObjectContainer точно так же, как Ваш MyMap является МувиКлипом (extends MovieClip).
DisplayObjectContainer в свою очередь является наследником DisplayObject. Расширяет его функционал, позволяя добавлять "в себя" другие DisplayObject, именуемые children. Поэтому у него есть свойство "количество детей" — numChildren, а у его суперкласса DisplayObject не может быть детей и соответственно этого свойства тоже нет.
Почитайте книжки или хелп. Пересказывать такие базовые вещи в рамках форума долго и не эффективно.

zerAlex2 10.08.2012 21:51

Код AS3:

public function getChildByName(name:String):DisplayObject

И после такого обязательно нужно ставить as MovieClip. Ага... я думал, оно ссылку на клип возвращает.
А as MovieClip или MovieClip(...), выходит, расширяет функционал объекта.
Да,в башке уложить кто и в каком виде что возвращает, не так-то просто. Особенно, если делаешь работку раз в год для своих, местечковую.

Wolsh 10.08.2012 22:26

Цитата:

А as MovieClip или MovieClip(...), выходит, расширяет функционал объекта.
Нет, не расширяет. Всего-лишь проверяет, подходит ли объект на роль (англ. casting — "кастинг", оператор as), то есть содержится ли эталонный тип в его цепочке наследования.
Цепочка наследования всегда представлена в описании класса в Хелпе
(например MovieClip › Sprite › DisplayObjectContainer › InteractiveObject › DisplayObject › EventDispatcher › Object).
Цитата:

я думал, оно ссылку на клип возвращает.
Вам надо разобраться, что такое переменная, что такое Тип данных, что такое Наследование.
Да, оно возвращает ссылку на клип. Куда же еще. Просто гарантирует, что Тип данных при этом — DisplayObject. Потому что "детьми" не могут быть объекты, не имеющие в своей цепочке наследования DisplayObject. Могут быть детьми объекты классов-наследников. Но метод не может возвращать какой-то из их типов, это слишком конкретно. Если он будет возвращать Спрайт например, то как быть с ТекстФилдами? Вас ведь не смущает, что метод addChild() принимает только DisplayObject, а Вы ни разу в жизни не создавали никаких DisplayObject-ов, и не задумываясь передаете в addChild() спрайты, мувиКлипы и текстфилды, и даже шейпы.

zerAlex2 10.08.2012 23:53

Это уж точно, надо разобраться.


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

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