Ozon.ru
Flash-MX.ru: Форум о Flash - Not logged in
Forum На главную Help Search Login
Previous Next Up Topic Flash CS3, Flash 8, Flash-MX 2004, Flex / Обмен опытом / Еженедельник "Весёлая Грабля": СТОП! (7094 hits)
- By DeliMIter   модератор Date 06-11-06 09:33
Простой stop(), написанный в конструкторе класса снёс всю иерархическую ветку: слетели ссылки, исчезли методы из экземпляров. Вот, думаю, к чему бы?
Убивать не удовольствия ради - но для еды!
Parent - By Nox Noctis (hero) Date 06-11-06 10:32
имя метода неквалифицированное? (просто "stop()")
от чего наследует этот класс? (дитя мувиклипа, наверное?)

подозреваю, что дело в том, что даже в АС2 классах stop() компилятором превращается в однобайтовую команду а не в вызов метода класса. если только специально не написать this.stop();

но точнее трудно представить, можешь выложить пример такого поведения?
любопытно :)
http://vtulka.mybrute.com
Parent - By DeliMIter   модератор Date 06-11-06 10:52 Edited 06-11-06 10:56
Сам пример я выкладывать не буду (он в проекте), но я накатал микроиллюстрацию. Итак, у нас есть класс
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
 class StopClass extends MovieClip
 {
   function StopClass()
   {
     super();
     stop();
   }
 }

Есть мувиклип этого класса, который аттачится на сцену:
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
 import StopClass;
 
 SI = StopClass(attachMovie("StopClass", "StopInstance", 0));
 
 trace(SI);

Запускаем (выводится undefined), смотрим переменные. Переменной SI нету, зато есть строчка

МинимизироватьПо высоте текста
Variable _level0.[type Function] = null

Очень смешно.

Комментарим //stop(); в классе (вариант: меняем на this.stop(); - результаты совпадают), запускаем (выводится _level0.StopInstance), смотрим переменные. Собственно, что мы и хотели

МинимизироватьПо высоте текста
Variable _level0.SI = [movieclip:_level0.StopInstance]

В связи с чем вопрос. ЧТО это было?
Убивать не удовольствия ради - но для еды!
Parent By silin (**) Date 06-11-06 11:32
ага, наступали, причем не только в наследнике MovieClip
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
   8
   9
 class Some {
   function Some(){
     stop();//не работает
     this.stop();//работает
   }
   function stop(){
     trace("stop");
   }
 }

и не только stop (play тоже), может и еще что: разбираться не стал, в этих-то случаях дешевле не пользовать такие имена..
Parent - By DeliMIter   модератор Date 07-11-06 00:03
Теперь я знаю, откуда у проблемы растут ноги.

С одной стороны, Нокс ошибся и stop() не компилруется в однобайтовую команду. Компилируется он в б.м. нормальный this.stop(), за одним исключением: не создаётся финальный POP. Очевидно, дело тут как раз в том, что нормальный stop() в таймлайне это действительно однобайтовая команда, для которой никаких POP'ов не предусмотрено. В результате, в стеке остаётся лишний элемент, который и приводит ко всем необратимым последствиям.

В целях контрольного эксперимента я добавил недостающий POP, вкомпилил его в класс, и, да здравствует великий и могучий. Всё заработало.
Убивать не удовольствия ради - но для еды!
Parent By Nox Noctis (hero) Date 09-11-06 17:47 Edited 09-11-06 17:50

> С одной стороны, Нокс ошибся и stop() не компилруется в однобайтовую команду.


компилируется, если при тестах накосячить. :)
например, забыть про extends MovieClip. :)
МинимизироватьПо высоте текста
   1
   2
   3
   4
   5
   6
   7
 class Test
 {
   function Test () 
   {
     stop();
   }
 }
цепляем этот класс на клип, и...
компилятор совершенно не беспокоит отсутствие в моем классе функции stop(), и этот вызов превращается в один байт байткода.

