![]() |
MovieClip: проиграть нужное число раз
Есть мувиклип Tw1, содержащий моушн-твин.
К нему привязан класс Tw1, через галочку Export to ActionScript. Необходимо вывести его на стэйдж и проиграть определенное количество раз, а затем остановить. На первый взгляд вроде бы простая задача, но очевидного решения придумать не удалось. Поиском по форуму нашел вот этот пост, в котором есть похожие мотивы. В результате получился такой код: Код AS3:
1. Есть ли другой способ решить эту задачу? Странно, но похоже на то, что нет. Ведь обязательно нужно знать момент окончания мувиклипа, а это достигается только условием Код AS3:
Выходит, никакими там комбинациями методов stop(); gotoAndStop(); play(); и т.п. это сделать нельзя. 2. Не понимаю, почему не работает строка: Код AS3:
Цитата:
|
на самом деле все верно.
метод removeChild в качестве параметра принимает DisplayObject, а вы ему пытаетесь подсунуть Object, для того чтобы не было ошибки, можете сделать так: Код AS3:
Код AS3:
|
на счет первого вопроса: По сути делать надо именно так и ни как иначе. Для упрощения вы можете написать класс у которого есть метод playAmount(count:uint=1) в которой можно передавать количество проигрываний и делать все действия для проверки внутри этого класса.
|
СлаваRa, вот оно что, спасибо, так работает.
Интересно, а если бы была обратная ситуация, метод хочет Object, а ему суют DisplayObject, то оно прокатило бы? Предполагаю, что должно, ведь DisplayObject ниже по иерархии. maincode, Ясно, значит догадки были верны. Цитата:
Получилось вот так: Основной класс: Код AS3:
Код AS3:
И свойства с методами этого класса все public, что наверное тоже не очень хорошо. Мне пока еще непросто сообразить как межклассовую логику лучше организовать. Хотелось бы поэтому поводу еще два вопроса задать: 1. Можно ли как-то грамотнее второй класс сделать, чтобы условий в Main было еще меньше. А в RepeatCheck побольше. 2. Можно ли вообще сделать радикальный ход: функцию в слушателе cycleListener сделать методом этого отдельного класса? Чтобы все условия с e.currentTarget'ами обрабатывались тоже в отдельном классе? И тогда Main класс содержал бы только свой конструктор, и всё. Я пробовал так зделать, но для моего уровня это сложно, непонятно как в другом классе обращаться со всеми этими свойствами событий. |
на счет второго пункта - я именно так и предполагал, сейчас накидаю пример
Добавлено через 7 минут Можно сделать так: Код AS3:
Код AS3:
Можно еще расширить класс MovieClip добавить в него метод playAmount, и вызывать его напрямую tw1.playAmount(3), но я бы использовал первый вариант. |
maincode, отлично, большое вам спасибо за готовый код.
Проверил у себя, всё работает. Практически всё понятно, кроме некоторых деталей: 1. Как определить, что именно должен расширять класс? Вот у вас Код AS3:
Кстати, сделал Sprite... думал будет ошибка, но нет - всё работает : ) Я думал может быть в случае Sprite не будут работать addEventListener'ы однако все ОК. 2. Зачем отдельная функция stop(); разве это не вызывает конфликта с системной функцией stop()? Как я понимаю, должен быть override в таких случаях, же. Но раз работает, значит не должен, хм. И зачем кстати дублирование идет? То есть идет: Код AS3:
Код AS3:
В принципе если последнюю функцию закоментировать, то всё работает как и раньше. |
Вложений: 1
1) я его расширил от EventDispatcher на автомате, т.к. если бы я писал полноценный класс, я бы сделал еще и отправку собственного события COMPLETE в момент когда закончилось проигрывание анимации. Т.е. что бы иметь возможность вызвать метод dispatchEvent, нужно наследоваться от класса EventDispatcher(или его наследника, или класса реализующего интерфейс IEventDispatcher).
Нет смысла наследоваться от Sprite потому, что класс PlayerMC не является визуальным, т.е. нам не нужно добавлять его на stage методом addChild(...), и поэтому нет смысла расширять его от класса Sprite. Если все таки унаследоваться от класса Sprite - то ошибки не будет, т.к. Sprite является наследником класса EventDispatcher, см внимательно документацию: http://www.flasher.ru/forum/attachme...1&d=1376398062 2) Написал метод stop только ради чистоты кода, что бы класс PlayerMC имел методы не только для начала проигрывания, но и для остановки проигрывания в любой момент из класса Main. Override здесь писать не нужно, потому что класс PlayerMC наследуется от класса EventDispatcher, а этот класс EventDispatcher не имеет метода stop. Вот если бы вы написали PlayerMC extends MovieClip, тогда пришлось бы писать override, т.к. у базового класса есть метод stop() 3) "В обоих одинаковые ремув-листенеры... зачем так?" - это затем, что первый вызывается после окончания проигрывания системой, а метод stop можно вызывать из Main-а что бы принудительно остановить проигрывание в любой момент. Можно было бы написать в обработчике frameHandler вызов метода stop, но это плохая практика, лучше изолировать код который выполняется внутри класса, от методов которые вызываются снаружи. Если очень хочется объединить два одинаковых кода, можно написать еще один private метод stopAnimation: Код AS3:
|
maincode, теперь всё понятно, благодарю за исчерпывающие ответы.
|
Вот еще вопрос, а как в этом фрагменте:
Код AS3:
Казалось бы: Код AS3:
Но как тогда? (Если сделать наследование от MovieClip, то тогда этот же оператор выдает: Цитата:
|
| Часовой пояс GMT +4, время: 10:13. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.