Просмотр полной версии : Принудительное обновление состояние Мувиклипа
Fogflasher
05.04.2013, 16:29
Изначальные данные такие:
Есть проект, в котором 4 сцены, 1 базовая и 3 дополнительных.
Каждая сцена содержит 100 фрэймов.
Каждая доп-сцена прокручивается 3 раза и потом идет возврат на базовую.
Есть мувиклип (по сути это прогресс-бар), внутри которого написан код для таймера.
Экземпляр этого мувиклипа находятся на всех сценах (единое имя для всех сцен!)
Этот код запускается только в том случае, если две глобальные переменные (обьявлены в документ-классе как public var) приобретают некоторые значения. Одна из этих переменных end_frame выставляется в 1 в конце каждого фрейма.
И казалось бы, после того как любая доп-сцена прокрутилась 1 раз (из трех) таймер должен быть запущен, и мувиклип должен обновится. Однако этого почему-то не происходит...
А обновление происходит только после того, как сцена была прокручена ВСЕ 3 РАЗА, и только по выходу из сцены всё срабатывает как нужно.
Вопрос такой: можно ли как-то принудительно и в нужное время обновить этот мувиклип, с учетом изменения некоторой внешней глобальной переменной?
З.Ы. Подозреваю, что используемый сдесь подход является жутко неоптимальным, но я только начал изучать AS3 и приходится опираться лишь на те области языка, которые получилось хоть немного практически разобрать.
Александр Мостовой
05.04.2013, 17:12
Не очень понял всю описанную схему, отвечу про то что понял
(обьявлены в документ-классе как public var)
Вероятно вы путаете понятие глобальной и публичной переменно
В AS3 практически нет глобальных переменных
Это лишь trace, setTimeot, setInterva, getTimer
(Которые на самом деле функции, но и переменными он также являются :) )
Что бы обратиться к публичной переменной нужно иметь инстанс основного класса либо проделать это через DisplayObject метод
var main:Main = parent.parent.parent as Main;
if (main.end_frame == ...)
(или через root)
Глобальные переменные реализуются в AS3 через статические свойства
public static var myVar:Number
Доступ к ним вдлальнейшем можно получить не имея экземпляра класса через конструктор класса MyClass.myVar
(Math.random() пример статического метода)
Но статическими свойствами пользоваться тоже не очень хорошая практика, в основном используются константы.
Обычно для таких целей используют паттерн программирования Singleton - это паттерн которые позволяет иметь только один экземпляр класса и получить к нему доступ из любого участка кода
var config:Config = Config.instance;
config.myVar ...
//instance - где инстанс статическое свойство ссылающийся на единственный экземаляр класса конфиг. (т.е. в конструкторе класса Confis стоит instance = this
Вообще существет очень мног оспособов реализации синглетона
(Которые на самом деле функции, но и переменными он также являются )
Переменная (программирование) — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным и изменять значение в ходе выполнения программы.
Вот что нам говорит вики.
Не стоит методы называть переменными, люди не поймут
Fogflasher
08.04.2013, 10:01
Александр Мостовой, спасибо за примеры, мне такие техники не знакомы.
Я же использую публичные переменные вот таким образом:
В 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;
}
}
И если к ним нужно обратится из таймлайна мувиклипа, то я использую такой трюк:
var _root1 = MovieClip(root);
_root1.k1Value = 10
Впрочем, последний финт я не очень понимаю.
Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением...
А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из AS2...
Но так или иначе, в моем случае проблема не в публичных переменных.
Потому что они трэйсируются нормально и значения передают.
Грубо говоря, если всё описанное выше можно изложить более просто, примерно вот так:
Есть мувиклип, который находится в сцене. Сцена повторяется 3 раза (в конце сцены стоит код gotoAndPlay(1), и на четвертый раз происходит переход в другую (начальную сцену).
У этого мувиклипа есть код, в котором находится таймер. Этот таймер, насколько я понимаю, запускается каждый раз когда мувиклип появляется в ключевом кадре (там есть функция start()).
И по моим расчетам, после каждого возврата сцены в начало, этот таймер должен запускаться, и клип должен проигрываться.
Однако он запускается либо только при входе в сцену. Либо только при выходе из нее.
А вот когда идут повторы (последний фрэйм -> первый фрэйм) то этого почему-то не происходит.
Александр Мостовой
08.04.2013, 10:52
Впрочем, последний финт я не очень понимаю.
Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением...
А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из AS2...
Свойство то и остается публичным, но вот вот ссылки на экземаляр класса у вас просто нет, для ее получения и используется рут, что, безусловно, есть анахронизм AS1.
У вас 4 сопсоба получения ссылок на объекты и экземпляр Main класса в том числе.
1. Передавать ссылку на main (или другие объекты) в конструкторе.
var myInnstance:MyClass = new MyClass(main);
Этот метод не годится для клипов на сцене, так как в этом случае конструктор запускает сам флеш встроенными методами. А для реализации кода на фреймах флеш создает виртуальные классы, доступа к конструкторам которым у вас нет.
2. Делать метод init(main) публичным и вызвать извне. Это тоже что и 1, но позволяет передать пареметры обхектам выложенным на счене
3. Использовать наивгацию DisplayObject. parent, root - самый неудачный метод т.к. зависит от положения клипа на сцене, применим только для наследников DisplayObject и только для тех кто добавлен на сцену. Анахронизм AS1
4. СИнглетоны и статические методы. На ряду с 1 самый распространенный способ получения ссылок на объекты
На счет public var k1Value:Number = 0;
Приватные методы и переменные придумали не для того что бы усложнить себе жизнь, а для того что бы освободить себе голову. Старайтесь постепенно уходить от использования публичных переменных, т.к. что бы отследить где и кто ее меняет необходимо держать в голове целый часовой механизм. Если вам она нужна на чтение то лучше поставьте readonly свойстов (getter+ приватная копия с подчеркиваним)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.