![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 11
|
выведет 999!
|
|
|||||
|
strange mood
|
Вы, видимо, хотите руками перестроить цепочку прототипов, как в яваскпипте. Увы, в AS3 такое не катит. Используйте паттерн Decorator.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: May 2010
Сообщений: 543
|
Цитата:
Может, вы подробней распишите задачу? Обычно за наращивание функционала отвечает Декоратор (как уже было замечено выше) или фасад.
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с) |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 63
|
Есть, значит, у меня в библиотеке >200 фрагментов ролика, каждый из которых экспортирован для ActionScript. Класс, обрабатывающий каждый из них, я не редактировал, поскольку тогда пришлось бы создавать >200 *.as файлов. Через JSON в виде строки приходит имя класса, экземпляр которого нужно создать.
Есть следующий класс-абстракция, который наследует MovieClip: package classes { import flash.display.MovieClip; import flash.display.DisplayObject; import flash.utils.getDefinitionByName; public class item extends MovieClip { public var classInner:DisplayObject; public var f1:String; /* фабрика */ public function factory(strClassName:String):void { var className:Class = getDefinitionByName(strClassName) as Class; this.classInner = new className(); } } } package classes { public class bodyClass extends item { public var f2:String; public var f3:String; public var f4:String; } } var bodyLayer:Sprite = new Sprite(); addChild(bodyLayer); var myRequest:URLRequest = new URLRequest("..."); var myLoader = new URLLoader(); myLoader.addEventListener(Event.COMPLETE, onload); myLoader.load(myRequest); var bodyNum:int = 0; function onload(evt:Event):void { var myData:Object = JSON.decode(myLoader.data); var key:Object; for (key in myData.bodies) { var body = new bodyClass(); body.factory(myData.bodies[key].className); var bodies:Array = []; bodies[myData.bodies[key].className] = []; bodies[myData.bodies[key].className][bodyNum] = body; bodies[myData.bodies[key].className][bodyNum].classInner.f1 = "str1"; bodies[myData.bodies[key].className][bodyNum].classInner.f2 = "str2"; bodies[myData.bodies[key].className][bodyNum].classInner.f3 = "str3"; bodies[myData.bodies[key].className][bodyNum].classInner.f4 = "str4"; bodies[myData.bodies[key].className][bodyNum].classInner.height = 100; bodies[myData.bodies[key].className][bodyNum].classInner.width = 100; bodies[myData.bodies[key].className][bodyNum].classInner.addEventListener(MouseEvent.MOUSE_OVER,bodyOnMouseOver); bodyLayer.addChildAt(bodies[myData.bodies[key].className][bodyNum].classInner, 0); bodyNum++; } } |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Слишком хитро, сами себя обманете. Зачем такое было городить вообще?
Можно выделить эти >200 фрагментов в библиотеке и поставить им базовым классом bodyClass, по-моему один и тот же куче клипов там можно поставить (тогда таки будут все св-ва). У вас будет дублирование - bodies[myData.bodies[key].className][bodyNum] имеет поля f1, f2, f3, f4 и сам он является зачем-то мувиком и вы хотите, чтоб bodies[myData.bodies[key].className][bodyNum].classInner тоже имел эти поля (и bodies[myData.bodies[key].className][bodyNum].classInner.classInner). Что-то надо убрать. По-моему лучше всего, чтоб item не расширял MovieClip и чтоб не надо было classInner быть наследником bodyClass =) Данные брать из bodies[myData.bodies[key].className][bodyNum] (который bodyClass). Или bodies[myData.bodies[key].className][bodyNum] - должен быть классом, которому таки поставлен bodyClass базовым классом, который создаст поправленная (чтоб она такое могла делать) фабрика. И массив bodies - используется не стандартно и запутывает тем, что он массив, он у вас как Object используется. Ещё загадочен массив bodies[myData.bodies[key].className] - в нём всегда один элемент будет? PS: внутри .fla кода не должно быть, особенно если он по сложности как тот, что выше, используйте document class.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 63
|
Нельзя, поскольку из JSON может прийти одно из >200 имён классов, экземпляр которого нужно создать (каждый внешне выглядит по-разному).
|
|
|||||
|
Регистрация: Feb 2012
Сообщений: 63
|
Массив нужен для того, чтобы "всунуть" туда несколько объектов, т.к. из JSON приходит не одна запись, а также знать, к какому конкретно объекту в данный момент идёт обращение. Они разные, поскольку на каждой итерации цикла bodyNum++.
|
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
У меня давно сдох CS4, потому плохо помню и проверить не могу, может и нельзя )
Но символу можно поставить класс (который один из >200 имён и я так понял они все тупо мувиклипы). И можно поставить базовый класс. Который у всех этих > 200 имён будет один bodyClass. PS: у вас не будет в массиве bodies[myData.bodies[key].className] более одного элемента т.к. он каждый раз создаст новый массив на месте предыдущего. Наверное это баг и вместо надо И может там стоит в этот массив тупо push делать, а не тянуть bodyNum?
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 22.02.2012 в 00:42. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 63
|
Класс для каждого фрагмента ролика указан (их >200).
А вот базовый класс нельзя изменить, поскольку "Указанный базовый класс является собственным классом и будет определён в проигрывателе во время выполнения. Он не может быть изменён.". Его значение, конечно же, flash.display.MovieClip. |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:03. |
|
|
« Предыдущая тема | Следующая тема » |
|
|