![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 290
|
Изначальные данные такие:
Есть проект, в котором 4 сцены, 1 базовая и 3 дополнительных. Каждая сцена содержит 100 фрэймов. Каждая доп-сцена прокручивается 3 раза и потом идет возврат на базовую. Есть мувиклип (по сути это прогресс-бар), внутри которого написан код для таймера. Экземпляр этого мувиклипа находятся на всех сценах (единое имя для всех сцен!) Этот код запускается только в том случае, если две глобальные переменные (обьявлены в документ-классе как public var) приобретают некоторые значения. Одна из этих переменных end_frame выставляется в 1 в конце каждого фрейма. И казалось бы, после того как любая доп-сцена прокрутилась 1 раз (из трех) таймер должен быть запущен, и мувиклип должен обновится. Однако этого почему-то не происходит... А обновление происходит только после того, как сцена была прокручена ВСЕ 3 РАЗА, и только по выходу из сцены всё срабатывает как нужно. Вопрос такой: можно ли как-то принудительно и в нужное время обновить этот мувиклип, с учетом изменения некоторой внешней глобальной переменной? З.Ы. Подозреваю, что используемый сдесь подход является жутко неоптимальным, но я только начал изучать AS3 и приходится опираться лишь на те области языка, которые получилось хоть немного практически разобрать. Последний раз редактировалось Fogflasher; 05.04.2013 в 16:41. |
|
|||||
|
Не очень понял всю описанную схему, отвечу про то что понял
Вероятно вы путаете понятие глобальной и публичной переменно В AS3 практически нет глобальных переменных Это лишь trace, setTimeot, setInterva, getTimer (Которые на самом деле функции, но и переменными он также являются )Что бы обратиться к публичной переменной нужно иметь инстанс основного класса либо проделать это через DisplayObject метод (или через root) Глобальные переменные реализуются в AS3 через статические свойства Доступ к ним вдлальнейшем можно получить не имея экземпляра класса через конструктор класса MyClass.myVar (Math.random() пример статического метода) Но статическими свойствами пользоваться тоже не очень хорошая практика, в основном используются константы. Обычно для таких целей используют паттерн программирования Singleton - это паттерн которые позволяет иметь только один экземпляр класса и получить к нему доступ из любого участка кода Вообще существет очень мног оспособов реализации синглетона
__________________
... Последний раз редактировалось Александр Мостовой; 05.04.2013 в 17:28. |
|
|||||
|
[+4 06.05.14]
|
Цитата:
Вот что нам говорит вики. Не стоит методы называть переменными, люди не поймут
__________________
Марк Tween |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 290
|
Александр Мостовой, спасибо за примеры, мне такие техники не знакомы.
Я же использую публичные переменные вот таким образом: В DocumentClass использую примерно такой код: package { //здесь различные import.flash.* public class Work1 extends MovieClip { public const STAGE_LOOP:Number = 2; public var k1Value:Number = 0; public var k2Value:Number = 0; } } Впрочем, последний финт я не очень понимаю. Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением... А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из AS2... Но так или иначе, в моем случае проблема не в публичных переменных. Потому что они трэйсируются нормально и значения передают. Грубо говоря, если всё описанное выше можно изложить более просто, примерно вот так: Есть мувиклип, который находится в сцене. Сцена повторяется 3 раза (в конце сцены стоит код gotoAndPlay(1), и на четвертый раз происходит переход в другую (начальную сцену). У этого мувиклипа есть код, в котором находится таймер. Этот таймер, насколько я понимаю, запускается каждый раз когда мувиклип появляется в ключевом кадре (там есть функция start()). И по моим расчетам, после каждого возврата сцены в начало, этот таймер должен запускаться, и клип должен проигрываться. Однако он запускается либо только при входе в сцену. Либо только при выходе из нее. А вот когда идут повторы (последний фрэйм -> первый фрэйм) то этого почему-то не происходит. Последний раз редактировалось Fogflasher; 08.04.2013 в 10:21. |
|
|||||
|
Цитата:
У вас 4 сопсоба получения ссылок на объекты и экземпляр Main класса в том числе. 1. Передавать ссылку на main (или другие объекты) в конструкторе. Этот метод не годится для клипов на сцене, так как в этом случае конструктор запускает сам флеш встроенными методами. А для реализации кода на фреймах флеш создает виртуальные классы, доступа к конструкторам которым у вас нет. 2. Делать метод init(main) публичным и вызвать извне. Это тоже что и 1, но позволяет передать пареметры обхектам выложенным на счене 3. Использовать наивгацию DisplayObject. parent, root - самый неудачный метод т.к. зависит от положения клипа на сцене, применим только для наследников DisplayObject и только для тех кто добавлен на сцену. Анахронизм AS1 4. СИнглетоны и статические методы. На ряду с 1 самый распространенный способ получения ссылок на объекты На счет public var k1Value:Number = 0; Приватные методы и переменные придумали не для того что бы усложнить себе жизнь, а для того что бы освободить себе голову. Старайтесь постепенно уходить от использования публичных переменных, т.к. что бы отследить где и кто ее меняет необходимо держать в голове целый часовой механизм. Если вам она нужна на чтение то лучше поставьте readonly свойстов (getter+ приватная копия с подчеркиваним)
__________________
... |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:28. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|