Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Принудительное обновление состояние Мувиклипа (http://www.flasher.ru/forum/showthread.php?t=197336)

Fogflasher 05.04.2013 16:29

Принудительное обновление состояние Мувиклипа
 
Изначальные данные такие:

Есть проект, в котором 4 сцены, 1 базовая и 3 дополнительных.
Каждая сцена содержит 100 фрэймов.
Каждая доп-сцена прокручивается 3 раза и потом идет возврат на базовую.

Есть мувиклип (по сути это прогресс-бар), внутри которого написан код для таймера.
Экземпляр этого мувиклипа находятся на всех сценах (единое имя для всех сцен!)

Этот код запускается только в том случае, если две глобальные переменные (обьявлены в документ-классе как public var) приобретают некоторые значения. Одна из этих переменных end_frame выставляется в 1 в конце каждого фрейма.

И казалось бы, после того как любая доп-сцена прокрутилась 1 раз (из трех) таймер должен быть запущен, и мувиклип должен обновится. Однако этого почему-то не происходит...

А обновление происходит только после того, как сцена была прокручена ВСЕ 3 РАЗА, и только по выходу из сцены всё срабатывает как нужно.

Вопрос такой: можно ли как-то принудительно и в нужное время обновить этот мувиклип, с учетом изменения некоторой внешней глобальной переменной?

З.Ы. Подозреваю, что используемый сдесь подход является жутко неоптимальным, но я только начал изучать AS3 и приходится опираться лишь на те области языка, которые получилось хоть немного практически разобрать.

Александр Мостовой 05.04.2013 17:12

Не очень понял всю описанную схему, отвечу про то что понял
Код AS3:

(обьявлены в документ-классе как public var)

Вероятно вы путаете понятие глобальной и публичной переменно
В AS3 практически нет глобальных переменных
Это лишь trace, setTimeot, setInterva, getTimer
(Которые на самом деле функции, но и переменными он также являются :) )

Что бы обратиться к публичной переменной нужно иметь инстанс основного класса либо проделать это через DisplayObject метод

Код AS3:

var main:Main = parent.parent.parent as Main;
if (main.end_frame == ...)

(или через root)


Глобальные переменные реализуются в AS3 через статические свойства
Код AS3:

public static var myVar:Number

Доступ к ним вдлальнейшем можно получить не имея экземпляра класса через конструктор класса MyClass.myVar
(Math.random() пример статического метода)

Но статическими свойствами пользоваться тоже не очень хорошая практика, в основном используются константы.
Обычно для таких целей используют паттерн программирования Singleton - это паттерн которые позволяет иметь только один экземпляр класса и получить к нему доступ из любого участка кода

Код AS3:

var config:Config = Config.instance;
config.myVar ...
//instance - где инстанс статическое свойство ссылающийся на единственный экземаляр класса конфиг. (т.е. в конструкторе класса Confis стоит instance = this

Вообще существет очень мног оспособов реализации синглетона

in4core 05.04.2013 20:56

Цитата:

(Которые на самом деле функции, но и переменными он также являются )
Переменная (программирование) — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным и изменять значение в ходе выполнения программы.
Вот что нам говорит вики.
Не стоит методы называть переменными, люди не поймут

Fogflasher 08.04.2013 10:01

Александр Мостовой, спасибо за примеры, мне такие техники не знакомы.

Я же использую публичные переменные вот таким образом:
В DocumentClass использую примерно такой код:

Код AS3:

package
{
 
//здесь различные import.flash.*
 
public class Work1 extends MovieClip
 
 {
 
  public const STAGE_LOOP:Number = 2;
 
  public var k1Value:Number = 0;
  public var k2Value:Number = 0;
 }
}

И если к ним нужно обратится из таймлайна мувиклипа, то я использую такой трюк:

Код AS3:

var _root1 = MovieClip(root);
_root1.k1Value = 10

Впрочем, последний финт я не очень понимаю.
Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением...
А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из AS2...

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

Грубо говоря, если всё описанное выше можно изложить более просто, примерно вот так:

Есть мувиклип, который находится в сцене. Сцена повторяется 3 раза (в конце сцены стоит код gotoAndPlay(1), и на четвертый раз происходит переход в другую (начальную сцену).

У этого мувиклипа есть код, в котором находится таймер. Этот таймер, насколько я понимаю, запускается каждый раз когда мувиклип появляется в ключевом кадре (там есть функция start()).
И по моим расчетам, после каждого возврата сцены в начало, этот таймер должен запускаться, и клип должен проигрываться.

Однако он запускается либо только при входе в сцену. Либо только при выходе из нее.
А вот когда идут повторы (последний фрэйм -> первый фрэйм) то этого почему-то не происходит.

Александр Мостовой 08.04.2013 10:52

Цитата:

Впрочем, последний финт я не очень понимаю.
Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением...
А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из AS2...
Свойство то и остается публичным, но вот вот ссылки на экземаляр класса у вас просто нет, для ее получения и используется рут, что, безусловно, есть анахронизм AS1.

У вас 4 сопсоба получения ссылок на объекты и экземпляр Main класса в том числе.
1. Передавать ссылку на main (или другие объекты) в конструкторе.
Код AS3:

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+ приватная копия с подчеркиваним)


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

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