Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.02.2012, 19:39
Johny_86 вне форума Посмотреть профиль Отправить личное сообщение для Johny_86 Найти все сообщения от Johny_86
  № 11  
Ответить с цитированием
Johny_86

Регистрация: Feb 2011
Сообщений: 11
Код AS3:
var a:MovieClip = new MovieClip();
	a.height = 100;
 
	var b:MyClass = new MyClass();
	b.height = 999;
 
	a = b;
	trace(a.height)
выведет 999!

Старый 21.02.2012, 20:40
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 12  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Вы, видимо, хотите руками перестроить цепочку прототипов, как в яваскпипте. Увы, в AS3 такое не катит. Используйте паттерн Decorator.
__________________
тонкий тролль, осеянный благодатью

Старый 21.02.2012, 21:12
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 13  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
Цитата:
Всё дело в том, что у меня есть "фабрика", которая создаёт объекты (которые по-умолчанию, естественно, extends MovieClip, не могу же я в фабрике приказать объектам extends myClass). Вот к этим объектам потом вручную нужно "допилить" свойства, собственноручно написанные в классе myClass.
Что-то слишком на кашу похоже. Почему "естественно, extends MovieClip, не могу же я в фабрике приказать объектам extends myClass" ?

Может, вы подробней распишите задачу?
Обычно за наращивание функционала отвечает Декоратор (как уже было замечено выше) или фасад.
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с)

Старый 21.02.2012, 23:43
Halfist вне форума Посмотреть профиль Отправить личное сообщение для Halfist Найти все сообщения от Halfist
  № 14  
Ответить с цитированием
Halfist

Регистрация: Feb 2012
Сообщений: 63
Есть, значит, у меня в библиотеке >200 фрагментов ролика, каждый из которых экспортирован для ActionScript. Класс, обрабатывающий каждый из них, я не редактировал, поскольку тогда пришлось бы создавать >200 *.as файлов. Через JSON в виде строки приходит имя класса, экземпляр которого нужно создать.

Есть следующий класс-абстракция, который наследует MovieClip:
Код AS3:
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();
		}
	}
}
А также более конкретный класс, который наследует item:
Код AS3:
package classes
{
	public class bodyClass extends item
	{
		public var f2:String;
		public var f3:String;
		public var f4:String;
	}
}
В коде внутри *.fla файла происходит следующее:
Код AS3:
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++;
	}
}
Мне нужно, чтобы у bodies[myData.bodies[key].className][bodyNum].classInner (объект, который является свойством класса item) были все свойства MovieClip, item и bodyClass. На самом же деле, у него есть только свойства и методы MovieClip, поскольку "В библиотеке >200 фрагментов ролика, каждый из которых экспортирован для ActionScript. Класс, обрабатывающий каждый из них, я не редактировал, а он extends MovieClip".

Старый 22.02.2012, 00:19
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 15  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Слишком хитро, сами себя обманете. Зачем такое было городить вообще?

Можно выделить эти >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.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 22.02.2012, 00:25
Halfist вне форума Посмотреть профиль Отправить личное сообщение для Halfist Найти все сообщения от Halfist
  № 16  
Ответить с цитированием
Halfist

Регистрация: Feb 2012
Сообщений: 63
Цитата:
Сообщение от -De- Посмотреть сообщение
Можно выделить эти >200 фрагментов в библиотеке и поставить им базовым классом bodyClass, по-моему один и тот же куче клипов там можно поставить (тогда таки будут все св-ва).
Нельзя, поскольку из JSON может прийти одно из >200 имён классов, экземпляр которого нужно создать (каждый внешне выглядит по-разному).

Старый 22.02.2012, 00:28
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 17  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
-De-, снимаю шляпу, у меня на всей этой перелинковке мозг сломался
__________________
тонкий тролль, осеянный благодатью

Старый 22.02.2012, 00:36
Halfist вне форума Посмотреть профиль Отправить личное сообщение для Halfist Найти все сообщения от Halfist
  № 18  
Ответить с цитированием
Halfist

Регистрация: Feb 2012
Сообщений: 63
Массив нужен для того, чтобы "всунуть" туда несколько объектов, т.к. из JSON приходит не одна запись, а также знать, к какому конкретно объекту в данный момент идёт обращение. Они разные, поскольку на каждой итерации цикла bodyNum++.

Старый 22.02.2012, 00:38
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 19  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
У меня давно сдох CS4, потому плохо помню и проверить не могу, может и нельзя )
Но символу можно поставить класс (который один из >200 имён и я так понял они все тупо мувиклипы). И можно поставить базовый класс. Который у всех этих > 200 имён будет один bodyClass.

PS: у вас не будет в массиве bodies[myData.bodies[key].className] более одного элемента т.к. он каждый раз создаст новый массив на месте предыдущего. Наверное это баг и
вместо
Код AS3:
bodies[myData.bodies[key].className] = [];
надо
Код AS3:
if(null == bodies[myData.bodies[key].className])
	bodies[myData.bodies[key].className] = [];
И может там стоит в этот массив тупо push делать, а не тянуть bodyNum?
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.


Последний раз редактировалось -De-; 22.02.2012 в 00:42.
Старый 22.02.2012, 00:44
Halfist вне форума Посмотреть профиль Отправить личное сообщение для Halfist Найти все сообщения от Halfist
  № 20  
Ответить с цитированием
Halfist

Регистрация: Feb 2012
Сообщений: 63
Класс для каждого фрагмента ролика указан (их >200).
А вот базовый класс нельзя изменить, поскольку "Указанный базовый класс является собственным классом и будет определён в проигрывателе во время выполнения. Он не может быть изменён.". Его значение, конечно же, flash.display.MovieClip.

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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