Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибки Мука. Не работает stop(). (http://www.flasher.ru/forum/showthread.php?t=202309)

Fogflasher 09.07.2013 15:20

belv, Это да.
Еще как вариант можно у таймера задать количество повторений нужное.

Итак, на всякий случай проговорим вслух, что произошло.

Код
Код AS3:

 getChildAt(i).stop()

означает:

"Берем экземпляр класса Star_demo, который фактически является экземпляром MovieClip и вызываем на нем метод getChildAt(i)... Мы можем это сделать, потому что MovieClip наследует свойства DisplayObject, а значит и метод getChildAt(). В резуьтате получаем объект типа DisplayObject, в котором вызываем метод stop()... И не можем этого сделать, потому что у него нет такого метода. Тогда этот объект мы превращаем снова в MovieClip, у которого метод Stop() существует."

Если всё так, то остаются два подозрения:
- Есть ли какие-то потери при таком приведении типов? Это же похоже на неестественный трюк, какой-то костыль чтоли?
Или вниз по дереву наследования это вполне нормально?
- Почему getChildAt() возвращает объект типа DisplayObject, а не MovieClip...

Mareg, наследие AS2, понятно.

belv 09.07.2013 15:38

getChildAt(i) возвращает объект типа Star а вы его приводите к типу данных MovieClip , на самом деле объект Star имеет 2 типа данных Star и MovieClip , так как он расширяет класс MovieClip.
А присваиваем переменной var mc = getChildAt(i); для того чтобы вызвать метод экземпляра dispose().

Fogflasher 09.07.2013 17:21

Цитата:

getChildAt(i) возвращает объект типа Star
А почему, кстати? Ведь согласно справочнику функция getChildAt имеет тип возвращаемого значения равный DisplayObject. Или в справочнике указываются абстрактные, какие-то универсальные типы. Не совпадающие с конкретикой.

KumoKairo 09.07.2013 17:45

Все правильно написано, getChildAt возвращает DisplayObject, у которого нет метода stop()
На
Код AS3:

 getChildAt(i).stop()

компилятор вообще то ругается, поскольку у DisplayObject нет такого метода (полиморфизм окда), а сама флешка совершенно без понятия, у какого подкласса класса DisplayObject есть этот метод, поэтому никакого приведения к MovieClip, а тем более к Star не происходит.
Поэтому единственным способом будет указанный товарищем Bletraut, безопасно привести наш DisplayObject к MovieClip и вызвать метод stop уже у приведенного объекта.

Тогда ошибка может возникнуть только при выполнении кода, если наш полученный DisplayObject нельзя привести к MovieClip, а следовательно и нельзя вызывать метод stop()

NoisyFlasher 09.07.2013 18:45

Цитата:

Вот так у меня останавливает анимацию
Код AS3:

var mc = getChildAt(i);
mc.dispose();


Поясните, пожалуйста, не очень понял.
Во-первых, у DisplayObject ведь нет dispose(), ведь так?..
Во-вторых, останавливать анимацию удалением информации из памяти - не слишком ли лихо?) Или я что-то не так понял?

Добавлено через 5 минут
Fogflasher
Цитата:

- Есть ли какие-то потери при таком приведении типов? Это же похоже на неестественный трюк, какой-то костыль чтоли?
Или вниз по дереву наследования это вполне нормально?
Ничего неестественного в нем нет, насколько я понимаю. Это то, что называется полиморфизмом - т.е. определенный инструмент. В одних случаях он может быть весьма полезен, в других от него лучше держаться подальше.

Цитата:

- Почему getChildAt() возвращает объект типа DisplayObject, а не MovieClip...
Потому что аргументом для addChild() может быть все, что угодно, начиная от DisplayObject. Поэтому при возврате детей выдается наиболее "высокий" в лестнице наследования класс.

belv 09.07.2013 19:17

Во-первых, у DisplayObject ведь нет dispose(), ведь так?..
Во-вторых, останавливать анимацию удалением информации из памяти - не слишком ли лихо?) Или я что-то не так понял?
Отвечаю:
var mc = getChildAt(i); где getChildAt(i) -это объект Star
через переменную mc ссылающуюся на этот объект вызываем метод dispose() , который описан в классе Star, который останавливает таймер и соответственно анимацию.
Чтобы увидеть это наглядно , что вызывается именно этот метод вызывается, переименуйте его например в disposeAnimateInStar
а потом вызовите его mc.disposeAnimateInStar();
По поводу типов , в цикл добавьте код
Код AS3:

trace(getChildAt(i) is DisplayObject); // для проверки нужно импортировать в класс import.display.DisplayObject
trace(getChildAt(i) is Star);
trace(getChildAt(i) is MovieClip);

Все трэйсе возвращают true - это дает понять , что все объекты getChildAt(i) имеют типы данных
DisplayObject
MovieClip
Star
Потому-что происходит наследование.

NoisyFlasher 09.07.2013 20:30

А, блин.
Прошу пардону, мой косяк - я в код Star'a не поглядел и теперь сидел и думал, откуда у DisplayObjecta dispose))


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

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