Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.04.2013, 16:29
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 1  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
По умолчанию Принудительное обновление состояние Мувиклипа

Изначальные данные такие:

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

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

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

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

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

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

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


Последний раз редактировалось Fogflasher; 05.04.2013 в 16:41.
Старый 05.04.2013, 17:12
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 2  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Не очень понял всю описанную схему, отвечу про то что понял
Код 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
Вообще существет очень мног оспособов реализации синглетона
__________________
...


Последний раз редактировалось Александр Мостовой; 05.04.2013 в 17:28.
Старый 05.04.2013, 20:56
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 3  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
(Которые на самом деле функции, но и переменными он также являются )
Переменная (программирование) — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным и изменять значение в ходе выполнения программы.
Вот что нам говорит вики.
Не стоит методы называть переменными, люди не поймут
__________________
Марк Tween

Старый 08.04.2013, 10:01
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 4  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Александр Мостовой, спасибо за примеры, мне такие техники не знакомы.

Я же использую публичные переменные вот таким образом:
В 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()).
И по моим расчетам, после каждого возврата сцены в начало, этот таймер должен запускаться, и клип должен проигрываться.

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


Последний раз редактировалось Fogflasher; 08.04.2013 в 10:21.
Старый 08.04.2013, 10:52
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 5  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Цитата:
Впрочем, последний финт я не очень понимаю.
Потому что, мне казалось, что публичная переменная должна быть видна отовсюду, с прямым обращением...
А вот эта вот рут-строка, похожая на какой-то анахронизм оставшийся из 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, время: 12:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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