#actionscript-3 #downcast #type-coercion
#actionscript-3 #понижение #тип-принуждение
Вопрос:
Я внедрил новый класс, который расширяет MovieClip. Это имя base.MovieClipWithDelays
(«базовое» здесь — имя пакета).
Моя сцена содержит такой объект с именем Blah
. В Symbol Properties
я Export for ActionScript
Export in first frame
установил и флажки. Я установил имя класса как T_Idle_0
. И я указал его базовый класс как base.MovieClipWithDelays
.
Проблема в том, что следующий код приводит к ошибке типа:
var dob:DisplayObject = getChild("Blah");
trace("SuperClass = " getQualifiedSuperclassName(dob));
return MovieClipWithDelays(dob);
он выводит:
SuperClass = base::MovieClipWithDelays
TypeError: Error #1034: Type Coercion failed: cannot convert T_Idle_0@1ec59e9 to base.MovieClipWithDelays.
Как вы можете видеть, имя суперкласса в порядке. Тем не менее, она не может ее понизить. Как это возможно и как мне ее обойти?
Комментарии:
1. Обновление: если я добавлю трассировку строки отладки («Is = » (dob является базовым. MovieClipWithDelays)); он говорит «Is = false»….
2. вы используете один SWF-файл или используете несколько SWF-файлов?
3. Что
getQualifiedClassName
возвращает?4. > вы используете один SWF-файл или используете несколько SWF-файлов? Я использую несколько SWF-файлов. Когда я использую один SWF, он отлично работает. Но когда упомянутая сцена загружается из другого SWF, она не может быть понижена.
Ответ №1:
Вы не можете установить базовый класс библиотеки MovieClip в пользовательский класс. Вы можете установить для него значение Sprite или MovieClip. Чтобы сделать то, что вы хотите сделать, у вас есть два решения:
1. Управляйте всем (рисованием и т. Д.) Из вашего класса MovieClipWithDelays. т. Е. Не заставляйте его зависеть от объекта библиотеки.
Или:
2 . Сделайте так, чтобы ваш MovieClipWithDelays обертывал экземпляр MovieClip.
var libraryMC:MovieClip = new SomeLibraryMovieClip();
var customMc:MovieClipWithDelays = new MovieClipWithDelays(libraryMC);
Затем внутри MovieClipWithDelays
вам понадобятся некоторые функции и свойства для обработки обернутого видеоролика.
Комментарии:
1. Боюсь, что этот ответ неверен; вы можете установить пользовательский класс в качестве базового класса (я делал это успешно много раз). Пользовательский класс все равно должен наследоваться от Sprite или MovieClip.
2. У меня это никогда не получалось, поэтому я всегда предполагал, что это должен быть встроенный класс ActionScript.
3. Я не настолько опытен, но, как я прочитал в книге Колина Мука «Essential ActionScript 3.0», нормально иметь пользовательский базовый класс. Я думаю, что проблема имеет другое происхождение. Когда я использую один SWF, он отлично работает. Но когда сцена (которая содержит этот объект «Blah») загружается из другого SWF, она не может быть понижена.