и еще я сталкивался вот с таким:
МинимизироватьПо высоте текста
**Error** blablabla.as: Line 286: Wrong number of parameters; stop requires exactly 0.
         stop(propertyNameOrList);

Total ActionScript Errors: 1    Reported Errors: 1

этот стоп() был написан в классе, НЕ наследующем от мувиклипа.
поэтому, я и подумал, что в твоем случае компилятор захотел сделать из такого стопа однобайтовую команду. :)

хорошо, что ты копнул глубже, это чистый баг компилятора и ничто другое:
МинимизироватьПо высоте текста

// конструктор:
function2 () (r:1='this', r:2='super')
    // .....
    push 0.0, r:this, 'stop'
    callMethod
end // of function

"Но как же они будут играть на проклятом нами рояле?" ©
http://vtulka.mybrute.com
Parent - By Nox Noctis (hero) Date 09-11-06 18:56
о, кстати.
класс-то из-за забытого в стеке значения не умирает.
если ты попробуешь обращаться к объекты по ссылке на мувиклип - всё заработает...
непредсказуемо, разумеется. :)

и у меня в листе переменных ничего не падает из-за этой аномалии.
хм.
http://vtulka.mybrute.com
Parent - By DeliMIter   модератор Date 10-11-06 03:23 Edited 10-11-06 05:21
По ссылке на мувиклип - мэбэ. Но я-то его типизирую.

Upd: Обращение к мувиклипу по его имени не есть обращение к нему по ссылке. Я сейчас убрал из кода типизацию приаттаченного клипа, так вот, переменной-ссылки ВООБЩЕ не оказалось в списке переменных. Зато образовалась переменная с именем мувиклипа и ссылкой на мувиклип:
МинимизироватьПо высоте текста
Variable _level0.StopInstance = [movieclip:_level0.StopInstance]
Movie Clip: Target="_level0.StopInstance"
Убивать не удовольствия ради - но для еды!
Parent By Nox Noctis (hero) Date 10-11-06 10:55
конструктор класса - это функция, возвращающая ссылку на новый экземпляр.
а в стеке  после вызова стопа остается undefined, который вернул this.stop() и который не был выкинут из стека.
бьётся именно ссылка, и типизировать её бесполезно, потому undefined и в африке...

хотя не совсем понятно, в какой именно момент ссылка на новый экземпляр помещается в стек.
видимо, в самом начале конструктора...

забавно вот это выглядит:
МинимизироватьПо высоте текста
   1
   2
 trace(t = attachMovie("StopClass", "sc", 0)); // _level0.sc
 trace(t); // undefined


но в целом можно достичь еще более изощренных глюков.
каков поп таков и пуш,
каков пуш, таков и приход.
http://vtulka.mybrute.com
Parent - By DeliMIter   модератор Date 10-11-06 10:14
Ипать Балин. Второй раз встаю на эти грабли, теперь с гоутуЭндСтопом. Да что же это такое? И правда, что ли, старею...
Убивать не удовольствия ради - но для еды!
Parent - By Nox Noctis (hero) Date 10-11-06 10:56
удивляюсь, как я никогда с этим не сталкивался... :)
на грабли со стопом в классах, НЕ наследующих от мувиклипа я наступал, хотя это менее логично. :)
http://vtulka.mybrute.com
Parent - By DeliMIter   модератор Date 10-11-06 11:24
Я обычно не совмещаю код и многокадрие. А тут, понимаешь, поскупился на лишний клип. Скупой платит сам знаешь сколько.
Убивать не удовольствия ради - но для еды!
Parent By Nox Noctis (hero) Date 10-11-06 11:28
я в последнее время почти всё композицией делаю.
не всегда удобно, конечно, но зато такой барьер между мухами и котлетами...
http://vtulka.mybrute.com
Previous Next Up Topic Flash CS3, Flash 8, Flash-MX 2004, Flex / Обмен опытом / Еженедельник "Весёлая Грабля": СТОП! (7094 hits)
 

с 19.04.2006

Page created in 0.074s with 16 database queries.