Просмотр полной версии : Ошибка с расширением класса.
var mn:MovieClip = this;
var tree:Number = setInterval(create, 1000);
//
function create():Void {
var mc:mcExtended = mn.attachMovie('anc', 'anc', mn.getNextHighestDepth());
clearInterval(tree);
}
Этот код выдает такую ошибку:
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 5: Type mismatch in assignment statement: found MovieClip where mcExtended is required.
var mc:mcExtended = mn.attachMovie('anc', 'anc', mn.getNextHighestDepth());
Total ActionScript Errors: 1 Reported Errors: 1
Файл с расширением класса лежит в папке classes. Classes лежит в той же папке что и что и fla с ошибкой. В настройках публикации fla указан путь к классу: classes
Код as файла расширения класса:
/**
класс mcExtended
*/
class mcExtended extends MovieClip {
public var mcNumber:Number;
}
Мувиклип в библиотеке создан стандартным способом, класс as2 не подписан.
Но, вот такой код работает нормально. Ошибок не выдает.
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
Подскажите, где ошибка?
Вот такой код тоже работает:
var mn:MovieClip = this;
var tree:Number = setInterval(this, 'create', 1000);
//
function create():Void {
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
}
Чувствую все дело в:
var mn:MovieClip = this;
this.createEmptyMovieClip("mn",this);
var tree:Number = setInterval(this, 'create', 1000);
//
function create():Void {
var mc:mcExtended = mn.attachMovie('anc', 'anc', this.getNextHighestDepth());
mc._x+=Math.random()*10;
}
Ventur
А можите объяснить в чем ошибка моя? Мне хочется понять теоретически. Прочувствовать, так сказать. :)
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
проходит потому что this undefined в этом контексте, присваивай кому хошь..
var mc:mcExtended = mn.attachMovie('anc', 'anc', mn.getNextHighestDepth());
попытка присвоить MovieClip переменной с типом mcExtended
чтоб не ругался:
var mc:mcExtended = mcExtended(mn.attachMovie('anc', 'anc', mn.getNextHighestDepth()));
но anc тогда должен быть залинкован в библиотеке на mcExtended.as, иначе это бред выходит..
зы: классы с прописной именовать принято..
>но anc тогда должен быть залинкован в библиотеке на mcExtended.as
Совершенно да
проходит потому что this undefined в этом контексте, присваивай кому хошь..
А это как объяснить тогда?
var tree:Number = setInterval(this, 'create', 1000);
//
function create():Void {
trace(typeof(this)) //movieclip
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
}
И это:
var mn:MovieClip=this
var tree:Number = setInterval(this, 'create', 1000);
//
function create():Void {
trace(typeof(mn)) //movieclip
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
}
setInterval(this, 'create', 1000) и setInterval(create, 1000) разные вещи: у первой create есть this (первый параметр setInterval) у второй нет..
в примере Ventur компилятор не ругается, потому как он не знает тип this, то что выдает trace это уже рантайм, (да и в твоем примере с this наверное тоже, а не потому что undefined)
зы: вся эта типизация в AS2 весьма условная штука - только на уровне отслеживания ошибок компилятором, естестественно только там где он может это сделать..
silin
Честно говоря, не понимаю. Вы скажите mn и this в моем примере это одно и тоже или нет. Если нет, то чем отличаются друг от друга. Сейчас я думаю, что mn и this это одно и то же - объект типа MovieClip указывающий на основную временную диаграмму. :umnik2:
в примере Ventur компилятор не ругается, потому как он не знает тип this, то что выдает trace это уже рантайм, (да и в твоем примере с this наверное тоже, а не потому что undefined)
Вы хотите сказать, что в строке:
var mn:MovieClip=this
компилятор отслеживает тип this, а в строке:
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
просто считает, что у this нет типа(не задан)? Как же быть? Как мне корректно сделать этот код?
в твоем примере mn типизованная переменная, компилятор знает ее тип, потому и ругается
в функции
function create():Void {
this.attachMovie('anc', 'anc', mn.getNextHighestDepth());
}
на что указывает this выяснится в рантайме (эту create можно ведь приложить к любому объекту или к разным..), компилятор не может знать тип this в create поэтому на всякий случай за ошибку не считает..
var mc:mcExtended = this.attachMovie('anc', 'anc', this.getNextHighestDepth());
просто считает, что у this нет типа(не задан)? Как же быть? Как мне корректно сделать этот код?
Надо сделать приведение типа
var mc:mcExtended = mcExtended (this.attachMovie('anc', 'anc', this.getNextHighestDepth()));
Ясно. Постепенно понимаю. :)
pkfun, дело в setInterval. Функция вызывается в контексте null. Если использовать другой синтаксис, а именно setInterval(scope,'methodName',1000);, то всё будет ок.
Всем спасибо за очень ценную информацию.
ps. Надо Мука почаще мне читать. Плохо теорию знаю. :quiet:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.